aboutsummaryrefslogtreecommitdiffstats
path: root/src/libexecline
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexecline')
-rw-r--r--src/libexecline/deps-lib/execline2
-rw-r--r--src/libexecline/el_forx_pidinfo.c25
-rw-r--r--src/libexecline/el_gspawn0.c8
-rw-r--r--src/libexecline/el_modif_and_exec.c5
-rw-r--r--src/libexecline/el_modif_and_spawn.c13
-rw-r--r--src/libexecline/el_modifs_and_exec.c5
-rw-r--r--src/libexecline/el_spawn0.c8
-rw-r--r--src/libexecline/el_trueargv.c7
8 files changed, 49 insertions, 24 deletions
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 <skalibs/djbunix.h>
+
+#include <execline/execline.h>
+
+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 <skalibs/posixplz.h>
#include <skalibs/env.h>
+#include <skalibs/cspawn.h>
#include <execline/config.h>
#include <execline/execline.h>
@@ -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 <execline/config.h>
+#include <execline/execline.h>
+
+static char const *const el_trueargv_[3] = { EXECLINE_BINPREFIX "exit", "0", 0 } ;
+char const *const *el_trueargv = el_trueargv_ ;