]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add API for duplicating a socket/client file descriptor
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 7 Jul 2011 14:17:21 +0000 (15:17 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 15 Aug 2011 13:21:26 +0000 (15:21 +0200)
* src/rpc/virnetsocket.c, src/rpc/virnetsocket.h: Add
  virNetSocketDupFD()
* src/rpc/virnetclient.c, src/rpc/virnetclient.h: Add
  virNetClientDupFD() and virNetClientGetFD()

bootstrap.conf
src/rpc/virnetclient.c
src/rpc/virnetclient.h
src/rpc/virnetsocket.c
src/rpc/virnetsocket.h

index 7882886b795f6bcb0b4ec859fb834224d70f61d3..94af05134c7133f496ca79776732d40d13e59d12 100644 (file)
@@ -38,6 +38,7 @@ crypto/md5
 dirname-lgpl
 environ
 fclose
+fcntl
 fcntl-h
 ffs
 fnmatch
index b845555bece233d2c707fb7e425021e917c0a852..31d79efb697889c6a7f5438222fff3040ae4c484 100644 (file)
@@ -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;
index 90d19d397c8208e4ce9219b7ea4e7130a7ff80f8..1fabcfde86b52eace924cd6648582583a1d241e5 100644 (file)
@@ -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);
 
index 992e33aa204a4aaccd4ab5cf5598235767aef996..73ff5eef11a9114738beff54f6202e12e05aac0b 100644 (file)
@@ -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);
+    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;
index 1e1c63c6e534a72d5961fac0e186ddd14a844c3c..d6c85d28d7a32fb16e23031e01f6eadc19e2a821 100644 (file)
@@ -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);