On Mon, Aug 06, 2018 at 06:32:01PM +0200, Claudio Jeker wrote: > On Mon, Aug 06, 2018 at 06:23:28PM +0200, Matthieu Herrb wrote: > > 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; > > } > > There is a difference between FD_CLOEXEC and O_CLOEXEC. FD_CLOEXEC is > defined as 1 and so the man page is correct.
Ok. This is confusing but you're correct. sigh. > > > > 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 > > > > > > > -- > :wq Claudio -- Matthieu Herrb