diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pies.c | 10 | ||||
-rw-r--r-- | src/progman.c | 7 |
2 files changed, 12 insertions, 5 deletions
@@ -610,13 +610,13 @@ parse_legacy_env (char **argv, envop_t **envop) { name[--len] = 0; if (c_ispunct (value[0])) { msize = 2*len + 9 + vlen + 1; mem = grecs_malloc (msize); - snprintf (mem, msize, "${%s:-}${%s+%c}%s", + snprintf (mem, msize, "${%s:-}${%s:+%c}%s", name, name, value[0], value + 1); } else { msize = len + vlen + 6; snprintf (mem, msize, "${%s:-}%s", name, value); @@ -632,13 +632,13 @@ parse_legacy_env (char **argv, envop_t **envop) { int c = value[vlen-1]; value[--vlen] = 0; msize = 2*len + 10 + vlen + 1; mem = grecs_malloc (msize); - snprintf (mem, msize, "%s${%s+%c}${%s:-}", + snprintf (mem, msize, "%s${%s:+%c}${%s:-}", value, name, c, name); } else { msize = len + vlen + 6; snprintf (mem, msize, "%s${%s:-}", value, name); @@ -782,17 +782,21 @@ _cb_env_set (enum grecs_callback_command cmd, static int _cb_env_unset (enum grecs_callback_command cmd, grecs_locus_t *locus, void *varptr, grecs_value_t *value, void *cb_data) { struct component *comp = varptr; + char *p; if (assert_scalar_stmt (locus, cmd) || assert_grecs_value_type (locus, value, GRECS_TYPE_STRING)) return 1; - if (envop_entry_add (&comp->envop, envop_unset, value->v.string, NULL)) + p = strchr (value->v.string, '='); + if (p) + *p++ = 0; + if (envop_entry_add (&comp->envop, envop_unset, value->v.string, p)) grecs_error (locus, errno, "envop_entry_add"); return 0; } struct grecs_keyword cb_env_keywords[] = { { "clear", diff --git a/src/progman.c b/src/progman.c index b75a2db..a6dc418 100644 --- a/src/progman.c +++ b/src/progman.c @@ -818,13 +818,13 @@ prog_start_prologue (struct prog *prog) prog->v.p.env = environ_create (environ); if (prog->v.p.comp->flags & CF_SOCKENV) { size_t i; for (i = 0; sockenv_var[i]; i++) - environ_unset (prog->v.p.env, sockenv_var[i]); + environ_unset (prog->v.p.env, sockenv_var[i], NULL); } envop_exec (prog->v.p.comp->envop, prog->v.p.env); if (init_process) { size_t i; for (i = 0; sysvinit_environ_hint[i]; i++) @@ -1975,16 +1975,18 @@ status_matches_p (struct action *act, unsigned status) } static void run_command (struct action *act, struct prog *prog, unsigned retcode, pid_t child_pid) { - pid_t pid; + pid_t pid, master_pid; char *argv[4]; char buf[INT_BUFSIZE_BOUND (uintmax_t)]; + master_pid = getpid (); + /* FIXME: optionally set output redirectors for this command? */ pid = fork (); if (pid == (pid_t) -1) { logmsg (LOG_ERR, "fork: %s", strerror (errno)); @@ -1995,12 +1997,13 @@ run_command (struct action *act, struct prog *prog, unsigned retcode, { debug (1, (_("executing %s"), act->command)); /* Child */ setsid (); setenv ("PIES_VERSION", PACKAGE_VERSION, 1); setenv ("PIES_COMPONENT", prog_tag (prog), 1); + setenv ("PIES_MASTER_PID", umaxtostr (master_pid, buf), 1); setenv ("PIES_PID", umaxtostr (child_pid, buf), 1); if (retcode & STATUS_SIG_BIT) setenv ("PIES_SIGNAL", umaxtostr (STATUS_CODE (retcode), buf), 1); else setenv ("PIES_STATUS", umaxtostr (STATUS_CODE (retcode), buf), 1); |