[libvirt] [Qemu-devel] [PATCH v4 3/7] qapi: Add pass-fd QMP command

Corey Bryant coreyb at linux.vnet.ibm.com
Mon Jun 25 14:51:56 UTC 2012



On 06/22/2012 04:24 PM, Eric Blake wrote:
> On 06/22/2012 12:36 PM, Corey Bryant wrote:
>> This patch adds the pass-fd QMP command using the QAPI framework.
>> Like the getfd command, it is used to pass a file descriptor via
>> SCM_RIGHTS and associate it with a name.  However, the pass-fd
>> command also returns the received file descriptor, which is a
>> difference in behavior from the getfd command, which returns
>> nothing.  pass-fd also supports a boolean "force" argument that
>> can be used to specify that an existing file descriptor is
>> associated with the specified name, and that it should become a
>> copy of the newly passed file descriptor.
>
>> +        if (replace) {
>> +            /* the existing fd is replaced with the new fd */
>> +            close(monfd->fd);
>> +            monfd->fd = fd;
>> +            return fd;
>> +        }
>> +
>> +        if (copy) {
>
> Since 'replace' and 'copy' are never both true, should this instead be a
> tri-state enum argument instead of two independent bool arguments?
>

Sure, that makes sense.  I'll do that in v5.

>> +            /* the existing fd becomes a copy of the new fd */
>> +            if (dup2(fd, monfd->fd) == -1) {
>
> Broken - you want to use dup3(fd, monfd->fd, O_CLOEXEC) (and fall back
> to dup2()+fcntl(F_GETFD/F_SETFD) on platforms where dup3 is not
> available; it has been proposed for the next revision of POSIX but right
> now is pretty much limited to Linux and Cygwin).  Otherwise, you are
> undoing the fact that patch 1/7 just changed the 'getfd' list to always
> keep all its fds marked cloexec.
>

Thanks for catching this.  I'll fix this in v5.  In terms of platforms 
that support dup3 vs dup2, I'm assuming the following preprocessor 
checks will do what we need:

#if defined(__linux__) || defined(__CYGWIN__)
dup3(fd, monfd->fd, O_CLOEXEC)
#else
dup2()+fcntl(F_GETFD/F_SETFD)
#endif

-- 
Regards,
Corey





More information about the libvir-list mailing list