[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[commits] r7444 - in /fsf/trunk/libc: ChangeLog login/utmp_file.c
- To: commits@xxxxxxxxxx
- Subject: [commits] r7444 - in /fsf/trunk/libc: ChangeLog login/utmp_file.c
- From: eglibc@xxxxxxxxxx
- Date: Sun, 30 Nov 2008 08:01:51 -0000
Author: eglibc
Date: Sun Nov 30 00:01:51 2008
New Revision: 7444
Log:
Import glibc-mainline for 2008-11-30
Modified:
fsf/trunk/libc/ChangeLog
fsf/trunk/libc/login/utmp_file.c
Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Sun Nov 30 00:01:51 2008
@@ -1,3 +1,10 @@
+2008-11-29 Ulrich Drepper <drepper@xxxxxxxxxx>
+
+ * login/utmp_file.c (file_writable): New variable.
+ (setutent_file): Don't try to open file for writing.
+ (pututline_file): Before writing, make descriptor writable if
+ necessary.
+
2008-11-26 Ulrich Drepper <drepper@xxxxxxxxxx>
* sysdeps/posix/getaddrinfo.c (getaddrinfo): Only restrict search
Modified: fsf/trunk/libc/login/utmp_file.c
==============================================================================
--- fsf/trunk/libc/login/utmp_file.c (original)
+++ fsf/trunk/libc/login/utmp_file.c Sun Nov 30 00:01:51 2008
@@ -36,6 +36,7 @@
/* Descriptor for the file and position. */
static int file_fd = -1;
+static bool file_writable;
static off64_t file_offset;
/* Cache for the last read entry. */
@@ -138,7 +139,6 @@
if (file_fd < 0)
{
const char *file_name;
- int result;
file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name);
@@ -147,14 +147,10 @@
#else
# define O_flags O_LARGEFILE
#endif
- file_fd = open_not_cancel_2 (file_name, O_RDWR | O_flags);
+ file_writable = false;
+ file_fd = open_not_cancel_2 (file_name, O_RDONLY | O_flags);
if (file_fd == -1)
- {
- /* Hhm, read-write access did not work. Try read-only. */
- file_fd = open_not_cancel_2 (file_name, O_RDONLY | O_flags);
- if (file_fd == -1)
- return 0;
- }
+ return 0;
#ifndef __ASSUME_O_CLOEXEC
# ifdef O_CLOEXEC
@@ -162,7 +158,7 @@
# endif
{
/* We have to make sure the file is `closed on exec'. */
- result = fcntl_not_cancel (file_fd, F_GETFD, 0);
+ int result = fcntl_not_cancel (file_fd, F_GETFD, 0);
if (result >= 0)
{
# ifdef O_CLOEXEC
@@ -403,6 +399,52 @@
int found;
assert (file_fd >= 0);
+
+ if (! file_writable)
+ {
+ /* We must make the file descriptor writable before going on. */
+ const char *file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name);
+
+ int new_fd = open_not_cancel_2 (file_name, O_RDWR | O_flags);
+ if (new_fd == -1)
+ return NULL;
+
+#ifndef __ASSUME_O_CLOEXEC
+# ifdef O_CLOEXEC
+ if (__have_o_cloexec <= 0)
+# endif
+ {
+ /* We have to make sure the file is `closed on exec'. */
+ int result = fcntl_not_cancel (file_fd, F_GETFD, 0);
+ if (result >= 0)
+ {
+# ifdef O_CLOEXEC
+ if (__have_o_cloexec == 0)
+ __have_o_cloexec = (result & FD_CLOEXEC) ? 1 : -1;
+
+ if (__have_o_cloexec < 0)
+# endif
+ result = fcntl_not_cancel (file_fd, F_SETFD,
+ result | FD_CLOEXEC);
+ }
+
+ if (result == -1)
+ {
+ close_not_cancel_no_status (file_fd);
+ return NULL;
+ }
+ }
+#endif
+
+ if (__lseek64 (new_fd, __lseek64 (file_fd, 0, SEEK_CUR), SEEK_SET) == -1
+ || dup2 (new_fd, file_fd) < 0)
+ {
+ close_not_cancel_no_status (new_fd);
+ return NULL;
+ }
+ close_not_cancel_no_status (new_fd);
+ file_writable = true;
+ }
/* Find the correct place to insert the data. */
if (file_offset > 0