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:
Roger Pau Monne committed 2012-05-23 11:06:47 +01:00
1 parent b25df336bd
commit a185e8dfa2
5 files changed
+34 -8

No files matched your search

+1 -1
View File
@@ -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:
+2 -2
View File
@@ -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);
}
+1 -1
View File
@@ -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;
+12 -2
View File
@@ -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);
}
+18 -2
View File
@@ -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 */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.