General purpose library for name/value pairs.

Jilles Tjoelker jilles at stack.nl
Fri Jul 5 20:59:12 UTC 2013


On Thu, Jul 04, 2013 at 11:53:30PM +0200, Pawel Jakub Dawidek wrote:
> The library allows to send and receive descriptors, of course only over
> UNIX domain sockets:

> 	nvlist_t *nvl;
> 	int fd;
> 
> 	fd = open("/etc/passwd", O_RDONLY);
> 	if (fd < 0)
> 		err(1, "open(/etc/passwd) failed");
> 
> 	nvl = nvlist_create(0);
> 	nvlist_add_string(nvl, "filename", "/etc/passwd");
> 	nvlist_move_descriptor(nvl, "fd", fd);
> 	if (nvlist_send(sock, nvl) < 0)
> 		err(1, "nvlist_send() failed");
> 	nvlist_destroy(nvl);

> Also note that I used nvlist_move_descriptor() function and not
> nvlist_add_descriptor(). The former will allow nvlist to consume the
> given descriptor, so we don't have to close it, the latter will dup(2)
> the given descriptor and then add it to the nvlist.

The library should use fcntl(fd, F_DUPFD_CLOEXEC, 0) instead of dup(fd)
so it does not pass the fd in case another thread forks. This is
available in sufficiently recent head, stable/9 and stable/8.

(On the other hand, if the application provides a file descriptor, I
think it is not necessary to set the close-on-exec flag because only the
creator of the file descriptor can do so in a race-free manner.)

The recvmsg() call should use the MSG_CMSG_CLOEXEC flag for the same
reason. This is currently only available in head. It is probably best to
fcntl(fd, F_SETFD, 1) if MSG_CMSG_CLOEXEC is not available so that
people do not write applications that assume close-on-exec is clear.

-- 
Jilles Tjoelker


More information about the freebsd-arch mailing list