OSDN Git Service

stdio: add support for "e" flag with fopen()
authorMike Frysinger <vapier@gentoo.org>
Tue, 19 Jul 2011 20:05:52 +0000 (16:05 -0400)
committerMike Frysinger <vapier@gentoo.org>
Sun, 20 Nov 2011 07:47:50 +0000 (02:47 -0500)
Support this useful glibc extension for optionally setting O_CLOEXEC
on fopen streams.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
extra/Configs/Config.in
libc/stdio/_fopen.c

index 0f0ccfe..97aafb7 100644 (file)
@@ -1722,6 +1722,15 @@ config UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE
 
          Most people will answer N.
 
+config UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE
+       bool "Support an fopen() 'e' flag for close-on-exec mode (glibc-compat)"
+       help
+         Answer Y to support a glibc extension to allow passing
+         additional 'e' flag in the mode string for fopen() to specify that
+         the file should be open()ed with the O_CLOEXEC flag set.
+
+         Most people will answer N.
+
 config UCLIBC_HAS_GLIBC_CUSTOM_STREAMS
        bool "Support fmemopen(), open_memstream(), and fopencookie() (glibc-compat)"
        help
index 2db27a8..5bc61cf 100644 (file)
@@ -69,7 +69,8 @@ FILE attribute_hidden *_stdio_fopen(intptr_t fname_or_mode,
 #warning CONSIDER: Implement glibc mmap option for readonly files?
 #warning CONSIDER: Implement a text mode using custom read/write funcs?
 #endif
-#if defined(__UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE__) || defined(__UCLIBC_HAS_FOPEN_LARGEFILE_MODE__)
+#if defined(__UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE__) || defined(__UCLIBC_HAS_FOPEN_LARGEFILE_MODE__) || \
+    defined(__UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE__)
 
        while (*++mode) {
 # ifdef __UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE__
@@ -84,6 +85,12 @@ FILE attribute_hidden *_stdio_fopen(intptr_t fname_or_mode,
                        continue;
                }
 # endif
+# ifdef __UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE__
+               if (*mode == 'e') {             /* Close on exec (a glibc extension). */
+                       open_mode |= O_CLOEXEC;
+                       continue;
+               }
+# endif
        }
 
 #endif