aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-06-03 13:17:13 +0300
committerSergey Poznyakoff <gray@gnu.org>2019-06-03 13:41:34 +0300
commitf50a208f9df348cede2ba50b4f435351d8d3f19e (patch)
treec596fdf237b17713ab56c0269cdb1d339e306941 /src
parent8004bbaa1b31b14dd4c4d3886b5f57b103bf7405 (diff)
downloadpies-f50a208f9df348cede2ba50b4f435351d8d3f19e.tar.gz
pies-f50a208f9df348cede2ba50b4f435351d8d3f19e.tar.bz2
Finish the env re-implementation
* NEWS: Document the "env" statement and the PIES_MASTER_PID environment variable. Version 1.3.91 * configure.ac: Version 1.3.91 * doc/pies.texi: Document the new "env" statement syntax. Provide instructions on how to convert legacy "env" statement to the new form. * lib/envop.c (environ_unset): Take reference value as argument. If supplied, unset the variable only if its value matches the reference one. * lib/envop.h (environ_unset): Change proto. * src/pies.c (parse_legacy_env): Minor changes. (_cb_env_unset): Allow to specify value. * src/progman.c (run_command): Define PIES_MASTER_PID. * tests/env.at: Check the legacy env syntax. * tests/envop.at: Additional checks.
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
@@ -613,7 +613,7 @@ parse_legacy_env (char **argv, envop_t **envop)
613 { 613 {
614 msize = 2*len + 9 + vlen + 1; 614 msize = 2*len + 9 + vlen + 1;
615 mem = grecs_malloc (msize); 615 mem = grecs_malloc (msize);
616 snprintf (mem, msize, "${%s:-}${%s+%c}%s", 616 snprintf (mem, msize, "${%s:-}${%s:+%c}%s",
617 name, name, value[0], value + 1); 617 name, name, value[0], value + 1);
618 } 618 }
619 else 619 else
@@ -635,7 +635,7 @@ parse_legacy_env (char **argv, envop_t **envop)
635 635
636 msize = 2*len + 10 + vlen + 1; 636 msize = 2*len + 10 + vlen + 1;
637 mem = grecs_malloc (msize); 637 mem = grecs_malloc (msize);
638 snprintf (mem, msize, "%s${%s+%c}${%s:-}", 638 snprintf (mem, msize, "%s${%s:+%c}${%s:-}",
639 value, name, c, name); 639 value, name, c, name);
640 } 640 }
641 else 641 else
@@ -785,11 +785,15 @@ _cb_env_unset (enum grecs_callback_command cmd,
785 void *varptr, grecs_value_t *value, void *cb_data) 785 void *varptr, grecs_value_t *value, void *cb_data)
786{ 786{
787 struct component *comp = varptr; 787 struct component *comp = varptr;
788 char *p;
788 789
789 if (assert_scalar_stmt (locus, cmd) 790 if (assert_scalar_stmt (locus, cmd)
790 || assert_grecs_value_type (locus, value, GRECS_TYPE_STRING)) 791 || assert_grecs_value_type (locus, value, GRECS_TYPE_STRING))
791 return 1; 792 return 1;
792 if (envop_entry_add (&comp->envop, envop_unset, value->v.string, NULL)) 793 p = strchr (value->v.string, '=');
794 if (p)
795 *p++ = 0;
796 if (envop_entry_add (&comp->envop, envop_unset, value->v.string, p))
793 grecs_error (locus, errno, "envop_entry_add"); 797 grecs_error (locus, errno, "envop_entry_add");
794 return 0; 798 return 0;
795} 799}
diff --git a/src/progman.c b/src/progman.c
index b75a2db..a6dc418 100644
--- a/src/progman.c
+++ b/src/progman.c
@@ -821,7 +821,7 @@ prog_start_prologue (struct prog *prog)
821 { 821 {
822 size_t i; 822 size_t i;
823 for (i = 0; sockenv_var[i]; i++) 823 for (i = 0; sockenv_var[i]; i++)
824 environ_unset (prog->v.p.env, sockenv_var[i]); 824 environ_unset (prog->v.p.env, sockenv_var[i], NULL);
825 } 825 }
826 envop_exec (prog->v.p.comp->envop, prog->v.p.env); 826 envop_exec (prog->v.p.comp->envop, prog->v.p.env);
827 if (init_process) 827 if (init_process)
@@ -1978,10 +1978,12 @@ static void
1978run_command (struct action *act, struct prog *prog, unsigned retcode, 1978run_command (struct action *act, struct prog *prog, unsigned retcode,
1979 pid_t child_pid) 1979 pid_t child_pid)
1980{ 1980{
1981 pid_t pid; 1981 pid_t pid, master_pid;
1982 char *argv[4]; 1982 char *argv[4];
1983 char buf[INT_BUFSIZE_BOUND (uintmax_t)]; 1983 char buf[INT_BUFSIZE_BOUND (uintmax_t)];
1984 1984
1985 master_pid = getpid ();
1986
1985 /* FIXME: optionally set output redirectors for this command? */ 1987 /* FIXME: optionally set output redirectors for this command? */
1986 pid = fork (); 1988 pid = fork ();
1987 1989
@@ -1998,6 +2000,7 @@ run_command (struct action *act, struct prog *prog, unsigned retcode,
1998 setsid (); 2000 setsid ();
1999 setenv ("PIES_VERSION", PACKAGE_VERSION, 1); 2001 setenv ("PIES_VERSION", PACKAGE_VERSION, 1);
2000 setenv ("PIES_COMPONENT", prog_tag (prog), 1); 2002 setenv ("PIES_COMPONENT", prog_tag (prog), 1);
2003 setenv ("PIES_MASTER_PID", umaxtostr (master_pid, buf), 1);
2001 setenv ("PIES_PID", umaxtostr (child_pid, buf), 1); 2004 setenv ("PIES_PID", umaxtostr (child_pid, buf), 1);
2002 if (retcode & STATUS_SIG_BIT) 2005 if (retcode & STATUS_SIG_BIT)
2003 setenv ("PIES_SIGNAL", umaxtostr (STATUS_CODE (retcode), buf), 1); 2006 setenv ("PIES_SIGNAL", umaxtostr (STATUS_CODE (retcode), buf), 1);

Return to:

Send suggestions and report system problems to the System administrator.