[libvirt] PATCH: Support SDL configuration for QEMU driver

Jim Meyering jim at meyering.net
Thu Oct 9 14:31:49 UTC 2008


"Daniel P. Berrange" <berrange at redhat.com> wrote:
> On Thu, Oct 02, 2008 at 07:37:38PM +0200, Jim Meyering wrote:
>> "Daniel P. Berrange" <berrange at redhat.com> wrote:
>> ...
>> > Now previously since we just use 'execv' the QEMU process would just
>> > inherit all libvirtd's environment variables. When we now use execve()
>> > no variables are inherited - we have to explicitly set all the ones
>> > we need. I'm not sure what we should consider the mimimum required?
>> >
>> > I'm merely setting  'LC_ALL=C' to ensure it runs in C locale. Do we
>> > need to set $PATH for QEMU - maybe ? Anything else which is good
>> > practice to set ?
>>
>> If QEMU uses PATH, then propagating that is necessary.
>> I guess it's debatable whether to use PATH=$PATH or
>> to use some hard-coded default on the RHS.  But using PATH=$PATH
>> seems friendlier, in case whatever QEMU uses is in some non-default
>> location.
>>
>> If it uses mkstemp or the like, then including TMPDIR would be good.
>> Depending on QEMU, maybe things like HOME, USER, LOGNAME too.
>
> Here's an update which sets those, if they're present in libvirtd env.
> The changed bit is here:
>
> +    ADD_ENV_COPY("LD_PRELOAD");
> +    ADD_ENV_COPY("LD_LIBRARY_PATH");

Looks good.
I guess you're adding those two in case qemu uses dlopen.

This time I've reviewed the rest of the patch.
Comments below:

> +    ADD_ENV_COPY("PATH");
> +    ADD_ENV_COPY("HOME");
> +    ADD_ENV_COPY("USER");
> +    ADD_ENV_COPY("LOGNAME");
> +    ADD_ENV_COPY("TMPDIR");
...
> diff --git a/src/qemu_conf.c b/src/qemu_conf.c
> +#define ADD_ENV_SPACE                                                   \
...
> +    do {                                                                \
> +        if (qenvc == qenva) {                                           \
> +            qenva += 10;                                                \
> +            if (VIR_REALLOC_N(qenv, qenva) < 0)                         \
> +                goto no_memory;                                         \
> +        }                                                               \
> +    } while (0)
> +
> +#define ADD_ENV(thisarg)                                                \
> +    do {                                                                \
> +        ADD_ENV_SPACE;                                                  \
> +        qenv[qenvc++] = thisarg;                                        \
> +    } while (0)
> +
> +#define ADD_ENV_LIT(thisarg)                                            \
> +    do {                                                                \
> +        ADD_ENV_SPACE;                                                  \
> +        if ((qenv[qenvc++] = strdup(thisarg)) == NULL)                  \
> +            goto no_memory;                                             \
> +    } while (0)
> +
> +#define ADD_ENV_COPY(envname)                                           \
> +    do {                                                                \
> +        char *val = getenv(envname);                                    \
> +        ADD_ENV_SPACE;                                                  \
> +        if (val != NULL &&                                              \
> +            (qenv[qenvc++] = strdup(val)) == NULL)                      \
> +            goto no_memory;                                             \
> +    } while (0)

Doesn't this need to be adding "envname=val" strings,
rather than just "val"?

If it works as-is, then maybe none of these is actually used
(or at least they're not exercised in tests).

>      snprintf(memory, sizeof(memory), "%lu", vm->def->memory/1024);
>      snprintf(vcpus, sizeof(vcpus), "%lu", vm->def->vcpus);
> +
> +    ADD_ENV_LIT("LC_ALL=C");
> +
> +    ADD_ENV_COPY("LD_PRELOAD");
> +    ADD_ENV_COPY("LD_LIBRARY_PATH");
> +    ADD_ENV_COPY("PATH");
> +    ADD_ENV_COPY("HOME");
> +    ADD_ENV_COPY("USER");
> +    ADD_ENV_COPY("LOGNAME");
> +    ADD_ENV_COPY("TMPDIR");
>
>      emulator = vm->def->emulator;
...
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -22,11 +22,14 @@ static struct qemud_driver driver;
>
>  #define MAX_FILE 4096
>
> -static int testCompareXMLToArgvFiles(const char *xml, const char *cmd, int extraFlags) {
> +static int testCompareXMLToArgvFiles(const char *xml,
...
> +    tmp = qenv;
> +    len = 0;
> +    while (*tmp) {
> +        if (actualargv[0])
> +            strcat(actualargv, " ");
> +        strcat(actualargv, *tmp);
> +        tmp++;
> +    }
>      tmp = argv;
>      len = 0;

No big deal, but both of those "len = 0" assignments
can be removed, since "len" is no longer used.




More information about the libvir-list mailing list