[libvirt] [PATCH 1/6] Add API for duplicating a socket/client file descriptor

Daniel Veillard veillard at redhat.com
Mon Aug 15 09:34:32 UTC 2011


On Mon, Aug 15, 2011 at 09:58:11AM +0200, Jiri Denemark wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> * src/rpc/virnetsocket.c, src/rpc/virnetsocket.h: Add
>   virNetSocketDupFD()
> * src/rpc/virnetclient.c, src/rpc/virnetclient.h: Add
>   virNetClientDupFD() and virNetClientGetFD()
> ---
>  src/rpc/virnetclient.c |   20 ++++++++++++++++++++
>  src/rpc/virnetclient.h |    3 +++
>  src/rpc/virnetsocket.c |   18 ++++++++++++++++++
>  src/rpc/virnetsocket.h |    2 ++
>  4 files changed, 43 insertions(+), 0 deletions(-)
> 
> diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
> index b845555..31d79ef 100644
> --- a/src/rpc/virnetclient.c
> +++ b/src/rpc/virnetclient.c
> @@ -233,6 +233,26 @@ void virNetClientRef(virNetClientPtr client)
>  }
>  
>  
> +int virNetClientGetFD(virNetClientPtr client)
> +{
> +    int fd;
> +    virNetClientLock(client);
> +    fd = virNetSocketGetFD(client->sock);
> +    virNetClientUnlock(client);
> +    return fd;
> +}
> +
> +
> +int virNetClientDupFD(virNetClientPtr client, bool cloexec)
> +{
> +    int fd;
> +    virNetClientLock(client);
> +    fd = virNetSocketDupFD(client->sock, cloexec);
> +    virNetClientUnlock(client);
> +    return fd;
> +}
> +
> +
>  void virNetClientFree(virNetClientPtr client)
>  {
>      int i;
> diff --git a/src/rpc/virnetclient.h b/src/rpc/virnetclient.h
> index 90d19d3..1fabcfd 100644
> --- a/src/rpc/virnetclient.h
> +++ b/src/rpc/virnetclient.h
> @@ -53,6 +53,9 @@ virNetClientPtr virNetClientNewExternal(const char **cmdargv);
>  
>  void virNetClientRef(virNetClientPtr client);
>  
> +int virNetClientGetFD(virNetClientPtr client);
> +int virNetClientDupFD(virNetClientPtr client, bool cloexec);
> +
>  int virNetClientAddProgram(virNetClientPtr client,
>                             virNetClientProgramPtr prog);
>  
> diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
> index 992e33a..c222743 100644
> --- a/src/rpc/virnetsocket.c
> +++ b/src/rpc/virnetsocket.c
> @@ -28,6 +28,7 @@
>  #include <unistd.h>
>  #include <sys/wait.h>
>  #include <signal.h>
> +#include <fcntl.h>
>  
>  #ifdef HAVE_NETINET_TCP_H
>  # include <netinet/tcp.h>
> @@ -710,6 +711,23 @@ int virNetSocketGetFD(virNetSocketPtr sock)
>  }
>  
>  
> +int virNetSocketDupFD(virNetSocketPtr sock, bool cloexec)
> +{
> +    int fd;
> +
> +    if (cloexec)
> +        fd = fcntl(sock->fd, F_DUPFD_CLOEXEC, (long) 0);
> +    else
> +        fd = dup(sock->fd);
> +    if (fd < 0) {
> +        virReportSystemError(errno, "%s",
> +                             _("Unable to copy socket file handle"));
> +        return -1;
> +    }
> +    return fd;
> +}
> +
> +
>  bool virNetSocketIsLocal(virNetSocketPtr sock)
>  {
>      bool isLocal = false;
> diff --git a/src/rpc/virnetsocket.h b/src/rpc/virnetsocket.h
> index 1e1c63c..d6c85d2 100644
> --- a/src/rpc/virnetsocket.h
> +++ b/src/rpc/virnetsocket.h
> @@ -77,6 +77,8 @@ int virNetSocketNewConnectExternal(const char **cmdargv,
>                                     virNetSocketPtr *addr);
>  
>  int virNetSocketGetFD(virNetSocketPtr sock);
> +int virNetSocketDupFD(virNetSocketPtr sock, bool cloexec);
> +
>  bool virNetSocketIsLocal(virNetSocketPtr sock);
>  
>  int virNetSocketGetPort(virNetSocketPtr sock);

 looks fine ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list