From b8f1f91cc6d7b579fdb2370ab046565f9930aa09 Mon Sep 17 00:00:00 2001
From: Mike Frysinger <vapier@gentoo.org>
Date: Wed, 7 Oct 2009 22:51:55 -0400
Subject: clean up O_CLOEXEC handling

Drop the "#ifndef O_CLOEXEC" cruft, enable O_CLOEXEC in most fcntl.h
headers, and import __ASSUME_O_CLOEXEC from glibc.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
 libc/misc/dirent/opendir.c                       |  8 +++-----
 libc/misc/utmp/utent.c                           | 21 ++++-----------------
 libc/pwd_grp/lckpwdf.c                           |  8 +++-----
 libc/sysdeps/linux/alpha/bits/fcntl.h            |  2 --
 libc/sysdeps/linux/arm/bits/fcntl.h              |  2 --
 libc/sysdeps/linux/avr32/bits/fcntl.h            |  1 +
 libc/sysdeps/linux/bfin/bits/fcntl.h             |  2 ++
 libc/sysdeps/linux/common/bits/kernel-features.h |  8 ++++++++
 libc/sysdeps/linux/cris/bits/fcntl.h             |  1 +
 libc/sysdeps/linux/frv/bits/fcntl.h              |  2 ++
 libc/sysdeps/linux/hppa/bits/fcntl.h             |  1 +
 libc/sysdeps/linux/i386/bits/fcntl.h             |  2 --
 libc/sysdeps/linux/ia64/bits/fcntl.h             |  2 --
 libc/sysdeps/linux/m68k/bits/fcntl.h             |  1 +
 libc/sysdeps/linux/microblaze/bits/fcntl.h       |  2 ++
 libc/sysdeps/linux/mips/bits/fcntl.h             |  1 +
 libc/sysdeps/linux/powerpc/bits/fcntl.h          |  2 --
 libc/sysdeps/linux/sh/bits/fcntl.h               |  2 --
 libc/sysdeps/linux/sh64/bits/fcntl.h             |  2 ++
 libc/sysdeps/linux/sparc/bits/fcntl.h            |  2 --
 libc/sysdeps/linux/x86_64/bits/fcntl.h           |  2 --
 libc/sysdeps/linux/xtensa/bits/fcntl.h           |  1 +
 22 files changed, 32 insertions(+), 43 deletions(-)

(limited to 'libc')

diff --git a/libc/misc/dirent/opendir.c b/libc/misc/dirent/opendir.c
index e85dd3003..b43f60814 100644
--- a/libc/misc/dirent/opendir.c
+++ b/libc/misc/dirent/opendir.c
@@ -80,9 +80,6 @@ DIR *opendir(const char *name)
 		return NULL;
 	}
 # define O_DIRECTORY 0
-#endif
-#ifndef O_CLOEXEC
-# define O_CLOEXEC 0
 #endif
 	fd = open(name, O_RDONLY|O_NDELAY|O_DIRECTORY|O_CLOEXEC);
 	if (fd < 0)
@@ -104,8 +101,9 @@ DIR *opendir(const char *name)
 	/* According to POSIX, directory streams should be closed when
 	 * exec. From "Anna Pluzhnikov" <besp@midway.uchicago.edu>.
 	 */
-	if (O_CLOEXEC == 0)
-		fcntl(fd, F_SETFD, FD_CLOEXEC);
+#ifndef __ASSUME_O_CLOEXEC
+	fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
 
 	ptr = fd_to_DIR(fd, statbuf.st_blksize);
 	if (!ptr) {
diff --git a/libc/misc/utmp/utent.c b/libc/misc/utmp/utent.c
index beb00591c..336c0239b 100644
--- a/libc/misc/utmp/utent.c
+++ b/libc/misc/utmp/utent.c
@@ -34,9 +34,6 @@ static const char *static_ut_name = default_file_name;
 static void __setutent(void)
 {
     if (static_fd < 0) {
-#ifndef O_CLOEXEC
-# define O_CLOEXEC 0
-#endif
 	static_fd = open(static_ut_name, O_RDWR | O_CLOEXEC);
 	if (static_fd < 0) {
 	    static_fd = open(static_ut_name, O_RDONLY | O_CLOEXEC);
@@ -44,20 +41,10 @@ static void __setutent(void)
 		return; /* static_fd remains < 0 */
 	    }
 	}
-	if (O_CLOEXEC == 0) {
-	    /* Make sure the file will be closed on exec()  */
-	    fcntl(static_fd, F_SETFD, FD_CLOEXEC);
-	    /* thus far, {G,S}ETFD only has this single flag,
-	     * and setting it never fails.
-	     *int ret = fcntl(static_fd, F_GETFD, 0);
-	     *if (ret >= 0) {
-	     *    ret = fcntl(static_fd, F_SETFD, ret | FD_CLOEXEC);
-	     *}
-	     *if (ret < 0) {
-	     *    static_fd = -1;
-	     *}
-             */
-	}
+#ifndef __ASSUME_O_CLOEXEC
+	/* Make sure the file will be closed on exec()  */
+	fcntl(static_fd, F_SETFD, FD_CLOEXEC);
+#endif
 	return;
     }
     lseek(static_fd, 0, SEEK_SET);
diff --git a/libc/pwd_grp/lckpwdf.c b/libc/pwd_grp/lckpwdf.c
index d9776ed2c..e02cab6ad 100644
--- a/libc/pwd_grp/lckpwdf.c
+++ b/libc/pwd_grp/lckpwdf.c
@@ -59,16 +59,14 @@ lckpwdf (void)
   /* Prevent problems caused by multiple threads.  */
   __UCLIBC_MUTEX_LOCK(mylock);
 
-#ifndef O_CLOEXEC
-# define O_CLOEXEC 0
-#endif
   lock_fd = open (_PATH_PASSWD, O_WRONLY | O_CLOEXEC);
   if (lock_fd == -1) {
     goto DONE;
   }
+#ifndef __ASSUME_O_CLOEXEC
   /* Make sure file gets correctly closed when process finished.  */
-  if (O_CLOEXEC == 0)
-    fcntl (lock_fd, F_SETFD, FD_CLOEXEC);
+  fcntl (lock_fd, F_SETFD, FD_CLOEXEC);
+#endif
 
   /* Now we have to get exclusive write access.  Since multiple
      process could try this we won't stop when it first fails.
diff --git a/libc/sysdeps/linux/alpha/bits/fcntl.h b/libc/sysdeps/linux/alpha/bits/fcntl.h
index 2a6b9eadc..649c5633e 100644
--- a/libc/sysdeps/linux/alpha/bits/fcntl.h
+++ b/libc/sysdeps/linux/alpha/bits/fcntl.h
@@ -50,9 +50,7 @@
 # define O_NOFOLLOW	0200000	/* Do not follow links.  */
 # define O_DIRECT	02000000 /* Direct disk access.  */
 # define O_NOATIME	04000000 /* Do not set atime.  */
-# if 0
 # define O_CLOEXEC      010000000 /* Set close_on_exec.  */
-# endif
 #endif
 
 #ifdef __USE_LARGEFILE64
diff --git a/libc/sysdeps/linux/arm/bits/fcntl.h b/libc/sysdeps/linux/arm/bits/fcntl.h
index 86cea4b7f..7cc5a9dc0 100644
--- a/libc/sysdeps/linux/arm/bits/fcntl.h
+++ b/libc/sysdeps/linux/arm/bits/fcntl.h
@@ -50,9 +50,7 @@
 # define O_NOFOLLOW	0100000	/* Do not follow links.	 */
 # define O_DIRECT	0200000	/* Direct disk access.	*/
 # define O_NOATIME     01000000 /* Do not set atime.  */
-# if 0
 # define O_CLOEXEC     02000000 /* Set close_on_exec.  */
-# endif
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/avr32/bits/fcntl.h b/libc/sysdeps/linux/avr32/bits/fcntl.h
index 2301e2241..767243ee5 100644
--- a/libc/sysdeps/linux/avr32/bits/fcntl.h
+++ b/libc/sysdeps/linux/avr32/bits/fcntl.h
@@ -30,6 +30,7 @@
 # define O_DIRECTORY	00200000	/* direct disk access */
 # define O_NOFOLLOW	00400000	/* don't follow links */
 # define O_NOATIME	01000000	/* don't set atime */
+# define O_CLOEXEC	02000000	/* set close_on_exec */
 #endif
 
 #ifdef __USE_LARGEFILE64
diff --git a/libc/sysdeps/linux/bfin/bits/fcntl.h b/libc/sysdeps/linux/bfin/bits/fcntl.h
index 7d0bcf946..f019b71d3 100644
--- a/libc/sysdeps/linux/bfin/bits/fcntl.h
+++ b/libc/sysdeps/linux/bfin/bits/fcntl.h
@@ -48,6 +48,8 @@
 # define O_DIRECTORY	 040000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0100000	/* Do not follow links.	 */
 # define O_DIRECT	0200000	/* Direct disk access.	*/
+# define O_NOATIME	01000000	/* don't set atime */
+# define O_CLOEXEC	02000000	/* set close_on_exec */
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/common/bits/kernel-features.h b/libc/sysdeps/linux/common/bits/kernel-features.h
index 5216d7bed..88297349a 100644
--- a/libc/sysdeps/linux/common/bits/kernel-features.h
+++ b/libc/sysdeps/linux/common/bits/kernel-features.h
@@ -70,6 +70,14 @@
 # define __ASSUME_GETDENTS32_D_TYPE 1
 #endif
 
+/* Support for various CLOEXEC and NONBLOCK flags was added for x86,
+   x86-64, PPC, IA-64, SPARC< and S390 in 2.6.23.  */
+#if __LINUX_KERNEL_VERSION >= 0x020617 \
+    && (defined __i386__ || defined __x86_64__ || defined __powerpc__ \
+	|| defined __ia64__ || defined __sparc__ || defined __s390__)
+# define __ASSUME_O_CLOEXEC 1
+#endif
+
 /* These features were surely available with 2.4.12.  */
 #if __LINUX_KERNEL_VERSION >= 132108 && defined __mc68000__
 # define __ASSUME_MMAP2_SYSCALL		1
diff --git a/libc/sysdeps/linux/cris/bits/fcntl.h b/libc/sysdeps/linux/cris/bits/fcntl.h
index a2106ef9a..29443ba01 100644
--- a/libc/sysdeps/linux/cris/bits/fcntl.h
+++ b/libc/sysdeps/linux/cris/bits/fcntl.h
@@ -50,6 +50,7 @@
 # define O_DIRECTORY	0200000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0400000	/* Do not follow links.	 */
 # define O_NOATIME	01000000 /* Do not set atime.  */
+# define O_CLOEXEC	02000000 /* set close_on_exec */
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/frv/bits/fcntl.h b/libc/sysdeps/linux/frv/bits/fcntl.h
index 06e886009..d437175ca 100644
--- a/libc/sysdeps/linux/frv/bits/fcntl.h
+++ b/libc/sysdeps/linux/frv/bits/fcntl.h
@@ -45,6 +45,8 @@
 # define O_DIRECT	 040000	/* Direct disk access.  */
 # define O_DIRECTORY	0200000	/* Must be a directory.  */
 # define O_NOFOLLOW	0400000	/* Do not follow links.  */
+# define O_NOATIME	01000000 /* don't set atime */
+# define O_CLOEXEC	02000000 /* set close_on_exec */
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/hppa/bits/fcntl.h b/libc/sysdeps/linux/hppa/bits/fcntl.h
index cc23bf81b..86e3b6f4a 100644
--- a/libc/sysdeps/linux/hppa/bits/fcntl.h
+++ b/libc/sysdeps/linux/hppa/bits/fcntl.h
@@ -50,6 +50,7 @@
 # define O_DIRECTORY	00010000 /* Must be a directory. */
 # define O_NOFOLLOW	00000200 /* Do not follow links. */
 # define O_NOATIME	04000000 /* Do not set atime. */
+# define O_CLOEXEC	010000000 /* set close_on_exec */
 #endif
 
 #ifdef __USE_LARGEFILE64
diff --git a/libc/sysdeps/linux/i386/bits/fcntl.h b/libc/sysdeps/linux/i386/bits/fcntl.h
index 7f0b552fd..22e073bb1 100644
--- a/libc/sysdeps/linux/i386/bits/fcntl.h
+++ b/libc/sysdeps/linux/i386/bits/fcntl.h
@@ -50,9 +50,7 @@
 # define O_DIRECTORY	0200000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0400000	/* Do not follow links.	 */
 # define O_NOATIME     01000000 /* Do not set atime.  */
-# if 0
 # define O_CLOEXEC     02000000 /* Set close_on_exec.  */
-# endif
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/ia64/bits/fcntl.h b/libc/sysdeps/linux/ia64/bits/fcntl.h
index d134c4b4f..85a55f6a7 100644
--- a/libc/sysdeps/linux/ia64/bits/fcntl.h
+++ b/libc/sysdeps/linux/ia64/bits/fcntl.h
@@ -49,9 +49,7 @@
 # define O_DIRECTORY	0200000	/* must be a directory */
 # define O_NOFOLLOW	0400000 /* don't follow links */
 # define O_NOATIME	01000000 /* Do not set atime.  */
-# if 0
 # define O_CLOEXEC	02000000 /* Set close_on_exec.  */
-# endif
 #endif
 
 #ifdef __USE_LARGEFILE64
diff --git a/libc/sysdeps/linux/m68k/bits/fcntl.h b/libc/sysdeps/linux/m68k/bits/fcntl.h
index d36198d7a..e564b4217 100644
--- a/libc/sysdeps/linux/m68k/bits/fcntl.h
+++ b/libc/sysdeps/linux/m68k/bits/fcntl.h
@@ -49,6 +49,7 @@
 # define O_NOFOLLOW	0100000	/* Do not follow links.	 */
 # define O_DIRECT	0200000	/* Direct disk access.	*/
 # define O_NOATIME	01000000 /* Do not set atime.  */
+# define O_CLOEXEC	02000000 /* set close_on_exec */
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/microblaze/bits/fcntl.h b/libc/sysdeps/linux/microblaze/bits/fcntl.h
index c8aeb919a..bb6727ad8 100644
--- a/libc/sysdeps/linux/microblaze/bits/fcntl.h
+++ b/libc/sysdeps/linux/microblaze/bits/fcntl.h
@@ -45,6 +45,8 @@
 # define O_DIRECTORY	 040000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0100000	/* Do not follow links.	 */
 # define O_DIRECT	0200000	/* Direct disk access.	*/
+# define O_NOATIME	01000000 /* Do not set atime.  */
+# define O_CLOEXEC	02000000 /* set close_on_exec */
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/mips/bits/fcntl.h b/libc/sysdeps/linux/mips/bits/fcntl.h
index ef015a4b0..f0072fd77 100644
--- a/libc/sysdeps/linux/mips/bits/fcntl.h
+++ b/libc/sysdeps/linux/mips/bits/fcntl.h
@@ -51,6 +51,7 @@
 # define O_DIRECT	0x8000	/* Direct disk access hint.  */
 # define O_DIRECTORY	0x10000	/* Must be a directory.	 */
 # define O_NOATIME	0x40000	/* Do not set atime.  */
+# define O_CLOEXEC	02000000 /* set close_on_exec */
 #endif
 
 /* For now Linux has no synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/powerpc/bits/fcntl.h b/libc/sysdeps/linux/powerpc/bits/fcntl.h
index ceb75b4f1..0759c6a71 100644
--- a/libc/sysdeps/linux/powerpc/bits/fcntl.h
+++ b/libc/sysdeps/linux/powerpc/bits/fcntl.h
@@ -50,9 +50,7 @@
 # define O_DIRECTORY	 040000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0100000	/* Do not follow links.	 */
 # define O_NOATIME	01000000 /* Do not set atime.  */
-# if 0
 # define O_CLOEXEC	02000000 /* Set close_on_exec.  */
-# endif
 #endif
 
 #ifdef __USE_LARGEFILE64
diff --git a/libc/sysdeps/linux/sh/bits/fcntl.h b/libc/sysdeps/linux/sh/bits/fcntl.h
index 570484c2f..adb737766 100644
--- a/libc/sysdeps/linux/sh/bits/fcntl.h
+++ b/libc/sysdeps/linux/sh/bits/fcntl.h
@@ -50,9 +50,7 @@
 # define O_DIRECTORY	0200000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0400000	/* Do not follow links.	 */
 # define O_NOATIME     01000000 /* Do not set atime.  */
-# if 0
 # define O_CLOEXEC     02000000 /* Set close_on_exec.  */
-# endif
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/sh64/bits/fcntl.h b/libc/sysdeps/linux/sh64/bits/fcntl.h
index 06e886009..156df9752 100644
--- a/libc/sysdeps/linux/sh64/bits/fcntl.h
+++ b/libc/sysdeps/linux/sh64/bits/fcntl.h
@@ -45,6 +45,8 @@
 # define O_DIRECT	 040000	/* Direct disk access.  */
 # define O_DIRECTORY	0200000	/* Must be a directory.  */
 # define O_NOFOLLOW	0400000	/* Do not follow links.  */
+# define O_NOATIME	01000000 /* Do not set atime.  */
+# define O_CLOEXEC	02000000 /* set close_on_exec */
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/sparc/bits/fcntl.h b/libc/sysdeps/linux/sparc/bits/fcntl.h
index 29c09a957..31a6d9bda 100644
--- a/libc/sysdeps/linux/sparc/bits/fcntl.h
+++ b/libc/sysdeps/linux/sparc/bits/fcntl.h
@@ -49,9 +49,7 @@
 # define O_NOFOLLOW	0x20000 /* don't follow links */
 # define O_DIRECT	0x100000 /* direct disk access hint */
 # define O_NOATIME	0x200000 /* Do not set atime.  */
-# if 0
 # define O_CLOEXEC	0x400000 /* Set close_on_exit.  */
-# endif
 #endif
 
 #ifdef __USE_LARGEFILE64
diff --git a/libc/sysdeps/linux/x86_64/bits/fcntl.h b/libc/sysdeps/linux/x86_64/bits/fcntl.h
index be00e4ac7..f1cf38866 100644
--- a/libc/sysdeps/linux/x86_64/bits/fcntl.h
+++ b/libc/sysdeps/linux/x86_64/bits/fcntl.h
@@ -50,9 +50,7 @@
 # define O_DIRECTORY	0200000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0400000	/* Do not follow links.	 */
 # define O_NOATIME     01000000 /* Do not set atime.  */
-# if 0
 # define O_CLOEXEC     02000000 /* Set close_on_exec.  */
-# endif
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
diff --git a/libc/sysdeps/linux/xtensa/bits/fcntl.h b/libc/sysdeps/linux/xtensa/bits/fcntl.h
index a89362e46..921a62679 100644
--- a/libc/sysdeps/linux/xtensa/bits/fcntl.h
+++ b/libc/sysdeps/linux/xtensa/bits/fcntl.h
@@ -50,6 +50,7 @@
 # define O_DIRECTORY	0200000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0400000	/* Do not follow links.	 */
 # define O_NOATIME     01000000 /* Do not set atime.  */
+# define O_CLOEXEC     02000000 /* set close_on_exec */
 #endif
 
 /* For now Linux has synchronisity options for data and read operations.
-- 
cgit v1.2.3