diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2014-12-18 19:06:06 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2014-12-18 19:06:06 +0000 |
commit | 5f76ed9108c5c48850cf339096527c4d53f0bc12 (patch) | |
tree | 6ccf306c97ccea0021bfea2f70c3654501953b45 /src/libstddjb/child_spawn1.c | |
parent | b19b3e0682d6e224c12b35308772114fe27372fe (diff) | |
download | skalibs-5f76ed9108c5c48850cf339096527c4d53f0bc12.tar.xz |
Separate socket from pipe in child_spawn. Less code in skaclient!
Diffstat (limited to 'src/libstddjb/child_spawn1.c')
-rw-r--r-- | src/libstddjb/child_spawn1.c | 115 |
1 files changed, 0 insertions, 115 deletions
diff --git a/src/libstddjb/child_spawn1.c b/src/libstddjb/child_spawn1.c deleted file mode 100644 index bb51ab9..0000000 --- a/src/libstddjb/child_spawn1.c +++ /dev/null @@ -1,115 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> -#include <sys/types.h> -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -#ifdef SKALIBS_HASPOSIXSPAWN - -#include <spawn.h> -#include <stdlib.h> -#include <skalibs/config.h> -#include <skalibs/env.h> - -pid_t child_spawn1 (char const *prog, char const *const *argv, char const *const *envp, int *fd, int to) -{ - posix_spawn_file_actions_t actions ; - int e ; - int p[2] ; - pid_t pid ; - int haspath = !!env_get("PATH") ; - if (pipe(p) < 0) return 0 ; - to = !!to ; - e = posix_spawn_file_actions_init(&actions) ; - if (e) goto err ; - e = posix_spawn_file_actions_addclose(&actions, p[!to]) ; - if (e) goto erractions ; - e = posix_spawn_file_actions_adddup2(&actions, p[to], to) ; - if (e) goto erractions ; - if (!haspath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; goto erractions ; } - e = posix_spawnp(&pid, prog, &actions, 0, (char *const *)argv, (char *const *)envp) ; - if (!haspath) unsetenv("PATH") ; - posix_spawn_file_actions_destroy(&actions) ; - fd_close(p[to]) ; - if (e) goto errp ; - *fd = p[!to] ; - return pid ; - - erractions: - posix_spawn_file_actions_destroy(&actions) ; - err: - fd_close(p[to]) ; - errp: - fd_close(p[!to]) ; - errno = e ; - return 0 ; -} - -#else - -#include <skalibs/allreadwrite.h> - -pid_t child_spawn1 (char const *prog, char const *const *argv, char const *const *envp, int *fd, int to) -{ - int e ; - int syncp[2] ; - int p[2] ; - pid_t pid ; - if (pipe(p) < 0) return 0 ; - if (pipecoe(syncp) < 0) - { - e = errno ; - fd_close(p[1]) ; - fd_close(p[0]) ; - errno = e ; - return 0 ; - } - to = !!to ; - pid = fork() ; - if (pid < 0) - { - e = errno ; - fd_close(syncp[1]) ; - fd_close(syncp[0]) ; - fd_close(p[1]) ; - fd_close(p[0]) ; - errno = e ; - return 0 ; - } - if (pid) - { - fd_close(syncp[0]) ; - fd_close(p[!to]) ; - if (fd_move(to, p[to]) < 0) goto err ; - pathexec_run(prog, argv, envp) ; -err: - e = errno ; - fd_write(syncp[1], (char *)&e, sizeof(e)) ; - _exit(127) ; - } - fd_close(syncp[1]) ; - fd_close(p[to]) ; - syncp[1] = fd_read(syncp[0], (char *)&e, sizeof(e)) ; - if (syncp[1] < 0) - { - e = errno ; - fd_close(syncp[0]) ; - fd_close(p[!to]) ; - errno = e ; - return 0 ; - } - fd_close(syncp[0]) ; - if (syncp[1] == sizeof(e)) - { - fd_close(p[!to]) ; - wait_pid(pid, &syncp[1]) ; - errno = e ; - return 0 ; - } - *fd = p[!to] ; - return pid ; -} - -#endif |