General purpose library for name/value pairs.

Pawel Jakub Dawidek pjd at FreeBSD.org
Sat Jul 6 20:47:38 UTC 2013


On Fri, Jul 05, 2013 at 10:58:56PM +0200, Jilles Tjoelker wrote:
> 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.

I fully agree and implemented what you have suggested.

Thanks!

-- 
Pawel Jakub Dawidek                       http://www.wheelsystems.com
FreeBSD committer                         http://www.FreeBSD.org
Am I Evil? Yes, I Am!                     http://mobter.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-arch/attachments/20130706/42ede197/attachment.sig>


More information about the freebsd-arch mailing list