[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxl: pass env vars to libxl__exec
# HG changeset patch # User Roger Pau Monne <roger.pau@xxxxxxxxxx> # Date 1337767607 -3600 # Node ID 0bd90b16892c663a757e9c235d5b9ebe70d4e651 # Parent 6dc80df50fa8a01da0494a6413d70573aeeef7a2 libxl: pass env vars to libxl__exec Add another parameter to libxl__exec call that contains the environment variables to use when performing the execvp call. Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxx> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Committed-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- diff -r 6dc80df50fa8 -r 0bd90b16892c tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue May 22 16:30:11 2012 +0200 +++ b/tools/libxl/libxl.c Wed May 23 11:06:47 2012 +0100 @@ -1307,7 +1307,7 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, args[2] = "-autopass"; } - libxl__exec(autopass_fd, -1, -1, args[0], args); + libxl__exec(gc, autopass_fd, -1, -1, args[0], args, NULL); abort(); x_fail: diff -r 6dc80df50fa8 -r 0bd90b16892c tools/libxl/libxl_bootloader.c --- a/tools/libxl/libxl_bootloader.c Tue May 22 16:30:11 2012 +0200 +++ b/tools/libxl/libxl_bootloader.c Wed May 23 11:06:47 2012 +0100 @@ -385,6 +385,7 @@ static void bootloader_gotptys(libxl__eg libxl__bootloader_state *bl = CONTAINER_OF(op, *bl, openpty); STATE_AO_GC(bl->ao); int rc, r; + char *const env[] = { "TERM", "vt100", NULL }; if (bl->openpty.rc) { rc = bl->openpty.rc; @@ -478,8 +479,7 @@ static void bootloader_gotptys(libxl__eg /* child */ r = login_tty(libxl__carefd_fd(bl->ptys[0].slave)); if (r) { LOGE(ERROR, "login_tty failed"); exit(-1); } - setenv("TERM", "vt100", 1); - libxl__exec(-1, -1, -1, bl->args[0], (char**)bl->args); + libxl__exec(gc, -1, -1, -1, bl->args[0], (char **) bl->args, env); exit(-1); } diff -r 6dc80df50fa8 -r 0bd90b16892c tools/libxl/libxl_dm.c --- a/tools/libxl/libxl_dm.c Tue May 22 16:30:11 2012 +0200 +++ b/tools/libxl/libxl_dm.c Wed May 23 11:06:47 2012 +0100 @@ -1016,7 +1016,7 @@ retry_transaction: goto out_close; if (!rc) { /* inner child */ setsid(); - libxl__exec(null, logfile_w, logfile_w, dm, args); + libxl__exec(gc, null, logfile_w, logfile_w, dm, args, NULL); } rc = 0; diff -r 6dc80df50fa8 -r 0bd90b16892c tools/libxl/libxl_exec.c --- a/tools/libxl/libxl_exec.c Tue May 22 16:30:11 2012 +0200 +++ b/tools/libxl/libxl_exec.c Wed May 23 11:06:47 2012 +0100 @@ -66,8 +66,8 @@ static void check_open_fds(const char *w if (badness) abort(); } -void libxl__exec(int stdinfd, int stdoutfd, int stderrfd, const char *arg0, - char **args) +void libxl__exec(libxl__gc *gc, int stdinfd, int stdoutfd, int stderrfd, + const char *arg0, char *const args[], char *const env[]) /* call this in the child */ { if (stdinfd != -1) @@ -90,8 +90,18 @@ void libxl__exec(int stdinfd, int stdout /* in case our caller set it to IGN. subprocesses are entitled * to assume they got DFL. */ + if (env != NULL) { + for (int i = 0; env[i] != NULL && env[i+1] != NULL; i += 2) { + if (setenv(env[i], env[i+1], 1) < 0) { + LOGEV(ERROR, errno, "setting env vars (%s = %s)", + env[i], env[i+1]); + goto out; + } + } + } execvp(arg0, args); +out: fprintf(stderr, "libxl: cannot execute %s: %s\n", arg0, strerror(errno)); _exit(-1); } diff -r 6dc80df50fa8 -r 0bd90b16892c tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue May 22 16:30:11 2012 +0200 +++ b/tools/libxl/libxl_internal.h Wed May 23 11:06:47 2012 +0100 @@ -1141,8 +1141,24 @@ _hidden int libxl__wait_for_offspring(li /* low-level stuff, for synchronous subprocesses etc. */ -_hidden void libxl__exec(int stdinfd, int stdoutfd, int stderrfd, - const char *arg0, char **args); // logs errors, never returns +/* + * env should be passed using the following format, + * + * env[0]: name of env variable + * env[1]: value of env variable + * env[n]: ... + * + * So it efectively becomes something like: + * export env[n]=env[n+1] + * (where n%2 = 0) + * + * The last entry of the array always has to be NULL. + * + * Logs errors, never returns. + */ +_hidden void libxl__exec(libxl__gc *gc, int stdinfd, int stdoutfd, + int stderrfd, const char *arg0, char *const args[], + char *const env[]); /* from xl_create */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |