diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-06-03 13:17:13 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-06-03 13:41:34 +0300 |
commit | f50a208f9df348cede2ba50b4f435351d8d3f19e (patch) | |
tree | c596fdf237b17713ab56c0269cdb1d339e306941 /src | |
parent | 8004bbaa1b31b14dd4c4d3886b5f57b103bf7405 (diff) | |
download | pies-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.c | 10 | ||||
-rw-r--r-- | src/progman.c | 7 |
2 files changed, 12 insertions, 5 deletions
@@ -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 | |||
1978 | run_command (struct action *act, struct prog *prog, unsigned retcode, | 1978 | run_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); |