mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 22:25:25 +00:00
lxc: driver: Convert emulator launching to virCommand
v2: Shorten a few virCommand calls s/remain/retain/
This commit is contained in:
parent
35c1b35e25
commit
451cfd05a2
@ -1247,134 +1247,58 @@ static int lxcControllerStart(lxc_driver_t *driver,
|
|||||||
int nveths,
|
int nveths,
|
||||||
char **veths,
|
char **veths,
|
||||||
int appPty,
|
int appPty,
|
||||||
int logfd)
|
int logfile)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int rc;
|
int ret = -1;
|
||||||
int largc = 0, larga = 0;
|
|
||||||
const char **largv = NULL;
|
|
||||||
int lenvc = 0, lenva = 0;
|
|
||||||
const char **lenv = NULL;
|
|
||||||
char *filterstr;
|
char *filterstr;
|
||||||
char *outputstr;
|
char *outputstr;
|
||||||
char *tmp;
|
virCommandPtr cmd;
|
||||||
int log_level;
|
|
||||||
pid_t child;
|
|
||||||
int status;
|
|
||||||
fd_set keepfd;
|
|
||||||
char appPtyStr[30];
|
|
||||||
const char *emulator;
|
|
||||||
|
|
||||||
FD_ZERO(&keepfd);
|
cmd = virCommandNew(vm->def->emulator);
|
||||||
|
|
||||||
#define ADD_ARG_SPACE \
|
/* The controller may call ip command, so we have to retain PATH. */
|
||||||
do { \
|
virCommandAddEnvPass(cmd, "PATH");
|
||||||
if (largc == larga) { \
|
|
||||||
larga += 10; \
|
|
||||||
if (VIR_REALLOC_N(largv, larga) < 0) \
|
|
||||||
goto no_memory; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define ADD_ARG(thisarg) \
|
virCommandAddEnvFormat(cmd, "LIBVIRT_DEBUG=%d",
|
||||||
do { \
|
virLogGetDefaultPriority());
|
||||||
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)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The controller may call ip command, so we have to remain PATH.
|
|
||||||
*/
|
|
||||||
ADD_ENV_COPY("PATH");
|
|
||||||
|
|
||||||
log_level = virLogGetDefaultPriority();
|
|
||||||
if (virAsprintf(&tmp, "LIBVIRT_DEBUG=%d", log_level) < 0)
|
|
||||||
goto no_memory;
|
|
||||||
ADD_ENV(tmp);
|
|
||||||
|
|
||||||
if (virLogGetNbFilters() > 0) {
|
if (virLogGetNbFilters() > 0) {
|
||||||
filterstr = virLogGetFilters();
|
filterstr = virLogGetFilters();
|
||||||
if (!filterstr)
|
if (!filterstr) {
|
||||||
goto no_memory;
|
virReportOOMError();
|
||||||
ADD_ENV_PAIR("LIBVIRT_LOG_FILTERS", filterstr);
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
virCommandAddEnvPair(cmd, "LIBVIRT_LOG_FILTERS", filterstr);
|
||||||
VIR_FREE(filterstr);
|
VIR_FREE(filterstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (driver->log_libvirtd) {
|
if (driver->log_libvirtd) {
|
||||||
if (virLogGetNbOutputs() > 0) {
|
if (virLogGetNbOutputs() > 0) {
|
||||||
outputstr = virLogGetOutputs();
|
outputstr = virLogGetOutputs();
|
||||||
if (!outputstr)
|
if (!outputstr) {
|
||||||
goto no_memory;
|
virReportOOMError();
|
||||||
ADD_ENV_PAIR("LIBVIRT_LOG_OUTPUTS", outputstr);
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
virCommandAddEnvPair(cmd, "LIBVIRT_LOG_OUTPUTS", outputstr);
|
||||||
VIR_FREE(outputstr);
|
VIR_FREE(outputstr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (virAsprintf(&tmp, "LIBVIRT_LOG_OUTPUTS=%d:stderr", log_level) < 0)
|
virCommandAddEnvFormat(cmd,
|
||||||
goto no_memory;
|
"LIBVIRT_LOG_OUTPUTS=%d:stderr",
|
||||||
ADD_ENV(tmp);
|
virLogGetDefaultPriority());
|
||||||
}
|
}
|
||||||
|
|
||||||
ADD_ENV(NULL);
|
virCommandAddArgList(cmd, "--name", vm->def->name, "--console", NULL);
|
||||||
|
virCommandAddArgFormat(cmd, "%d", appPty);
|
||||||
snprintf(appPtyStr, sizeof(appPtyStr), "%d", appPty);
|
virCommandAddArg(cmd, "--background");
|
||||||
|
|
||||||
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");
|
|
||||||
|
|
||||||
for (i = 0 ; i < nveths ; i++) {
|
for (i = 0 ; i < nveths ; i++) {
|
||||||
ADD_ARG_LIT("--veth");
|
virCommandAddArgList(cmd, "--veth", veths[i], NULL);
|
||||||
ADD_ARG_LIT(veths[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ADD_ARG(NULL);
|
|
||||||
|
|
||||||
FD_SET(appPty, &keepfd);
|
|
||||||
|
|
||||||
/* now that we know it is about to start call the hook if present */
|
/* now that we know it is about to start call the hook if present */
|
||||||
if (virHookPresent(VIR_HOOK_DRIVER_LXC)) {
|
if (virHookPresent(VIR_HOOK_DRIVER_LXC)) {
|
||||||
char *xml = virDomainDefFormat(vm->def, 0);
|
char *xml = virDomainDefFormat(vm->def, 0);
|
||||||
@ -1391,52 +1315,15 @@ static int lxcControllerStart(lxc_driver_t *driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virExec(largv, lenv, &keepfd, &child,
|
virCommandPreserveFD(cmd, appPty);
|
||||||
-1, &logfd, &logfd,
|
virCommandSetOutputFD(cmd, &logfile);
|
||||||
VIR_EXEC_NONE) < 0)
|
virCommandSetErrorFD(cmd, &logfile);
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
/* We now wait for the process to exit - the controller
|
ret = virCommandRun(cmd, NULL);
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef ADD_ARG
|
|
||||||
#undef ADD_ARG_LIT
|
|
||||||
#undef ADD_ARG_SPACE
|
|
||||||
#undef ADD_ENV_SPACE
|
|
||||||
#undef ADD_ENV_PAIR
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
no_memory:
|
|
||||||
virReportOOMError();
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (largv) {
|
virCommandFree(cmd);
|
||||||
for (i = 0 ; i < largc ; i++)
|
return ret;
|
||||||
VIR_FREE(largv[i]);
|
|
||||||
VIR_FREE(largv);
|
|
||||||
}
|
|
||||||
if (lenv) {
|
|
||||||
for (i=0 ; i < lenvc ; i++)
|
|
||||||
VIR_FREE(lenv[i]);
|
|
||||||
VIR_FREE(lenv);
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user