Mercurial > hg > octave-nkf > gnulib-hg
changeset 11860:c41f4ce30e36
popen-safer: test O_CLOEXEC at run-time.
* lib/popen-safer.c: Test O_CLOEXEC at run-time.
author | Paolo Bonzini <bonzini@gnu.org> |
---|---|
date | Fri, 21 Aug 2009 09:36:14 +0200 |
parents | 27f6d88f60b1 |
children | f455bec0d65f |
files | ChangeLog lib/popen-safer.c |
diffstat | 2 files changed, 21 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-08-21 Paolo Bonzini <bonzini@gnu.org> + + popen-safer: test O_CLOEXEC at run-time. + * lib/popen-safer.c: Test O_CLOEXEC at run-time. + 2009-08-21 Paolo Bonzini <bonzini@gnu.org> fcntl: move more flags to the header
--- a/lib/popen-safer.c +++ b/lib/popen-safer.c @@ -27,18 +27,28 @@ #include "cloexec.h" -#ifndef O_CLOEXEC -# define O_CLOEXEC 0 -#endif - /* Like open (name, flags | O_CLOEXEC), although not necessarily atomic. FLAGS must not include O_CREAT. */ static int open_noinherit (char const *name, int flags) { - int fd = open (name, flags | O_CLOEXEC); - if (0 <= fd && !O_CLOEXEC && set_cloexec_flag (fd, true) != 0) + int fd; +#ifdef O_CLOEXEC + /* 0 = unknown, 1 = yes, -1 = no. */ + static int have_cloexec; + if (have_cloexec >= 0) + { + fd = open (name, flags | O_CLOEXEC); + if (have_cloexec == 0 && (0 <= fd || errno == EINVAL)) + have_cloexec = (0 <= fd ? 1 : -1); + if (have_cloexec == 1) + return fd; + } +#endif + + fd = open (name, flags); + if (0 <= fd && set_cloexec_flag (fd, true) != 0) { int saved_errno = errno; close (fd);