[Libvir] PATCH: Fix remote driver to handle network API for local non-QEMU

Daniel P. Berrange berrange at redhat.com
Fri Jun 29 14:08:47 UTC 2007


On Wed, Jun 27, 2007 at 07:04:00PM +0100, Daniel P. Berrange wrote:
> The remote_internal.c code is basically a no-op in its remoteNetworkOpen
> method. This means the remote driver will only handle the networking
> APIs, if it is also handling the main domain APIs. This works fine if
> connecting to a remote URI, or if using QEMU URIs, but it does not work
> if using the test or Xen drivers.
> 
> To make this work the remoteNetworkOpen method needs to open a connection
> to the remote daemon IIF the remoteOpen method did not already open one.
> 
> So the attached patch adds the neccessary logic in remoteNetworkOpen. It
> also adds code to remoteNetworkClose to make it shutdown& free the connection
> IIF it was opened by the remoteNetworkOpen method. This is what the extra
> 'networkOnly' field in the 'struct private_data' is used to check.
> 
> Second, all of the implementations of virNetwork* APIs in the remote_internal.c
> driver must use the  'struct private_data *' from networkPrivateData field
> in virConnectPtr, not the 'privateData' field. This is because the 'privateData'
> field is probably storing data related to the Xen or Test drivers.
> 
> Third, this also fixes the qemu_driver.c which incorrectly used the 
> privateData field insteadof the networkPrivateData field for 2 of the
> networking APIs, and finally makes sure the qemu_driver.c also acccepts
> the use of qemu:///session APIs for root user.

A new version of the patch which has all of the above plus:

 * Fixed the getType function in the qemu driver to return 'QEMU' instead
   of 'qemu', since the former is what we used to provide.

 * Adds in auto-start of the libvirtd if using  qemu:///session of
   test://* (needed for networking) urls as non-root

 qemu_driver.c     |    9 -
 remote_internal.c |  382 +++++++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 312 insertions(+), 79 deletions(-)

Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
Index: src/qemu_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_driver.c,v
retrieving revision 1.1
diff -u -p -r1.1 qemu_driver.c
--- src/qemu_driver.c	27 Jun 2007 00:12:29 -0000	1.1
+++ src/qemu_driver.c	29 Jun 2007 14:01:25 -0000
@@ -1464,7 +1464,8 @@ virDrvOpenStatus qemudOpen(virConnectPtr
         if (strcmp(name, "qemu:///session"))
             return VIR_DRV_OPEN_DECLINED;
     } else {
-        if (strcmp(name, "qemu:///system"))
+        if (strcmp(name, "qemu:///system") &&
+            strcmp(name, "qemu:///session"))
             return VIR_DRV_OPEN_DECLINED;
     }
 
@@ -1482,7 +1483,7 @@ static int qemudClose(virConnectPtr conn
 }
 
 static const char *qemudGetType(virConnectPtr conn ATTRIBUTE_UNUSED) {
-    return "qemu";
+    return "QEMU";
 }
 
 static int qemudGetMaxVCPUs(virConnectPtr conn ATTRIBUTE_UNUSED,
@@ -2143,7 +2144,7 @@ int qemudDomainSetAutostart(virDomainPtr
 
 virNetworkPtr qemudNetworkLookupByUUID(virConnectPtr conn ATTRIBUTE_UNUSED,
                                      const unsigned char *uuid) {
-    struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;
+    struct qemud_driver *driver = (struct qemud_driver *)conn->networkPrivateData;
     struct qemud_network *network = qemudFindNetworkByUUID(driver, uuid);
     virNetworkPtr net;
 
@@ -2161,7 +2162,7 @@ virNetworkPtr qemudNetworkLookupByUUID(v
 }
 virNetworkPtr qemudNetworkLookupByName(virConnectPtr conn ATTRIBUTE_UNUSED,
                                      const char *name) {
-    struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;
+    struct qemud_driver *driver = (struct qemud_driver *)conn->networkPrivateData;
     struct qemud_network *network = qemudFindNetworkByName(driver, name);
     virNetworkPtr net;
 
Index: src/remote_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/remote_internal.c,v
retrieving revision 1.11
diff -u -p -r1.11 remote_internal.c
--- src/remote_internal.c	26 Jun 2007 23:48:47 -0000	1.11
+++ src/remote_internal.c	29 Jun 2007 14:01:25 -0000
@@ -31,6 +31,10 @@
 #include <signal.h>
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <paths.h>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
@@ -60,6 +64,7 @@ struct private_data {
     char *type;                 /* Cached return from remoteType. */
     int counter;                /* Generates serial numbers for RPC. */
     char *uri;                  /* Original (remote) URI. */
+    int networkOnly;            /* Only used for network API */
 };
 
 #define GET_PRIVATE(conn,retcode)                                       \
@@ -72,6 +77,16 @@ struct private_data {
     }                                                                   \
     assert (priv->magic == MAGIC)
 
+#define GET_NETWORK_PRIVATE(conn,retcode)                                       \
+    struct private_data *priv = (struct private_data *) (conn)->networkPrivateData; \
+    assert (priv);                                                      \
+    if (priv->magic == DEAD) {                                          \
+        error (conn, VIR_ERR_INVALID_ARG,                               \
+               "tried to use a closed or uninitialised handle");        \
+        return (retcode);                                               \
+    }                                                                   \
+    assert (priv->magic == MAGIC)
+
 static int call (virConnectPtr conn, struct private_data *priv, int in_open, int proc_nr, xdrproc_t args_filter, char *args, xdrproc_t ret_filter, char *ret);
 static void error (virConnectPtr conn, virErrorNumber code, const char *info);
 static void server_error (virConnectPtr conn, remote_error *err);
@@ -105,8 +120,125 @@ static void query_free (struct query_fie
 static int initialise_gnutls (virConnectPtr conn);
 static gnutls_session_t negotiate_gnutls_on_connection (virConnectPtr conn, int sock, int no_verify, const char *hostname);
 
+/**
+ * remoteFindServerPath:
+ *
+ * Tries to find the path to the libvirtd binary.
+ * 
+ * Returns path on success or NULL in case of error.
+ */
+static const char *
+remoteFindDaemonPath(void)
+{
+    static const char *serverPaths[] = {
+        SBINDIR "/libvirtd",
+        SBINDIR "/libvirtd_dbg",
+        NULL
+    };
+    int i;
+    const char *customDaemon = getenv("LIBVIRTD_PATH");
+
+    if (customDaemon)
+        return(customDaemon);
+
+    for (i = 0; serverPaths[i]; i++) {
+        if (access(serverPaths[i], X_OK | R_OK) == 0) {
+            return serverPaths[i];
+        }
+    }
+    return NULL;
+}
+
+/**
+ * qemuForkDaemon:
+ *
+ * Forks and try to launch the libvirtd daemon
+ *
+ * Returns 0 in case of success or -1 in case of detected error.
+ */
 static int
-remoteOpen (virConnectPtr conn, const char *uri_str, int flags)
+remoteForkDaemon(virConnectPtr conn)
+{
+    const char *daemonPath = remoteFindDaemonPath();
+    int ret, pid, status;
+
+    if (!daemonPath) {
+        error(conn, VIR_ERR_INTERNAL_ERROR, "failed to find libvirtd binary");
+        return(-1);
+    }
+
+    /* Become a daemon */
+    pid = fork();
+    if (pid == 0) {
+        int stdinfd = -1;
+        int stdoutfd = -1;
+        int i, open_max;
+        if ((stdinfd = open(_PATH_DEVNULL, O_RDONLY)) < 0)
+            goto cleanup;
+        if ((stdoutfd = open(_PATH_DEVNULL, O_WRONLY)) < 0)
+            goto cleanup;
+        if (dup2(stdinfd, STDIN_FILENO) != STDIN_FILENO)
+            goto cleanup;
+        if (dup2(stdoutfd, STDOUT_FILENO) != STDOUT_FILENO)
+            goto cleanup;
+        if (dup2(stdoutfd, STDERR_FILENO) != STDERR_FILENO)
+            goto cleanup;
+        if (close(stdinfd) < 0)
+            goto cleanup;
+        stdinfd = -1;
+        if (close(stdoutfd) < 0)
+            goto cleanup;
+        stdoutfd = -1;
+
+        open_max = sysconf (_SC_OPEN_MAX);
+        for (i = 0; i < open_max; i++)
+            if (i != STDIN_FILENO &&
+                i != STDOUT_FILENO &&
+                i != STDERR_FILENO)
+                close(i);
+
+        setsid();
+        if (fork() == 0) {
+            /* Run daemon in auto-shutdown mode, so it goes away when
+               no longer needed by an active guest, or client */
+            execl(daemonPath, daemonPath, "--timeout", "30", NULL);
+        }
+        /*
+         * calling exit() generate troubles for termination handlers
+         */
+        _exit(0);
+
+    cleanup:
+        if (stdoutfd != -1)
+            close(stdoutfd);
+        if (stdinfd != -1)
+            close(stdinfd);
+        _exit(-1);
+    }
+
+    /*
+     * do a waitpid on the intermediate process to avoid zombies.
+     */
+ retry_wait:
+    ret = waitpid(pid, &status, 0);
+    if (ret < 0) {
+        if (errno == EINTR)
+            goto retry_wait;
+    }
+
+    return (0);
+}
+
+
+/* Must not overlap with virDrvOpenFlags */
+enum {
+    VIR_DRV_OPEN_REMOTE_UNIX = (1 << 8),
+    VIR_DRV_OPEN_REMOTE_USER = (1 << 9),
+    VIR_DRV_OPEN_AUTOSTART = (1 << 10),
+} virDrvOpenRemoteFlags;
+
+static int
+doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str, int flags)
 {
     if (!uri_str) return VIR_DRV_OPEN_DECLINED;
 
@@ -146,11 +278,12 @@ remoteOpen (virConnectPtr conn, const ch
         return VIR_DRV_OPEN_ERROR;
     }
 
-    if (!strcmp(uri_str, "qemu:///system") ||
-        !strcmp(uri_str, "qemu:///session"))
-        transport = trans_unix;
-    else if (!uri->server && !transport_str)
-        return VIR_DRV_OPEN_DECLINED; /* Decline - not a remote URL. */
+    if (!uri->server && !transport_str) {
+        if (flags & VIR_DRV_OPEN_REMOTE_UNIX)
+            transport = trans_unix;
+        else
+            return VIR_DRV_OPEN_DECLINED; /* Decline - not a remote URL. */
+    }
 
     /* Local variables which we will initialise. These can
      * get freed in the failed: path.
@@ -162,7 +295,6 @@ remoteOpen (virConnectPtr conn, const ch
 
     /* Return code from this function, and the private data. */
     int retcode = VIR_DRV_OPEN_ERROR;
-    struct private_data priv = { .magic = DEAD, .sock = -1 };
 
     /* Remote server defaults to "localhost" if not specified. */
     server = strdup (uri->server ? uri->server : "localhost");
@@ -282,7 +414,7 @@ remoteOpen (virConnectPtr conn, const ch
     switch (transport) {
     case trans_tls:
         if (initialise_gnutls (conn) == -1) goto failed;
-        priv.uses_tls = 1;
+        priv->uses_tls = 1;
 
         /*FALLTHROUGH*/
     case trans_tcp: {
@@ -312,30 +444,30 @@ remoteOpen (virConnectPtr conn, const ch
         for (r = res; r; r = r->ai_next) {
             int no_slow_start = 1;
 
-            priv.sock = socket (r->ai_family, SOCK_STREAM, 0);
-            if (priv.sock == -1) {
+            priv->sock = socket (r->ai_family, SOCK_STREAM, 0);
+            if (priv->sock == -1) {
                 error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (errno));
                 continue;
             }
 
             /* Disable Nagle - Dan Berrange. */
-            setsockopt (priv.sock,
+            setsockopt (priv->sock,
                         IPPROTO_TCP, TCP_NODELAY, (void *)&no_slow_start,
                         sizeof no_slow_start);
 
-            if (connect (priv.sock, r->ai_addr, r->ai_addrlen) == -1) {
+            if (connect (priv->sock, r->ai_addr, r->ai_addrlen) == -1) {
                 error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (errno));
-                close (priv.sock);
+                close (priv->sock);
                 continue;
             }
 
-            if (priv.uses_tls) {
-                priv.session =
+            if (priv->uses_tls) {
+                priv->session =
                     negotiate_gnutls_on_connection
-                      (conn, priv.sock, no_verify, server);
-                if (!priv.session) {
-                    close (priv.sock);
-                    priv.sock = -1;
+                      (conn, priv->sock, no_verify, server);
+                if (!priv->session) {
+                    close (priv->sock);
+                    priv->sock = -1;
                     continue;
                 }
             }
@@ -355,9 +487,7 @@ remoteOpen (virConnectPtr conn, const ch
 
     case trans_unix: {
         if (!sockname) {
-            if (!strcmp(uri->scheme, "qemu") &&
-                uri->path &&
-                !strcmp(uri->path, "/session")) {
+            if (flags & VIR_DRV_OPEN_REMOTE_USER) {
                 struct passwd *pw;
                 uid_t uid = getuid();
  
@@ -382,18 +512,39 @@ remoteOpen (virConnectPtr conn, const ch
 #define UNIX_PATH_MAX(addr) (sizeof (addr).sun_path)
 #endif
         struct sockaddr_un addr;
+        int trials = 0;
+
         memset (&addr, 0, sizeof addr);
         addr.sun_family = AF_UNIX;
         strncpy (addr.sun_path, sockname, UNIX_PATH_MAX (addr));
         if (addr.sun_path[0] == '@')
             addr.sun_path[0] = '\0';
 
-        priv.sock = socket (AF_UNIX, SOCK_STREAM, 0);
-        if (priv.sock == -1) {
+      autostart_retry:
+        priv->sock = socket (AF_UNIX, SOCK_STREAM, 0);
+        if (priv->sock == -1) {
             error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (errno));
             goto failed;
         }
-        if (connect (priv.sock, (struct sockaddr *) &addr, sizeof addr) == -1){
+        if (connect (priv->sock, (struct sockaddr *) &addr, sizeof addr) == -1) {
+            /* We might have to autostart the daemon in some cases....
+             * It takes a short while for the daemon to startup, hence we
+             * have a number of retries, with a small sleep. This will
+             * sometimes cause multiple daemons to be started - this is
+             * ok because the duplicates will fail to bind to the socket
+             * and immediately exit, leaving just one daemon.
+             */
+            if (errno == ECONNREFUSED &&
+                flags & VIR_DRV_OPEN_AUTOSTART &&
+                trials < 5) {
+                close(priv->sock);
+                priv->sock = -1;
+                if (remoteForkDaemon(conn) == 0) {
+                    trials++;
+                    usleep(5000 * trials * trials);
+                    goto autostart_retry;
+                }
+            }
             error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (errno));
             goto failed;
         }
@@ -465,45 +616,35 @@ remoteOpen (virConnectPtr conn, const ch
 
         /* Parent continues here. */
         close (sv[1]);
-        priv.sock = sv[0];
+        priv->sock = sv[0];
     }
     } /* switch (transport) */
 
     /* Finally we can call the remote side's open function. */
     remote_open_args args = { &name, flags };
 
-    if (call (conn, &priv, 1, REMOTE_PROC_OPEN,
+    if (call (conn, priv, 1, REMOTE_PROC_OPEN,
               (xdrproc_t) xdr_remote_open_args, (char *) &args,
               (xdrproc_t) xdr_void, (char *) NULL) == -1)
         goto failed;
 
-    /* Finally allocate private data. */
-    conn->privateData = malloc (sizeof priv);
-    if (!conn->privateData) {
-        error (NULL, VIR_ERR_NO_MEMORY, "malloc");
-        goto failed;
-    }
     /* Duplicate and save the uri_str. */
-    priv.uri = strdup (uri_str);
-    if (!priv.uri) {
+    priv->uri = strdup (uri_str);
+    if (!priv->uri) {
         error (NULL, VIR_ERR_NO_MEMORY, "allocating priv->uri");
-        free (conn->privateData);
         goto failed;
     }
 
-    priv.magic = MAGIC;
-    memcpy (conn->privateData, &priv, sizeof priv);
-
     /* Successful. */
     retcode = VIR_DRV_OPEN_SUCCESS;
 
     /*FALLTHROUGH*/
  failed:
     /* Close the socket if we failed. */
-    if (retcode != VIR_DRV_OPEN_SUCCESS && priv.sock >= 0) {
-        if (priv.uses_tls && priv.session)
-            gnutls_bye (priv.session, GNUTLS_SHUT_RDWR);
-        close (priv.sock);
+    if (retcode != VIR_DRV_OPEN_SUCCESS && priv->sock >= 0) {
+        if (priv->uses_tls && priv->session)
+            gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);
+        close (priv->sock);
     }
 
     /* Free up the URL and strings. */
@@ -527,6 +668,44 @@ remoteOpen (virConnectPtr conn, const ch
     return retcode;
 }
 
+static int
+remoteOpen (virConnectPtr conn, const char *uri_str, int flags)
+{
+    struct private_data *priv = malloc (sizeof(struct private_data));
+    int ret;
+
+    if (!priv) {
+        error (NULL, VIR_ERR_NO_MEMORY, "struct private_data");
+        return VIR_DRV_OPEN_ERROR;
+    }
+
+    if (uri_str) {
+        if (!strcmp(uri_str, "qemu:///system")) {
+            flags |= VIR_DRV_OPEN_REMOTE_UNIX;
+        } else if (!strcmp(uri_str, "qemu:///session")) {
+            flags |= VIR_DRV_OPEN_REMOTE_UNIX;
+            if (getuid() > 0) {
+                flags |= VIR_DRV_OPEN_REMOTE_USER;
+                flags |= VIR_DRV_OPEN_AUTOSTART;
+            }
+        }
+    }
+
+    memset(priv, 0, sizeof(struct private_data));
+    priv->magic = DEAD;
+    priv->sock = -1;
+    ret = doRemoteOpen(conn, priv, uri_str, flags);
+    if (ret != VIR_DRV_OPEN_SUCCESS) {
+        conn->privateData = NULL;
+        free(priv);
+    } else {
+        priv->magic = MAGIC;
+        conn->privateData = priv;
+    }
+    return ret;
+}
+
+
 /* In a string "driver+transport" return a pointer to "transport". */
 static char *
 get_transport_from_scheme (char *scheme)
@@ -948,11 +1127,10 @@ verify_certificate (virConnectPtr conn A
 
 /*----------------------------------------------------------------------*/
 
+
 static int
-remoteClose (virConnectPtr conn)
+doRemoteClose (virConnectPtr conn, struct private_data *priv)
 {
-    GET_PRIVATE (conn, -1);
-
     if (call (conn, priv, 0, REMOTE_PROC_CLOSE,
               (xdrproc_t) xdr_void, (char *) NULL,
               (xdrproc_t) xdr_void, (char *) NULL) == -1)
@@ -971,11 +1149,23 @@ remoteClose (virConnectPtr conn)
 
     /* Free private data. */
     priv->magic = DEAD;
-    free (conn->privateData);
 
     return 0;
 }
 
+static int
+remoteClose (virConnectPtr conn)
+{
+    int ret;
+    GET_PRIVATE (conn, -1);
+
+    ret = doRemoteClose(conn, priv);
+    free (priv);
+    conn->privateData = NULL;
+
+    return ret;
+}
+
 /* Unfortunately this function is defined to return a static string.
  * Since the remote end always answers with the same type (for a
  * single connection anyway) we cache the type in the connection's
@@ -1954,33 +2144,75 @@ remoteNetworkOpen (virConnectPtr conn,
                    const char *uri_str ATTRIBUTE_UNUSED,
                    int flags ATTRIBUTE_UNUSED)
 {
-    /* If the main connection is a remote, then just catch the
-     * network open too.  Nothing is forwarded because the
-     * main remoteOpen call above will have already opened
-     * network on the remote side.
-     */
     if (conn &&
         conn->driver &&
-        strcmp (conn->driver->name, "remote") == 0)
+        strcmp (conn->driver->name, "remote") == 0) {
+        /* If we're here, the remote driver is already
+         * in use due to a) a QEMU uri, or b) a remote
+         * URI. So we can re-use existing connection
+         */
+        conn->networkPrivateData = conn->privateData;
         return VIR_DRV_OPEN_SUCCESS;
-    else
-        return VIR_DRV_OPEN_DECLINED;
+    } else {
+        /* Using a non-remote driver, so we need to open a
+         * new connection for network APIs, forcing it to
+         * use the UNIX transport. This handles Xen / Test
+         * drivers which don't have their own impl of the
+         * network APIs.
+         */
+        struct private_data *priv = malloc (sizeof(struct private_data));
+        int ret;
+        if (!priv) {
+            error (NULL, VIR_ERR_NO_MEMORY, "struct private_data");
+            return VIR_DRV_OPEN_ERROR;
+        }
+
+        /* Xen driver is a single system-wide driver, so
+         * we need the main daemon. Test driver is per
+         * user, so use the per-user daemon, potentially
+         * autostarting
+         */
+        flags |= VIR_DRV_OPEN_REMOTE_UNIX;
+        if (getuid() > 0 &&
+            !strcmp(conn->driver->name, "test")) {
+            flags |= VIR_DRV_OPEN_REMOTE_USER;
+            flags |= VIR_DRV_OPEN_AUTOSTART;
+        }
+
+        memset(priv, 0, sizeof(struct private_data));
+        priv->magic = DEAD;
+        priv->sock = -1;
+        ret = doRemoteOpen(conn, priv, uri_str, flags);
+        if (ret != VIR_DRV_OPEN_SUCCESS) {
+            conn->networkPrivateData = NULL;
+            free(priv);
+        } else {
+            priv->magic = MAGIC;
+            priv->networkOnly = 1;
+            conn->networkPrivateData = priv;
+        }
+        return ret;
+    }
 }
 
 static int
-remoteNetworkClose (virConnectPtr conn ATTRIBUTE_UNUSED)
+remoteNetworkClose (virConnectPtr conn)
 {
-    /* No need to pass this to the remote side, because
-     * libvirt.c will soon call remoteClose.
-     */
-    return 0;
+    int ret = 0;
+    GET_NETWORK_PRIVATE (conn, -1);
+    if (priv->networkOnly) {
+        ret = doRemoteClose(conn, priv);
+        free(priv);
+        conn->networkPrivateData = NULL;
+    }
+    return ret;
 }
 
 static int
 remoteNumOfNetworks (virConnectPtr conn)
 {
     remote_num_of_networks_ret ret;
-    GET_PRIVATE (conn, -1);
+    GET_NETWORK_PRIVATE (conn, -1);
 
     memset (&ret, 0, sizeof ret);
     if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_NETWORKS,
@@ -1997,7 +2229,7 @@ remoteListNetworks (virConnectPtr conn, 
     int i;
     remote_list_networks_args args;
     remote_list_networks_ret ret;
-    GET_PRIVATE (conn, -1);
+    GET_NETWORK_PRIVATE (conn, -1);
 
     if (maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
         error (conn, VIR_ERR_RPC, "maxnames > REMOTE_NETWORK_NAME_LIST_MAX");
@@ -2034,7 +2266,7 @@ static int
 remoteNumOfDefinedNetworks (virConnectPtr conn)
 {
     remote_num_of_defined_networks_ret ret;
-    GET_PRIVATE (conn, -1);
+    GET_NETWORK_PRIVATE (conn, -1);
 
     memset (&ret, 0, sizeof ret);
     if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_DEFINED_NETWORKS,
@@ -2052,7 +2284,7 @@ remoteListDefinedNetworks (virConnectPtr
     int i;
     remote_list_defined_networks_args args;
     remote_list_defined_networks_ret ret;
-    GET_PRIVATE (conn, -1);
+    GET_NETWORK_PRIVATE (conn, -1);
 
     if (maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
         error (conn, VIR_ERR_RPC, "maxnames > REMOTE_NETWORK_NAME_LIST_MAX");
@@ -2092,7 +2324,7 @@ remoteNetworkLookupByUUID (virConnectPtr
     virNetworkPtr net;
     remote_network_lookup_by_uuid_args args;
     remote_network_lookup_by_uuid_ret ret;
-    GET_PRIVATE (conn, NULL);
+    GET_NETWORK_PRIVATE (conn, NULL);
 
     memcpy (args.uuid, uuid, VIR_UUID_BUFLEN);
 
@@ -2118,7 +2350,7 @@ remoteNetworkLookupByName (virConnectPtr
     virNetworkPtr net;
     remote_network_lookup_by_name_args args;
     remote_network_lookup_by_name_ret ret;
-    GET_PRIVATE (conn, NULL);
+    GET_NETWORK_PRIVATE (conn, NULL);
 
     args.name = (char *) name;
 
@@ -2143,7 +2375,7 @@ remoteNetworkCreateXML (virConnectPtr co
     virNetworkPtr net;
     remote_network_create_xml_args args;
     remote_network_create_xml_ret ret;
-    GET_PRIVATE (conn, NULL);
+    GET_NETWORK_PRIVATE (conn, NULL);
 
     args.xml = (char *) xmlDesc;
 
@@ -2168,7 +2400,7 @@ remoteNetworkDefineXML (virConnectPtr co
     virNetworkPtr net;
     remote_network_define_xml_args args;
     remote_network_define_xml_ret ret;
-    GET_PRIVATE (conn, NULL);
+    GET_NETWORK_PRIVATE (conn, NULL);
 
     args.xml = (char *) xml;
 
@@ -2191,7 +2423,7 @@ static int
 remoteNetworkUndefine (virNetworkPtr network)
 {
     remote_network_undefine_args args;
-    GET_PRIVATE (network->conn, -1);
+    GET_NETWORK_PRIVATE (network->conn, -1);
 
     make_nonnull_network (&args.net, network);
 
@@ -2207,7 +2439,7 @@ static int
 remoteNetworkCreate (virNetworkPtr network)
 {
     remote_network_create_args args;
-    GET_PRIVATE (network->conn, -1);
+    GET_NETWORK_PRIVATE (network->conn, -1);
 
     make_nonnull_network (&args.net, network);
 
@@ -2223,7 +2455,7 @@ static int
 remoteNetworkDestroy (virNetworkPtr network)
 {
     remote_network_destroy_args args;
-    GET_PRIVATE (network->conn, -1);
+    GET_NETWORK_PRIVATE (network->conn, -1);
 
     make_nonnull_network (&args.net, network);
 
@@ -2240,7 +2472,7 @@ remoteNetworkDumpXML (virNetworkPtr netw
 {
     remote_network_dump_xml_args args;
     remote_network_dump_xml_ret ret;
-    GET_PRIVATE (network->conn, NULL);
+    GET_NETWORK_PRIVATE (network->conn, NULL);
 
     make_nonnull_network (&args.net, network);
     args.flags = flags;
@@ -2260,7 +2492,7 @@ remoteNetworkGetBridgeName (virNetworkPt
 {
     remote_network_get_bridge_name_args args;
     remote_network_get_bridge_name_ret ret;
-    GET_PRIVATE (network->conn, NULL);
+    GET_NETWORK_PRIVATE (network->conn, NULL);
 
     make_nonnull_network (&args.net, network);
 
@@ -2279,7 +2511,7 @@ remoteNetworkGetAutostart (virNetworkPtr
 {
     remote_network_get_autostart_args args;
     remote_network_get_autostart_ret ret;
-    GET_PRIVATE (network->conn, -1);
+    GET_NETWORK_PRIVATE (network->conn, -1);
 
     make_nonnull_network (&args.net, network);
 
@@ -2298,7 +2530,7 @@ static int
 remoteNetworkSetAutostart (virNetworkPtr network, int autostart)
 {
     remote_network_set_autostart_args args;
-    GET_PRIVATE (network->conn, -1);
+    GET_NETWORK_PRIVATE (network->conn, -1);
 
     make_nonnull_network (&args.net, network);
     args.autostart = autostart;


More information about the libvir-list mailing list