diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2023-09-09 03:55:38 +0000 |
---|---|---|
committer | Laurent Bercot <ska@appnovation.com> | 2023-09-09 03:55:38 +0000 |
commit | 4cce87557feb6933c284d234c448bd8bde4facae (patch) | |
tree | 7417e8558b0770da2ae24df8abd755dbc913855f /src/libstddjb/child_spawn0.c | |
parent | a646c96d5f7ec4b4e0bb538a41fc202c2cdb3309 (diff) | |
download | skalibs-4cce87557feb6933c284d234c448bd8bde4facae.tar.xz |
cspawn revamp, part 1. Prepare for 2.14.0.0.
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libstddjb/child_spawn0.c')
-rw-r--r-- | src/libstddjb/child_spawn0.c | 101 |
1 files changed, 2 insertions, 99 deletions
diff --git a/src/libstddjb/child_spawn0.c b/src/libstddjb/child_spawn0.c index ea7a5b1..b1353b6 100644 --- a/src/libstddjb/child_spawn0.c +++ b/src/libstddjb/child_spawn0.c @@ -1,105 +1,8 @@ /* ISC license. */ -#include <skalibs/sysdeps.h> - -#include <errno.h> - -#ifdef SKALIBS_HASPOSIXSPAWN - -#include <signal.h> -#include <stdlib.h> -#include <spawn.h> - -#include <skalibs/config.h> -#include <skalibs/djbunix.h> +#include <skalibs/cspawn.h> pid_t child_spawn0 (char const *prog, char const *const *argv, char const *const *envp) { - pid_t pid ; - posix_spawnattr_t attr ; - sigset_t set ; - int e ; - int nopath = !getenv("PATH") ; -#ifdef SKALIBS_HASPOSIXSPAWNEARLYRETURN - int p[2] ; - if (pipecoe(p) == -1) return 0 ; -#endif - e = posix_spawnattr_init(&attr) ; - if (e) goto err ; - sigemptyset(&set) ; - e = posix_spawnattr_setsigmask(&attr, &set) ; - if (e) goto errattr ; - e = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGMASK) ; - if (e) goto errattr ; - if (nopath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; goto errattr ; } - e = posix_spawnp(&pid, prog, 0, &attr, (char *const *)argv, (char *const *)envp) ; - if (nopath) unsetenv("PATH") ; - if (e) goto errattr ; - - posix_spawnattr_destroy(&attr) ; -#ifdef SKALIBS_HASPOSIXSPAWNEARLYRETURN - return child_spawn_workaround(pid, p) ; -#else - return pid ; -#endif - - errattr: - posix_spawnattr_destroy(&attr) ; - err: -#ifdef SKALIBS_HASPOSIXSPAWNEARLYRETURN - fd_close(p[1]) ; - fd_close(p[0]) ; -#endif - errno = e ; - return 0 ; + return cspawn(prog, argv, envp, CSPAWN_FLAGS_SIGBLOCKNONE, 0, 0) ; } - -#else - -#include <unistd.h> - -#include <skalibs/allreadwrite.h> -#include <skalibs/sig.h> -#include <skalibs/djbunix.h> -#include <skalibs/exec.h> - -pid_t child_spawn0 (char const *prog, char const *const *argv, char const *const *envp) -{ - pid_t pid ; - int p[2] ; - char c ; - - if (pipecoe(p) == -1) return 0 ; - pid = fork() ; - if (pid < 0) - { - fd_close(p[1]) ; - fd_close(p[0]) ; - return 0 ; - } - if (!pid) - { - sig_blocknone() ; - exec_ae(prog, argv, envp) ; - c = errno ; - fd_write(p[1], &c, 1) ; - _exit(127) ; - } - fd_close(p[1]) ; - p[1] = fd_read(p[0], &c, 1) ; - if (p[1] < 0) - { - fd_close(p[0]) ; - return 0 ; - } - fd_close(p[0]) ; - if (p[1]) - { - wait_pid(pid, &p[0]) ; - errno = (unsigned char)c ; - return 0 ; - } - return pid ; -} - -#endif |