From 3d91d9ce645efa020800b85be1ac2727ebcbad19 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Wed, 6 Nov 2024 08:05:33 +0000 Subject: Prepare for 2.9.7.0 ; rework forx/forstdin -p, add -P maxpar Also refactor several things to keep global footprint low Signed-off-by: Laurent Bercot --- src/libexecline/deps-lib/execline | 2 ++ src/libexecline/el_forx_pidinfo.c | 25 +++++++++++++++++++++++++ src/libexecline/el_gspawn0.c | 8 ++------ src/libexecline/el_modif_and_exec.c | 5 ++--- src/libexecline/el_modif_and_spawn.c | 13 +++++++------ src/libexecline/el_modifs_and_exec.c | 5 ++--- src/libexecline/el_spawn0.c | 8 ++------ src/libexecline/el_trueargv.c | 7 +++++++ 8 files changed, 49 insertions(+), 24 deletions(-) create mode 100644 src/libexecline/el_forx_pidinfo.c create mode 100644 src/libexecline/el_trueargv.c (limited to 'src/libexecline') diff --git a/src/libexecline/deps-lib/execline b/src/libexecline/deps-lib/execline index 608fa7f..d5888c0 100644 --- a/src/libexecline/deps-lib/execline +++ b/src/libexecline/deps-lib/execline @@ -1,4 +1,5 @@ el_execsequence.o +el_forx_pidinfo.o el_getstrict.o el_modif_and_exec.o el_modif_and_spawn.o @@ -15,6 +16,7 @@ el_substandrun.o el_substandrun_str.o el_substitute.o el_transform.o +el_trueargv.o el_vardupl.o exlsn_define.o exlsn_elglob.o diff --git a/src/libexecline/el_forx_pidinfo.c b/src/libexecline/el_forx_pidinfo.c new file mode 100644 index 0000000..61c5a26 --- /dev/null +++ b/src/libexecline/el_forx_pidinfo.c @@ -0,0 +1,25 @@ +/* ISC license. */ + +#include + +#include + +el_forx_pidinfo_t *el_forx_pidinfo = 0 ; + +int el_forx_isok (unsigned short const *tab, unsigned int n, unsigned short code) +{ + unsigned int i = 0 ; + for (; i < n ; i++) if (code == tab[i]) break ; + return i < n ; +} + +void el_forx_sigchld_handler (int sig) +{ + for (;;) + { + ssize_t r = wait_pids_nohang(el_forx_pidinfo->tab, el_forx_pidinfo->len, &el_forx_pidinfo->wstat) ; + if (r <= 0) break ; + el_forx_pidinfo->tab[r-1] = el_forx_pidinfo->tab[--el_forx_pidinfo->len] ; + } + (void)sig ; +} diff --git a/src/libexecline/el_gspawn0.c b/src/libexecline/el_gspawn0.c index d6e0d3a..2a5cb97 100644 --- a/src/libexecline/el_gspawn0.c +++ b/src/libexecline/el_gspawn0.c @@ -7,10 +7,6 @@ pid_t el_gspawn0 (char const *prog, char const *const *argv, char const *const *envp) { - if (!argv[0]) - { - static char const *const newargv[3] = { EXECLINE_BINPREFIX "exit", "0", 0 } ; - return gcspawn(newargv[0], newargv, envp, 0, 0, 0) ; - } - else return gcspawn(prog, argv, envp, 0, 0, 0) ; + if (!argv[0]) argv = el_trueargv ; + return gcspawn(prog, argv, envp, 0, 0, 0) ; } diff --git a/src/libexecline/el_modif_and_exec.c b/src/libexecline/el_modif_and_exec.c index e2a3618..c94d301 100644 --- a/src/libexecline/el_modif_and_exec.c +++ b/src/libexecline/el_modif_and_exec.c @@ -22,12 +22,11 @@ void el_modif_and_exec (char const *const *argv, char const *var, char const *va if (doimport) { size_t m = 0 ; - char const *newargv[env_len(argv) + 6] ; + char const *newargv[env_len(argv) + 5] ; newargv[m++] = EXECLINE_BINPREFIX "importas" ; - newargv[m++] = "-ui" ; + newargv[m++] = "-uSi" ; newargv[m++] = "--" ; newargv[m++] = var ; - newargv[m++] = var ; while (*argv) newargv[m++] = *argv++ ; newargv[m++] = 0 ; xmexec0_n(newargv, value ? modifs : var, value ? modiflen : varlen + 1, 1) ; diff --git a/src/libexecline/el_modif_and_spawn.c b/src/libexecline/el_modif_and_spawn.c index 863ca92..7f36a37 100644 --- a/src/libexecline/el_modif_and_spawn.c +++ b/src/libexecline/el_modif_and_spawn.c @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -22,18 +23,18 @@ pid_t el_modif_and_spawn (char const *const *argv, char const *var, char const * memcpy(modifs + varlen + 1, value, modiflen - varlen - 1) ; } env_mergen(newenv, envlen + 2, (char const *const *)environ, envlen, value ? modifs : var, value ? modiflen : varlen + 1, 1) ; - if (doimport) + if (doimport && argv[0]) { size_t m = 0 ; - char const *newargv[env_len(argv) + 6] ; + char const *newargv[env_len(argv) + 5] ; newargv[m++] = EXECLINE_BINPREFIX "importas" ; - newargv[m++] = "-ui" ; + newargv[m++] = "-uSi" ; newargv[m++] = "--" ; newargv[m++] = var ; - newargv[m++] = var ; while (*argv) newargv[m++] = *argv++ ; newargv[m++] = 0 ; - return el_spawn0(newargv[0], newargv, newenv) ; + return cspawn(newargv[0], newargv, newenv, CSPAWN_FLAGS_SIGBLOCKNONE, 0, 0) ; } - else return el_spawn0(argv[0], argv, newenv) ; + if (!argv[0]) argv = el_trueargv ; + return cspawn(argv[0], argv, newenv, CSPAWN_FLAGS_SIGBLOCKNONE, 0, 0) ; } diff --git a/src/libexecline/el_modifs_and_exec.c b/src/libexecline/el_modifs_and_exec.c index ca72291..675e284 100644 --- a/src/libexecline/el_modifs_and_exec.c +++ b/src/libexecline/el_modifs_and_exec.c @@ -47,7 +47,7 @@ void el_modifs_and_exec (char const *const *argv, char const *const *vars, char { size_t m = 0 ; size_t ypos = 0 ; - char const *newargv[env_len(argv) + 3 + 5 * yesn] ; + char const *newargv[env_len(argv) + 3 + 4 * yesn] ; char yesvars[yeslen ? yeslen : 1] ; newargv[m++] = EXECLINE_BINPREFIX "multisubstitute" ; for (size_t i = 0 ; i < n ; i++) if (values[i]) @@ -55,10 +55,9 @@ void el_modifs_and_exec (char const *const *argv, char const *const *vars, char size_t len = strlen(vars[i]) + 1 ; char *p = yesvars + ypos ; newargv[m++] = " importas" ; - newargv[m++] = " -ui" ; + newargv[m++] = " -uSi" ; newargv[m++] = " --" ; newargv[m++] = p ; - newargv[m++] = p ; yesvars[ypos++] = ' ' ; memcpy(yesvars + ypos, vars[i], len) ; ypos += len ; diff --git a/src/libexecline/el_spawn0.c b/src/libexecline/el_spawn0.c index d397557..a05ed5d 100644 --- a/src/libexecline/el_spawn0.c +++ b/src/libexecline/el_spawn0.c @@ -7,10 +7,6 @@ pid_t el_spawn0 (char const *prog, char const *const *argv, char const *const *envp) { - if (!argv[0]) - { - static char const *const newargv[3] = { EXECLINE_BINPREFIX "exit", "0", 0 } ; - return cspawn(newargv[0], newargv, envp, 0, 0, 0) ; - } - else return cspawn(prog, argv, envp, 0, 0, 0) ; + if (!argv[0]) argv = el_trueargv ; + return cspawn(prog, argv, envp, 0, 0, 0) ; } diff --git a/src/libexecline/el_trueargv.c b/src/libexecline/el_trueargv.c new file mode 100644 index 0000000..c08e127 --- /dev/null +++ b/src/libexecline/el_trueargv.c @@ -0,0 +1,7 @@ +/* ISC license. */ + +#include +#include + +static char const *const el_trueargv_[3] = { EXECLINE_BINPREFIX "exit", "0", 0 } ; +char const *const *el_trueargv = el_trueargv_ ; -- cgit v1.3.1