[libvirt] [PATCH 2/6] lxc: driver: Convert emulator launching to virCommand
Daniel P. Berrange
berrange at redhat.com
Tue May 10 09:46:26 UTC 2011
On Fri, May 06, 2011 at 01:26:07PM -0400, Cole Robinson wrote:
> v2:
> Shorten a few virCommand calls
> s/remain/retain/
>
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
> src/lxc/lxc_driver.c | 185 ++++++++++----------------------------------------
> 1 files changed, 36 insertions(+), 149 deletions(-)
>
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index b94941d..2537f5d 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -1247,134 +1247,58 @@ 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 = virCommandNew(vm->def->emulator);
> +
> + /* The controller may call ip command, so we have to retain 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, "--console", NULL);
> + 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 +1315,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;
> }
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list