-// we can use leaky setenv since we are about to exec or exit
-static void exec_helper(char **filenames, char **argv) ATTRIBUTE_NORETURN;
-static void exec_helper(char **filenames, char **argv)
-{
- char *p, *q;
- char var[2];
-
- var[1] = '\0';
-
- // read and delete ctrlfile
- q = xmalloc_open_read_close(filenames[0], NULL);
- unlink(filenames[0]);
- // provide datafile name
- xsetenv("DATAFILE", filenames[1]);
- // parse control file by "\n"
- while ((p = strchr(q, '\n')) != NULL
- && isalpha(*q)
- ) {
- *p++ = '\0';
- // q is a line of <SYM><VALUE>,
- // we are setting environment string <SYM>=<VALUE>.
- // Ignoring "l<datafile>", exporting others:
- if (*q != 'l') {
- var[0] = *q++;
- xsetenv(var, q);
- }
- // next line, plz!
- q = p;
- }
- // we are the helper, we wanna be silent.
- // this call reopens stdio fds to "/dev/null"
- // (no daemonization is done)
- bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO | DAEMON_ONLY_SANITIZE, NULL);
- BB_EXECVP(*argv, argv);
- exit(127); // it IS error if helper cannot be executed!
-}
-