diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-12-02 18:21:32 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-12-02 18:21:32 +0200 |
commit | fd8d41c090765c010b3043576f79ca8828bd2c94 (patch) | |
tree | 3278cee9b271a2dbe16de274db6813f6f8baae3c /src/progman.c | |
parent | 23cad612301853307888a2a9ac2bc50be49e40fa (diff) | |
download | pies-fd8d41c090765c010b3043576f79ca8828bd2c94.tar.gz pies-fd8d41c090765c010b3043576f79ca8828bd2c94.tar.bz2 |
Actually fix the reporting of argv when expandenv is set.
* src/progman.c (prog_start_prologue): Split into two functions:
prog_init, invoked before fork, and prog_start_prologue proper,
invoked after fork. prog_init initializes the environment, argc,
and argv associated with prog.
(progman_run_comp): Call prog_init before calling prog_start_prologue
(the function is called from child process).
(prog_start): Run prog_init before forking.
Diffstat (limited to 'src/progman.c')
-rw-r--r-- | src/progman.c | 84 |
1 files changed, 62 insertions, 22 deletions
diff --git a/src/progman.c b/src/progman.c index db39b6d..d849368 100644 --- a/src/progman.c +++ b/src/progman.c @@ -156,6 +156,7 @@ destroy_prog (struct prog **pp) switch (p->type) { case TYPE_COMPONENT: + environ_free (p->v.p.env); if (p->v.p.comp->flags & CF_EXPANDENV) argv_free (p->v.p.argv); component_ref_decr (p->v.p.comp); @@ -817,40 +818,49 @@ progman_ws_error (const char *fmt, ...) va_end (ap); } -static void -prog_start_prologue (struct prog *prog) +/* + * Initialization of the environment and argc/argv members of + * struct prog. For regular components this is done in the main + * process, so that argv can be reported correctly via the ctl + * interface. For tcpmux components, which are run from the + * listener child, this is not so. That does little harm as + * these components are not visible from the ctl interface anyway. + */ +static int +prog_init (struct prog *prog) { - if (prog->v.p.comp->dir) + if ((prog->v.p.env = environ_create (environ)) == NULL) { - debug (1, (_("chdir %s"), prog->v.p.comp->dir)); - if (chdir (prog->v.p.comp->dir)) - logmsg (LOG_ERR, _("%s: cannot change to directory %s: %s"), - prog_tag (prog), prog->v.p.comp->dir, strerror (errno)); + logmsg (LOG_CRIT, "environ_create: %s", strerror (errno)); + return -1; } - - 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], NULL); } - envop_exec (prog->v.p.comp->envop, prog->v.p.env); + + if (envop_exec (prog->v.p.comp->envop, prog->v.p.env)) + { + logmsg (LOG_CRIT, "environ_exec: %s", strerror (errno)); + return -1; + } + if (SYSVINIT_ACTIVE) { size_t i; for (i = 0; sysvinit_environ_hint[i]; i++) - environ_add (prog->v.p.env, sysvinit_environ_hint[i]); + { + if (environ_add (prog->v.p.env, sysvinit_environ_hint[i])) + { + logmsg (LOG_CRIT, "environ_add: %s", strerror (errno)); + return -1; + } + } } - debug_environ (prog, 4); - - pies_priv_setup (&prog->v.p.comp->privs); - if (prog->v.p.comp->umask) - umask (prog->v.p.comp->umask); - - set_limits (prog_tag (prog), - prog->v.p.comp->limits ? - prog->v.p.comp->limits : pies_limits); + debug_environ (prog, 4); if (prog->v.p.comp->flags & CF_EXPANDENV) { @@ -863,7 +873,7 @@ prog_start_prologue (struct prog *prog) { logmsg (LOG_ERR, _("%s: can't split command line: %s"), prog_tag (prog), wordsplit_strerror (&ws)); - _exit (127); + return -1; } wordsplit_get_words (&ws, &prog->v.p.argc, &prog->v.p.argv); wordsplit_free (&ws); @@ -873,7 +883,7 @@ prog_start_prologue (struct prog *prog) prog->v.p.argc = prog->v.p.comp->argc; prog->v.p.argv = prog->v.p.comp->argv; } - + if (debug_level >= 1 && prog->v.p.argv) { int i; @@ -882,6 +892,27 @@ prog_start_prologue (struct prog *prog) logmsg_printf (LOG_DEBUG, " %s", quotearg (prog->v.p.argv[i])); logmsg_printf (LOG_DEBUG, "\n"); } + return 0; +} + +static void +prog_start_prologue (struct prog *prog) +{ + if (prog->v.p.comp->dir) + { + debug (1, (_("chdir %s"), prog->v.p.comp->dir)); + if (chdir (prog->v.p.comp->dir)) + logmsg (LOG_ERR, _("%s: cannot change to directory %s: %s"), + prog_tag (prog), prog->v.p.comp->dir, strerror (errno)); + } + + pies_priv_setup (&prog->v.p.comp->privs); + if (prog->v.p.comp->umask) + umask (prog->v.p.comp->umask); + + set_limits (prog_tag (prog), + prog->v.p.comp->limits ? + prog->v.p.comp->limits : pies_limits); } static void @@ -905,6 +936,10 @@ prog_execute (struct prog *prog) _exit (EX_SOFTWARE); } +/* + * Run a TCPMUX component. This function is invoked from a child + * process. + */ void progman_run_comp (struct component *comp, int fd, union pies_sockaddr_storage *sa, socklen_t salen) @@ -914,6 +949,8 @@ progman_run_comp (struct component *comp, int fd, prog->v.p.sa_storage = *sa; prog->v.p.sa_len = salen; prog->v.p.cclass = conn_class_lookup (comp->tag, sa, salen); + if (prog_init (prog)) + _exit (127); prog_start_prologue (prog); prog_sockenv (prog); prog_execute (prog); @@ -1004,6 +1041,9 @@ prog_start (struct prog *prog) return; } + if (prog_init (prog)) + return; //FIXME + redir[RETR_OUT] = open_redirector (prog, RETR_OUT); redir[RETR_ERR] = open_redirector (prog, RETR_ERR); |