Signed-off-by: Cole Robinson <crobinso(a)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