Browse Source

stdio: add support for "e" flag with fopen()

Support this useful glibc extension for optionally setting O_CLOEXEC
on fopen streams.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Mike Frysinger 13 years ago
parent
commit
117a32a63b
2 changed files with 17 additions and 1 deletions
  1. 9 0
      extra/Configs/Config.in
  2. 8 1
      libc/stdio/_fopen.c

+ 9 - 0
extra/Configs/Config.in

@@ -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

+ 8 - 1
libc/stdio/_fopen.c

@@ -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__
@@ -83,6 +84,12 @@ FILE attribute_hidden *_stdio_fopen(intptr_t fname_or_mode,
 			open_mode |= O_LARGEFILE;
 			continue;
 		}
+# endif
+# ifdef __UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE__
+		if (*mode == 'e') {		/* Close on exec (a glibc extension). */
+			open_mode |= O_CLOEXEC;
+			continue;
+		}
 # endif
  	}