mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
b25df336bd
commit
a185e8dfa2
5 files changed
+34
-8
No files matched your search
+1
-1
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||