Hi,
fcntl(2) says:
F_GETFD Get the close-on-exec flag associated with the file
descriptor fd as FD_CLOEXEC. If the returned value
ANDed with FD_CLOEXEC is 0, the file will remain open
across exec(), otherwise the file will be closed upon
execution of exec() (arg is ignored).
This is wrong. The flag is returned in the low bit of the return
value (see sys/kern/kern_descrip.c:443).
Moreover the value O_CLOEXEC is not 0x1, so doing the AND described
above is never going to provide the good answer.
I've checked that Linux and FreeBSD also return 0x1 when the O_CLOEXEC
is set, and none of them defines O_CLOEXEC as 0x1. The same
documentation bug is present on FreenBSD.
How to repeat:
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
int fd, flags;
fd = open("/dev/null", O_RDWR | O_CLOEXEC);
if (fd < 0)
err(2, "open");
flags = fcntl(fd, F_GETFD, 0);
if (flags < 0)
err(2, "fcntl");
printf("flags 0x%08x O_CLOEXEC 0x%08x\n", flags, O_CLOEXEC);
return 0;
}
Patch
The patch below fixes the documentation.
Index: fcntl.2
===================================================================
RCS file: /cvs/OpenBSD/src/lib/libc/sys/fcntl.2,v
retrieving revision 1.31
diff -u -p -u -r1.31 fcntl.2
--- fcntl.2 16 Dec 2014 00:06:49 -0000 1.31
+++ fcntl.2 6 Aug 2018 16:10:53 -0000
@@ -100,10 +100,7 @@ Get the close-on-exec flag associated wi
.Fa fd
as
.Dv FD_CLOEXEC .
-If the returned value ANDed with
-.Dv FD_CLOEXEC
-is 0,
-the file will remain open across
+If the returned value is 0, the file will remain open across
.Fn exec ,
otherwise the file will be closed upon execution of
.Fn exec
--
Matthieu Herrb