From owner-freebsd-arch@FreeBSD.ORG Fri Jul 5 20:59:12 2013 Return-Path: Delivered-To: arch@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id A06971F2; Fri, 5 Jul 2013 20:59:12 +0000 (UTC) (envelope-from jilles@stack.nl) Received: from mx1.stack.nl (unknown [IPv6:2001:610:1108:5012::107]) by mx1.freebsd.org (Postfix) with ESMTP id 54AAC12C3; Fri, 5 Jul 2013 20:59:12 +0000 (UTC) Received: from snail.stack.nl (snail.stack.nl [IPv6:2001:610:1108:5010::131]) by mx1.stack.nl (Postfix) with ESMTP id CC5931203CC; Fri, 5 Jul 2013 22:58:56 +0200 (CEST) Received: by snail.stack.nl (Postfix, from userid 1677) id A649828493; Fri, 5 Jul 2013 22:58:56 +0200 (CEST) Date: Fri, 5 Jul 2013 22:58:56 +0200 From: Jilles Tjoelker To: Pawel Jakub Dawidek Subject: Re: General purpose library for name/value pairs. Message-ID: <20130705205856.GA19346@stack.nl> References: <20130704215329.GG1402@garage.freebsd.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130704215329.GG1402@garage.freebsd.pl> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: arch@FreeBSD.org X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 Jul 2013 20:59:12 -0000 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