diff --git a/bootstrap.conf b/bootstrap.conf index 7882886b795f6bcb0b4ec859fb834224d70f61d3..94af05134c7133f496ca79776732d40d13e59d12 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -38,6 +38,7 @@ crypto/md5 dirname-lgpl environ fclose +fcntl fcntl-h ffs fnmatch diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index b845555bece233d2c707fb7e425021e917c0a852..31d79efb697889c6a7f5438222fff3040ae4c484 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 90d19d397c8208e4ce9219b7ea4e7130a7ff80f8..1fabcfde86b52eace924cd6648582583a1d241e5 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 992e33aa204a4aaccd4ab5cf5598235767aef996..73ff5eef11a9114738beff54f6202e12e05aac0b 100644 --- a/src/rpc/virnetsocket.c +++ b/src/rpc/virnetsocket.c @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef HAVE_NETINET_TCP_H # include @@ -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; diff --git a/src/rpc/virnetsocket.h b/src/rpc/virnetsocket.h index 1e1c63c6e534a72d5961fac0e186ddd14a844c3c..d6c85d28d7a32fb16e23031e01f6eadc19e2a821 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);