[libvirt] [PATCH 2/3] lxc: driver: Convert emulator launching to virCommand

Cole Robinson crobinso at redhat.com
Thu May 5 20:44:10 UTC 2011


Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 src/lxc/lxc_driver.c |  186 ++++++++++----------------------------------------
 1 files changed, 37 insertions(+), 149 deletions(-)

diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index b94941d..930e445 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -1247,134 +1247,59 @@ static int lxcControllerStart(lxc_driver_t *driver,
                               int nveths,
                               char **veths,
                               int appPty,
-                              int logfd)
+                              int logfile)
 {
     int i;
-    int rc;
-    int largc = 0, larga = 0;
-    const char **largv = NULL;
-    int lenvc = 0, lenva = 0;
-    const char **lenv = NULL;
+    int ret = -1;
     char *filterstr;
     char *outputstr;
-    char *tmp;
-    int log_level;
-    pid_t child;
-    int status;
-    fd_set keepfd;
-    char appPtyStr[30];
-    const char *emulator;
-
-    FD_ZERO(&keepfd);
-
-#define ADD_ARG_SPACE                                                   \
-    do { \
-        if (largc == larga) {                                           \
-            larga += 10;                                                \
-            if (VIR_REALLOC_N(largv, larga) < 0)                        \
-                goto no_memory;                                         \
-        }                                                               \
-    } while (0)
-
-#define ADD_ARG(thisarg)                                                \
-    do {                                                                \
-        ADD_ARG_SPACE;                                                  \
-        largv[largc++] = thisarg;                                       \
-    } while (0)
-
-#define ADD_ARG_LIT(thisarg)                                            \
-    do {                                                                \
-        ADD_ARG_SPACE;                                                  \
-        if ((largv[largc++] = strdup(thisarg)) == NULL)                 \
-            goto no_memory;                                             \
-    } while (0)
-
-#define ADD_ENV_SPACE                                                   \
-    do {                                                                \
-        if (lenvc == lenva) {                                           \
-            lenva += 10;                                                \
-            if (VIR_REALLOC_N(lenv, lenva) < 0)                         \
-                goto no_memory;                                         \
-        }                                                               \
-    } while (0)
-
-#define ADD_ENV(thisarg)                                                \
-    do {                                                                \
-        ADD_ENV_SPACE;                                                  \
-        lenv[lenvc++] = thisarg;                                        \
-    } while (0)
-
-#define ADD_ENV_PAIR(envname, val)                                      \
-    do {                                                                \
-        char *envval;                                                   \
-        ADD_ENV_SPACE;                                                  \
-        if (virAsprintf(&envval, "%s=%s", envname, val) < 0)            \
-            goto no_memory;                                             \
-        lenv[lenvc++] = envval;                                         \
-    } while (0)
-
-#define ADD_ENV_COPY(envname)                                           \
-    do {                                                                \
-        char *val = getenv(envname);                                    \
-        if (val != NULL) {                                              \
-            ADD_ENV_PAIR(envname, val);                                 \
-        }                                                               \
-    } while (0)
+    virCommandPtr cmd;
 
-    /*
-     * The controller may call ip command, so we have to remain PATH.
-     */
-    ADD_ENV_COPY("PATH");
+    cmd = virCommandNewArgList(vm->def->emulator, NULL);
+
+    /* The controller may call ip command, so we have to remain PATH. */
+    virCommandAddEnvPass(cmd, "PATH");
 
-    log_level = virLogGetDefaultPriority();
-    if (virAsprintf(&tmp, "LIBVIRT_DEBUG=%d", log_level) < 0)
-        goto no_memory;
-    ADD_ENV(tmp);
+    virCommandAddEnvFormat(cmd, "LIBVIRT_DEBUG=%d",
+                           virLogGetDefaultPriority());
 
     if (virLogGetNbFilters() > 0) {
         filterstr = virLogGetFilters();
-        if (!filterstr)
-            goto no_memory;
-        ADD_ENV_PAIR("LIBVIRT_LOG_FILTERS", filterstr);
+        if (!filterstr) {
+            virReportOOMError();
+            goto cleanup;
+        }
+
+        virCommandAddEnvPair(cmd, "LIBVIRT_LOG_FILTERS", filterstr);
         VIR_FREE(filterstr);
     }
 
     if (driver->log_libvirtd) {
         if (virLogGetNbOutputs() > 0) {
             outputstr = virLogGetOutputs();
-            if (!outputstr)
-                goto no_memory;
-            ADD_ENV_PAIR("LIBVIRT_LOG_OUTPUTS", outputstr);
+            if (!outputstr) {
+                virReportOOMError();
+                goto cleanup;
+            }
+
+            virCommandAddEnvPair(cmd, "LIBVIRT_LOG_OUTPUTS", outputstr);
             VIR_FREE(outputstr);
         }
     } else {
-        if (virAsprintf(&tmp, "LIBVIRT_LOG_OUTPUTS=%d:stderr", log_level) < 0)
-            goto no_memory;
-        ADD_ENV(tmp);
+        virCommandAddEnvFormat(cmd,
+                               "LIBVIRT_LOG_OUTPUTS=%d:stderr",
+                               virLogGetDefaultPriority());
     }
 
-    ADD_ENV(NULL);
-
-    snprintf(appPtyStr, sizeof(appPtyStr), "%d", appPty);
-
-    emulator = vm->def->emulator;
-
-    ADD_ARG_LIT(emulator);
-    ADD_ARG_LIT("--name");
-    ADD_ARG_LIT(vm->def->name);
-    ADD_ARG_LIT("--console");
-    ADD_ARG_LIT(appPtyStr);
-    ADD_ARG_LIT("--background");
+    virCommandAddArgList(cmd, "--name", vm->def->name, NULL);
+    virCommandAddArg(cmd, "--console");
+    virCommandAddArgFormat(cmd, "%d", appPty);
+    virCommandAddArg(cmd, "--background");
 
     for (i = 0 ; i < nveths ; i++) {
-        ADD_ARG_LIT("--veth");
-        ADD_ARG_LIT(veths[i]);
+        virCommandAddArgList(cmd, "--veth", veths[i], NULL);
     }
 
-    ADD_ARG(NULL);
-
-    FD_SET(appPty, &keepfd);
-
     /* now that we know it is about to start call the hook if present */
     if (virHookPresent(VIR_HOOK_DRIVER_LXC)) {
         char *xml = virDomainDefFormat(vm->def, 0);
@@ -1391,52 +1316,15 @@ static int lxcControllerStart(lxc_driver_t *driver,
             goto cleanup;
     }
 
-    if (virExec(largv, lenv, &keepfd, &child,
-                -1, &logfd, &logfd,
-                VIR_EXEC_NONE) < 0)
-        goto cleanup;
-
-    /* We now wait for the process to exit - the controller
-     * will fork() itself into the background - waiting for
-     * it to exit thus guarentees it has written its pidfile
-     */
-    while ((rc = waitpid(child, &status, 0) == -1) && errno == EINTR);
-    if (rc == -1) {
-        virReportSystemError(errno,
-                             _("Cannot wait for '%s'"),
-                             largv[0]);
-        goto cleanup;
-    }
-
-    if (!(WIFEXITED(status) && WEXITSTATUS(status) == 0)) {
-        lxcError(VIR_ERR_INTERNAL_ERROR,
-                 _("Container '%s' unexpectedly shutdown during startup"),
-                 largv[0]);
-        goto cleanup;
-    }
+    virCommandPreserveFD(cmd, appPty);
+    virCommandSetOutputFD(cmd, &logfile);
+    virCommandSetErrorFD(cmd, &logfile);
 
-#undef ADD_ARG
-#undef ADD_ARG_LIT
-#undef ADD_ARG_SPACE
-#undef ADD_ENV_SPACE
-#undef ADD_ENV_PAIR
-
-    return 0;
+    ret = virCommandRun(cmd, NULL);
 
-no_memory:
-    virReportOOMError();
 cleanup:
-    if (largv) {
-        for (i = 0 ; i < largc ; i++)
-            VIR_FREE(largv[i]);
-        VIR_FREE(largv);
-    }
-    if (lenv) {
-        for (i=0 ; i < lenvc ; i++)
-            VIR_FREE(lenv[i]);
-        VIR_FREE(lenv);
-    }
-    return -1;
+    virCommandFree(cmd);
+    return ret;
 }
 
 
-- 
1.7.4.4




More information about the libvir-list mailing list