[libvirt] [PATCH 05/15] Move veth device management into virLXCControllerPtr object

Daniel P. Berrange berrange at redhat.com
Tue Jul 3 15:58:44 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

Move the veth device name state into the virLXCControllerPtr
object and stop passing it around. Also use size_t instead
of unsigned int for the array length parameters.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 src/lxc/lxc_container.c  |   10 +++---
 src/lxc/lxc_container.h  |    2 +-
 src/lxc/lxc_controller.c |   79 ++++++++++++++++++++++++++++++----------------
 3 files changed, 57 insertions(+), 34 deletions(-)

diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index 910e82b..4f8703c 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -93,7 +93,7 @@ typedef struct __lxc_child_argv lxc_child_argv_t;
 struct __lxc_child_argv {
     virDomainDefPtr config;
     virSecurityManagerPtr securityDriver;
-    unsigned int nveths;
+    size_t nveths;
     char **veths;
     int monitor;
     char **ttyPaths;
@@ -262,15 +262,15 @@ int lxcContainerWaitForContinue(int control)
  * Returns 0 on success or nonzero in case of error
  */
 static int lxcContainerRenameAndEnableInterfaces(bool privNet,
-                                                 unsigned int nveths,
+                                                 size_t nveths,
                                                  char **veths)
 {
     int rc = 0;
-    unsigned int i;
+    size_t i;
     char *newname = NULL;
 
     for (i = 0 ; i < nveths ; i++) {
-        if (virAsprintf(&newname, "eth%d", i) < 0) {
+        if (virAsprintf(&newname, "eth%zu", i) < 0) {
             virReportOOMError();
             rc = -1;
             goto error_out;
@@ -1775,7 +1775,7 @@ const char *lxcContainerGetAlt32bitArch(const char *arch)
  */
 int lxcContainerStart(virDomainDefPtr def,
                       virSecurityManagerPtr securityDriver,
-                      unsigned int nveths,
+                      size_t nveths,
                       char **veths,
                       int control,
                       int handshakefd,
diff --git a/src/lxc/lxc_container.h b/src/lxc/lxc_container.h
index 77fb9b2..6f1cc8b 100644
--- a/src/lxc/lxc_container.h
+++ b/src/lxc/lxc_container.h
@@ -51,7 +51,7 @@ int lxcContainerWaitForContinue(int control);
 
 int lxcContainerStart(virDomainDefPtr def,
                       virSecurityManagerPtr securityDriver,
-                      unsigned int nveths,
+                      size_t nveths,
                       char **veths,
                       int control,
                       int handshakefd,
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index 7447f6c..ad11307 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -85,6 +85,9 @@ typedef virLXCController *virLXCControllerPtr;
 struct _virLXCController {
     char *name;
     virDomainDefPtr def;
+
+    size_t nveths;
+    char **veths;
 };
 
 static void virLXCControllerFree(virLXCControllerPtr ctrl);
@@ -129,15 +132,35 @@ no_memory:
 
 static void virLXCControllerFree(virLXCControllerPtr ctrl)
 {
+    size_t i;
+
     if (!ctrl)
         return;
 
+    for (i = 0 ; i < ctrl->nveths ; i++)
+        VIR_FREE(ctrl->veths[i]);
+    VIR_FREE(ctrl->veths);
+
     virDomainDefFree(ctrl->def);
     VIR_FREE(ctrl->name);
 
     VIR_FREE(ctrl);
 }
 
+
+static int virLXCControllerValidateNICs(virLXCControllerPtr ctrl)
+{
+    if (ctrl->def->nnets != ctrl->nveths) {
+        lxcError(VIR_ERR_INTERNAL_ERROR,
+                 _("expecting %d veths, but got %zu"),
+                 ctrl->def->nnets, ctrl->nveths);
+        return -1;
+    }
+
+    return 0;
+}
+
+
 static int lxcGetLoopFD(char **dev_name)
 {
     int fd = -1;
@@ -1307,7 +1330,7 @@ cleanup2:
 
 
 /**
- * lxcControllerMoveInterfaces
+ * virLXCControllerMoveInterfaces
  * @nveths: number of interfaces
  * @veths: interface names
  * @container: pid of container
@@ -1316,13 +1339,13 @@ cleanup2:
  *
  * Returns 0 on success or -1 in case of error
  */
-static int lxcControllerMoveInterfaces(unsigned int nveths,
-                                       char **veths,
-                                       pid_t container)
+static int virLXCControllerMoveInterfaces(virLXCControllerPtr ctrl,
+                                          pid_t container)
 {
-    unsigned int i;
-    for (i = 0 ; i < nveths ; i++)
-        if (virNetDevSetNamespace(veths[i], container) < 0)
+    size_t i;
+
+    for (i = 0 ; i < ctrl->nveths ; i++)
+        if (virNetDevSetNamespace(ctrl->veths[i], container) < 0)
             return -1;
 
     return 0;
@@ -1330,24 +1353,26 @@ static int lxcControllerMoveInterfaces(unsigned int nveths,
 
 
 /**
- * lxcCleanupInterfaces:
- * @nveths: number of interfaces
- * @veths: interface names
+ * virLXCControllerDeleteInterfaces:
+ * @ctrl: the LXC controller
  *
  * Cleans up the container interfaces by deleting the veth device pairs.
  *
  * Returns 0 on success or -1 in case of error
  */
-static int lxcControllerCleanupInterfaces(unsigned int nveths,
-                                          char **veths)
+static int virLXCControllerDeleteInterfaces(virLXCControllerPtr ctrl)
 {
-    unsigned int i;
-    for (i = 0 ; i < nveths ; i++)
-        ignore_value(virNetDevVethDelete(veths[i]));
+    size_t i;
+    int ret = 0;
 
-    return 0;
+    for (i = 0 ; i < ctrl->nveths ; i++)
+        if (virNetDevVethDelete(ctrl->veths[i]) < 0)
+            ret = -1;
+
+    return ret;
 }
 
+
 static int lxcSetPersonality(virDomainDefPtr def)
 {
     struct utsname utsname;
@@ -1422,8 +1447,6 @@ cleanup:
 static int
 virLXCControllerRun(virLXCControllerPtr ctrl,
                     virSecurityManagerPtr securityDriver,
-                    unsigned int nveths,
-                    char **veths,
                     int monitor,
                     int client,
                     int *ttyFDs,
@@ -1588,8 +1611,8 @@ virLXCControllerRun(virLXCControllerPtr ctrl,
 
     if ((container = lxcContainerStart(ctrl->def,
                                        securityDriver,
-                                       nveths,
-                                       veths,
+                                       ctrl->nveths,
+                                       ctrl->veths,
                                        control[1],
                                        containerhandshake[1],
                                        containerTtyPaths,
@@ -1598,7 +1621,7 @@ virLXCControllerRun(virLXCControllerPtr ctrl,
     VIR_FORCE_CLOSE(control[1]);
     VIR_FORCE_CLOSE(containerhandshake[1]);
 
-    if (lxcControllerMoveInterfaces(nveths, veths, container) < 0)
+    if (virLXCControllerMoveInterfaces(ctrl, container) < 0)
         goto cleanup;
 
     if (lxcContainerSendContinue(control[0]) < 0) {
@@ -1684,7 +1707,7 @@ int main(int argc, char *argv[])
     int rc = 1;
     int client;
     char *name = NULL;
-    int nveths = 0;
+    size_t nveths = 0;
     char **veths = NULL;
     int monitor = -1;
     int handshakefd = -1;
@@ -1833,11 +1856,11 @@ int main(int argc, char *argv[])
               NULLSTR(ctrl->def->seclabel.label),
               NULLSTR(ctrl->def->seclabel.imagelabel));
 
-    if (ctrl->def->nnets != nveths) {
-        fprintf(stderr, "%s: expecting %d veths, but got %d\n",
-                argv[0], ctrl->def->nnets, nveths);
+    ctrl->veths = veths;
+    ctrl->nveths = nveths;
+
+    if (virLXCControllerValidateNICs(ctrl) < 0)
         goto cleanup;
-    }
 
     if ((sockpath = lxcMonitorPath(ctrl)) == NULL)
         goto cleanup;
@@ -1885,12 +1908,12 @@ int main(int argc, char *argv[])
     }
 
     rc = virLXCControllerRun(ctrl, securityDriver,
-                             nveths, veths, monitor, client,
+                             monitor, client,
                              ttyFDs, nttyFDs, handshakefd);
 
 cleanup:
     virPidFileDelete(LXC_STATE_DIR, name);
-    lxcControllerCleanupInterfaces(nveths, veths);
+    virLXCControllerDeleteInterfaces(ctrl);
     if (sockpath)
         unlink(sockpath);
     VIR_FREE(sockpath);
-- 
1.7.10.4




More information about the libvir-list mailing list