diff options
-rw-r--r-- | tools/libxl/libxl.c | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_bootloader.c | 4 | ||||
-rw-r--r-- | tools/libxl/libxl_dm.c | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_exec.c | 14 | ||||
-rw-r--r-- | tools/libxl/libxl_internal.h | 20 |
5 files changed, 34 insertions, 8 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index f24d021c35..e3d05c2150 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1307,7 +1307,7 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass) 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 --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c index ca8409cf98..f3a590be59 100644 --- a/tools/libxl/libxl_bootloader.c +++ b/tools/libxl/libxl_bootloader.c @@ -385,6 +385,7 @@ static void bootloader_gotptys(libxl__egc *egc, libxl__openpty_state *op) 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__egc *egc, libxl__openpty_state *op) /* 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 --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index b1ca9db19a..5bf9a0b14b 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -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 --git a/tools/libxl/libxl_exec.c b/tools/libxl/libxl_exec.c index b46b8939ae..082bf44ced 100644 --- a/tools/libxl/libxl_exec.c +++ b/tools/libxl/libxl_exec.c @@ -66,8 +66,8 @@ static void check_open_fds(const char *what) 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 stdoutfd, int stderrfd, const char *arg0, /* 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 --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 0e084c16bd..04bd014fbf 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1141,8 +1141,24 @@ _hidden int libxl__wait_for_offspring(libxl__gc *gc, /* 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 */ |