diff options
author | jilles <jilles@FreeBSD.org> | 2012-11-30 23:51:33 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2012-11-30 23:51:33 +0000 |
commit | 04619555a48eeacc9a13b826b57fa7f2932aae7c (patch) | |
tree | 991e5175c8b9e871ed7052a08f7085beff815f08 /lib/libc/stdio/flags.c | |
parent | 3a1ec1177a93dcc74915912a9252ca452a848606 (diff) | |
download | FreeBSD-src-04619555a48eeacc9a13b826b57fa7f2932aae7c.zip FreeBSD-src-04619555a48eeacc9a13b826b57fa7f2932aae7c.tar.gz |
libc: Allow setting close-on-exec in fopen/freopen/fdopen.
This commit adds a new mode option 'e' that must follow any 'b', '+' and/or
'x' options. C11 is clear about the 'x' needing to follow 'b' and/or '+' and
that is what we implement; therefore, require a strict position for 'e' as
well.
For freopen() with a non-NULL path argument and fopen(), the close-on-exec
flag is set iff the 'e' mode option is specified. For freopen() with a NULL
path argument and fdopen(), the close-on-exec flag is turned on if the 'e'
mode option is specified and remains unchanged otherwise.
Although the same behaviour for fopen() can be obtained by open(O_CLOEXEC)
and fdopen(), this needlessly complicates the calling code.
Apart from the ordering requirement, the new option matches glibc.
PR: kern/169320
Diffstat (limited to 'lib/libc/stdio/flags.c')
-rw-r--r-- | lib/libc/stdio/flags.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/lib/libc/stdio/flags.c b/lib/libc/stdio/flags.c index 0b6b075..e445fed 100644 --- a/lib/libc/stdio/flags.c +++ b/lib/libc/stdio/flags.c @@ -97,6 +97,7 @@ __sflags(mode, optr) /* 'x' means exclusive (fail if the file exists) */ if (*mode == 'x') { + mode++; if (m == O_RDONLY) { errno = EINVAL; return (0); @@ -104,6 +105,10 @@ __sflags(mode, optr) o |= O_EXCL; } + /* set close-on-exec */ + if (*mode == 'e') + o |= O_CLOEXEC; + *optr = m | o; return (ret); } |