aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pies.c10
-rw-r--r--src/progman.c7
2 files changed, 12 insertions, 5 deletions
diff --git a/src/pies.c b/src/pies.c
index 2387cef..fe8d9b4 100644
--- a/src/pies.c
+++ b/src/pies.c
@@ -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);

Return to:

Send suggestions and report system problems to the System administrator.