skalibs

Mirror/fork of https://skarnet.org/software/skalibs/
git clone https://ccx.te2000.cz/git/skalibs
Log | Files | Refs | README | LICENSE

commit 21e6ea800cc96ba76e94ad8de1dfa58ab1b7ceb6
parent 481fdcb1faa76056c9c4d91cc7078d1c05b15f37
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Wed, 25 Nov 2020 15:00:45 +0000

 child_spawn cleanup, configure cleanup

Diffstat:
Mconfigure | 185+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mpackage/deps.mak | 16+++++-----------
Msrc/libstddjb/child_spawn.c | 47+++++++++++++++++++++++------------------------
Msrc/libstddjb/child_spawn0.c | 15+++++++++------
Msrc/libstddjb/child_spawn1_internal.c | 101+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/libstddjb/child_spawn2.c | 39++++++++++++++++++---------------------
Msrc/libstddjb/child_spawn3.c | 36+++++++++++++++++-------------------
7 files changed, 230 insertions(+), 209 deletions(-)

diff --git a/configure b/configure @@ -3,6 +3,8 @@ cd `dirname "$0"` . package/info +# Helper functions + usage () { cat <<EOF Usage: $0 [OPTION]... [TARGET] @@ -51,18 +53,16 @@ EOF exit 0 } -# Helper functions - # If your system does not have printf, you can comment this, but it is # generally not a good idea to use echo. # See http://etalabs.net/sh_tricks.html echo () { - IFS=" " + IFS=' ' printf %s\\n "$*" } echon () { - IFS=" " + IFS=' ' printf %s "$*" } @@ -124,16 +124,24 @@ tryldflag () { fi } - # Sysdeps determination functions iscached () { - if test -r "$tmps" && grep -qF "${1}: " "$tmps" ; then - v=`grep -F "${1}: " "$tmps" | tail -n 1 | awk '{print $2;}'` - echo "${1}: $v" >> "$sysdeps/sysdeps" - echo " ... user-provided: $v" - return 0 ; + if test -r "$tmps" && grep -q "^${1}: " "$tmps" ; then + grep "^${1}: " "$tmps" | tail -n 1 | + { + IFS=' ' + read -r k v ldlibs + if test -n "$ldlibs" ; then + echo " ... user-provided: $v with linker args: $ldlibs" + echo "$ldlibs" >&3 + else + echo " ... user-provided: $v" + fi + echo "${1}: $v" >> "$sysdeps/sysdeps" + return 0 ; + } else return 1 ; fi @@ -284,39 +292,50 @@ trytypes () { echo " ... done" } -trylibs () { +detectlibs () { args= name=$1 - echo "Checking whether system has $2..." >&3 - shift 2 + shift if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -c -o try$name.o src/sysdeps/try$name.c 2>/dev/null ; then until $CC_AUTO $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o /dev/null try$name.o $args 2>/dev/null ; do if test -z "$*" ; then rm -f try$name.o - echo - echo " ... no" >&3 return 1 fi args="$args $1" shift done echo ${args# } - if test -z "$args" ; then - echo " ... yes" >&3 - else - echo " ... yes, with$args" >&3 - fi rm -f try$name.o return 0 else - echo - echo " ... no" >&3 return 1 fi } -# Actual script +trylibs () { + name="$1" + libfile="$2" + echo "Checking whether system has $3..." + shift 3 + if args=`iscached $name 3>&1 1>&4 4>&-` 4>&1 ; then : + elif args=`detectlibs "$name" "$@"` ; then + echo "${name}: yes" >> "${sysdeps}/sysdeps" + if test -z "$args" ; then + echo " ... yes" + else + echo " ... yes, with linker args: $args" + fi + else + echo "${name}: no" >> ${sysdeps}/sysdeps + echo " ... no" + fi + echo "$args" > "${sysdeps}/$libfile" +} +# Actual script! + +# Initialize variables CC_AUTO= CPPFLAGS_AUTO="-D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -Isrc/include" CPPFLAGS_POST="$CPPFLAGS" @@ -356,6 +375,7 @@ vpaths='' vpathd='' build= +# Parse command line for arg ; do case "$arg" in --help) usage ;; @@ -388,7 +408,7 @@ for arg ; do --with-default-path=*) defaultpath=${arg#*=} ; dpathorig=false ;; --without-default-path) defaultpath=$ddefaultpath ; dpathorig=true ;; --with-sysdep-*=*) sysdeplist="$sysdeplist ${arg#--with-sysdep-}" ;; - --without-sysdep-*) sysdeplist="$sysdeplist ${arg#--with-sysdep-}=no" ;; + --without-sysdep-*) sysdeplist="$sysdeplist ${arg#--without-sysdep-}=no" ;; --enable-*|--disable-*|--with-*|--without-*|--*dir=*) ;; --host=*|--target=*) target=${arg#*=} ;; --build=*) build=${arg#*=} ;; @@ -419,22 +439,6 @@ for i in exec_prefix dynlibdir libdir includedir datadir sysdepdir sysdepspre sp stripdir $i done - -# Get usable temp filenames -i=0 -set -C -while : ; do - i=$(($i+1)) - tmpc="./tmp-configure-$$-$PPID-$i.c" - tmpe="./tmp-configure-$$-$PPID-$i.tmp" - tmps="./tmp-configure-$$-$PPID-$i.sysdeps" - 2>|/dev/null > "$tmpc" && break - 2>|/dev/null > "$tmpe" && break - test "$i" -gt 50 && fail "$0: cannot create temporary files" -done -set +C -trap 'rm -f "$tmpc" "$tmpe" "$tmps"' EXIT ABRT INT QUIT TERM HUP - # Set slashpackage values if $slashpackage ; then home=${sproot}/package/${category}/${package}-${version} @@ -452,6 +456,50 @@ if $slashpackage ; then fi fi +# Get usable temp filenames +i=0 +set -C +while test "$i" -lt 50 ; do + i=$(($i+1)) + tmpc="./tmp-configure-$$-$PPID-$i.c" + tmpe="./tmp-configure-$$-$PPID-$i.tmp" + tmps="./tmp-configure-$$-$PPID-$i.sysdeps" + 2>|/dev/null > "$tmpc" && break + 2>|/dev/null > "$tmpe" && break + 2>|/dev/null > "$tmps" && break +done +if test "$i" -gt 50 ; then + fail "$0: cannot create temporary files" +fi +set +C +trap 'rm -f "$tmpc" "$tmpe" "$tmps"' EXIT ABRT INT QUIT TERM HUP + +# Preprocess user-provided sysdeps +rm -f "$tmps" +if test -n "$sysdeplist" ; then + :> "$tmps" + for i in $sysdeplist ; do + k=${i%%=*} + echo ${i#*=} | sed 's/,/ /g' | + { + read v extras + if test -z "$k" || test -z "$v" ; then fail "$0: invalid user-provided sysdep: $i" ; fi + if test "$v" = "true" ; then v=yes + elif test "$v" = "false" ; then v=no + fi + if grep -q -e "^${k}: " "$tmps" ; then + grep -v -e "^${k}: " "$tmps" > "$tmpe" + mv -f "$tmpe" "$tmps" + fi + if test -n "$extras" ; then + echo "${k}: $v $extras" + else + echo "${k}: $v" + fi >> "$tmps" + } + done +fi + # Find a C compiler to use if test -n "$target" && test x${build} != x${target} ; then cross=${target}- @@ -500,6 +548,7 @@ if test -z "$target" ; then fi echo " ... $target" +# Produce automatic compilation flags if $allpic ; then tryflag CPPFLAGS_AUTO -fPIC fi @@ -518,60 +567,36 @@ tryflag CPPFLAGS_AUTO -Wno-unused-value tryflag CPPFLAGS_AUTO -Wno-parentheses tryflag CFLAGS_AUTO -ffunction-sections tryflag CFLAGS_AUTO -fdata-sections - tryldflag LDFLAGS_AUTO -Wl,--sort-section=alignment tryldflag LDFLAGS_AUTO -Wl,--sort-common if $shared ; then tryldflag LDFLAGS -Wl,--hash-style=both fi -rm -f "$tmps" -if test -n "$sysdeplist" ; then - :> "$tmps" - for i in $sysdeplist ; do - k=${i%%=*} - v=${i#*=} - if test "$v" = "true" ; then v=yes - elif test "$v" = "false" ; then v=no - fi - if grep -qF -e "${k}: " "$tmps" ; then - grep -vF -e "${k}: " "$tmps" > "$tmpe" - mv -f "$tmpe" "$tmps" - fi - echo "${k}: $v" >> "$tmps" - done -fi +# And now, determine a big fat batch of sysdeps. sysdeps=sysdeps.cfg mkdir -p $sysdeps echo "$target" > $sysdeps/target :> "$sysdeps/sysdeps" -exec 3>&1 util_lib= echo > $sysdeps/util.lib -socket_lib=`trylibs lsock 'accessible socket functions' -lsocket -lnsl` || fail "$0: unable to determine socket.lib sysdep" +echo 'Checking required linker flags for socket functions...' +socket_lib=`detectlibs lsock -lsocket -lnsl` || fail "$0: unable to determine required linker flags for socket functions" +if test -n "$socket_lib" ; then + echo " ... $socket_lib" +else + echo " ... none" +fi echo "$socket_lib" > $sysdeps/socket.lib -hasclock=yes -sysclock_lib=`trylibs clockrt 'clock_gettime()' -lrt` || hasclock=no -echo "$sysclock_lib" > $sysdeps/sysclock.lib -echo "clockrt: $hasclock" >> $sysdeps/sysdeps - -choose cl clockmon CLOCK_MONOTONIC $sysclock_lib -choose cl clockboot CLOCK_BOOTTIME $sysclock_lib - -hasspawn=yes -spawn_lib=`trylibs posixspawn 'posix_spawn()' -lrt` || hasspawn=no -echo "$spawn_lib" > $sysdeps/spawn.lib -echo "posixspawn: $hasspawn" >> $sysdeps/sysdeps - -hastimer=yes -timer_lib=`trylibs timer 'timer_create()' -lrt` || hastimer=no -echo "$timer_lib" > $sysdeps/timer.lib -echo "timer: $hastimer" >> $sysdeps/sysdeps -exec 3>&- +trylibs clockrt sysclock.lib 'clock_gettime()' -lrt +choose cl clockmon CLOCK_MONOTONIC `cat "${sysdeps}/sysclock.lib"` +choose cl clockboot CLOCK_BOOTTIME `cat "${sysdeps}/sysclock.lib"` +trylibs posixspawn spawn.lib 'posix_spawn()' -lrt +trylibs timer timer.lib 'timer_create()' -lrt tryendianness trytypes @@ -610,10 +635,12 @@ choose cl nsgetparent 'NS_GET_PARENT' choose cl explicit_bzero 'explicit_bzero()' choose cl getrandom 'getrandom()' -# And here are the evil irreducible sysdeps. - +# Here are the evil irreducible run-time sysdeps. choose clr devurandom '/dev/urandom' + +# Finally, produce config.mak and config.h + rm -f "$tmps" echo "Creating config.mak..." cmdline=$(quote "$0") diff --git a/package/deps.mak b/package/deps.mak @@ -33,7 +33,6 @@ src/include/skalibs/gensetdyn.h: src/include/skalibs/functypes.h src/include/ska src/include/skalibs/getpeereid.h: src/include/skalibs/posixplz.h src/include/skalibs/iobuffer.h: src/include/skalibs/buffer.h src/include/skalibs/djbunix.h src/include/skalibs/iopause.h: src/include/skalibs/tai.h -src/include/skalibs/ip46.h: src/include/skalibs/fmtscan.h src/include/skalibs/socket.h src/include/skalibs/kolbak.h: src/include/skalibs/unixmessage.h src/include/skalibs/lolstdio.h: src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/strerr2.h src/include/skalibs/netstring.h: src/include/skalibs/buffer.h src/include/skalibs/stralloc.h @@ -55,9 +54,6 @@ src/include/skalibs/strerr2.h: src/include/skalibs/strerr.h src/include/skalibs/tai.h: src/include/skalibs/gccattributes.h src/include/skalibs/uint64.h src/include/skalibs/textclient.h: src/include/skalibs/allreadwrite.h src/include/skalibs/tai.h src/include/skalibs/textmessage.h src/include/skalibs/textmessage.h: src/include/skalibs/allreadwrite.h src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/gccattributes.h src/include/skalibs/stralloc.h src/include/skalibs/tai.h -src/include/skalibs/types.h: src/include/skalibs/uint16.h src/include/skalibs/uint32.h src/include/skalibs/uint64.h -src/include/skalibs/uint16.h: src/include/skalibs/uint64.h -src/include/skalibs/uint32.h: src/include/skalibs/uint64.h src/include/skalibs/unix-timed.h: src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/functypes.h src/include/skalibs/stralloc.h src/include/skalibs/tai.h src/include/skalibs/unix-transactional.h: src/include/skalibs/stralloc.h src/include/skalibs/uint64.h src/include/skalibs/unixconnection.h: src/include/skalibs/unixmessage.h @@ -331,13 +327,13 @@ src/libstddjb/cdb_nextkey.o src/libstddjb/cdb_nextkey.lo: src/libstddjb/cdb_next src/libstddjb/cdb_read.o src/libstddjb/cdb_read.lo: src/libstddjb/cdb_read.c src/include/skalibs/allreadwrite.h src/include/skalibs/cdb.h src/include/skalibs/posixishard.h src/libstddjb/cdb_successor.o src/libstddjb/cdb_successor.lo: src/libstddjb/cdb_successor.c src/include/skalibs/cdb.h src/libstddjb/cdb_zero.o src/libstddjb/cdb_zero.lo: src/libstddjb/cdb_zero.c src/include/skalibs/cdb.h -src/libstddjb/child_spawn.o src/libstddjb/child_spawn.lo: src/libstddjb/child_spawn.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/env.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h src/include/skalibs/types.h -src/libstddjb/child_spawn0.o src/libstddjb/child_spawn0.lo: src/libstddjb/child_spawn0.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h -src/libstddjb/child_spawn1_internal.o src/libstddjb/child_spawn1_internal.lo: src/libstddjb/child_spawn1_internal.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h +src/libstddjb/child_spawn.o src/libstddjb/child_spawn.lo: src/libstddjb/child_spawn.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/env.h src/include/skalibs/exec.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h src/include/skalibs/types.h +src/libstddjb/child_spawn0.o src/libstddjb/child_spawn0.lo: src/libstddjb/child_spawn0.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/exec.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h +src/libstddjb/child_spawn1_internal.o src/libstddjb/child_spawn1_internal.lo: src/libstddjb/child_spawn1_internal.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/exec.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h src/libstddjb/child_spawn1_pipe.o src/libstddjb/child_spawn1_pipe.lo: src/libstddjb/child_spawn1_pipe.c src/libstddjb/djbunix-internal.h src/include/skalibs/djbunix.h src/libstddjb/child_spawn1_socket.o src/libstddjb/child_spawn1_socket.lo: src/libstddjb/child_spawn1_socket.c src/libstddjb/djbunix-internal.h src/include/skalibs/djbunix.h src/include/skalibs/webipc.h -src/libstddjb/child_spawn2.o src/libstddjb/child_spawn2.lo: src/libstddjb/child_spawn2.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h -src/libstddjb/child_spawn3.o src/libstddjb/child_spawn3.lo: src/libstddjb/child_spawn3.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/env.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h src/include/skalibs/types.h +src/libstddjb/child_spawn2.o src/libstddjb/child_spawn2.lo: src/libstddjb/child_spawn2.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/exec.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h +src/libstddjb/child_spawn3.o src/libstddjb/child_spawn3.lo: src/libstddjb/child_spawn3.c src/include/skalibs/allreadwrite.h src/include/skalibs/config.h src/include/skalibs/djbunix.h src/include/skalibs/env.h src/include/skalibs/exec.h src/include/skalibs/sig.h src/include/skalibs/strerr2.h src/include/skalibs/sysdeps.h src/include/skalibs/types.h src/libstddjb/coe.o src/libstddjb/coe.lo: src/libstddjb/coe.c src/include/skalibs/djbunix.h src/libstddjb/deepsleepuntil.o src/libstddjb/deepsleepuntil.lo: src/libstddjb/deepsleepuntil.c src/include/skalibs/iopause.h src/include/skalibs/tai.h src/libstddjb/dir_close.o src/libstddjb/dir_close.lo: src/libstddjb/dir_close.c src/include/skalibs/direntry.h @@ -752,8 +748,6 @@ src/libstddjb/waitn_reap.o src/libstddjb/waitn_reap.lo: src/libstddjb/waitn_reap src/libstddjb/waitpid_nointr.o src/libstddjb/waitpid_nointr.lo: src/libstddjb/waitpid_nointr.c src/include/skalibs/djbunix.h src/libstddjb/writenclose_unsafe.o src/libstddjb/writenclose_unsafe.lo: src/libstddjb/writenclose_unsafe.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/libstddjb/writevnclose_unsafe.o src/libstddjb/writevnclose_unsafe.lo: src/libstddjb/writevnclose_unsafe.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/siovec.h -src/libstddjb/xexecvep.o src/libstddjb/xexecvep.lo: src/libstddjb/xexecvep.c src/include/skalibs/djbunix.h src/include/skalibs/posixplz.h src/include/skalibs/strerr2.h -src/libstddjb/xpathexec_run.o src/libstddjb/xpathexec_run.lo: src/libstddjb/xpathexec_run.c src/include/skalibs/djbunix.h src/include/skalibs/strerr2.h src/libunixonacid/access_at.o src/libunixonacid/access_at.lo: src/libunixonacid/access_at.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/sysdeps.h src/include/skalibs/unix-transactional.h src/libunixonacid/ancil_recv_fd.o src/libunixonacid/ancil_recv_fd.lo: src/libunixonacid/ancil_recv_fd.c src/include/skalibs/allreadwrite.h src/include/skalibs/ancil.h src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/posixishard.h src/include/skalibs/sysdeps.h src/libunixonacid/ancil_send_fd.o src/libunixonacid/ancil_send_fd.lo: src/libunixonacid/ancil_send_fd.c src/include/skalibs/ancil.h src/include/skalibs/nonposix.h src/include/skalibs/posixishard.h diff --git a/src/libstddjb/child_spawn.c b/src/libstddjb/child_spawn.c @@ -21,6 +21,7 @@ #include <skalibs/sig.h> #include <skalibs/strerr2.h> +#include <skalibs/exec.h> #endif @@ -37,25 +38,27 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const *envp, int *fds, unsigned int n) { + pid_t pid ; #ifdef SKALIBS_HASPOSIXSPAWN posix_spawn_file_actions_t actions ; posix_spawnattr_t attr ; + int e ; #else int syncpipe[2] ; #endif int p[n ? n : 1][2] ; - pid_t pid ; - int e ; size_t m = sizeof(SKALIBS_CHILD_SPAWN_FDS_ENVVAR) ; unsigned int i = 0 ; char modifs[m + 1 + n * UINT_FMT] ; memcpy(modifs, SKALIBS_CHILD_SPAWN_FDS_ENVVAR "=", sizeof(SKALIBS_CHILD_SPAWN_FDS_ENVVAR)) ; - for (; i < n ; i++) if (pipe(p[i]) < 0) { e = errno ; goto errpi ; } - for (i = 0 ; i < n ; i++) + for (; i < n ; i++) + { + if (pipe(p[i]) < 0) goto errpi ; if ((ndelay_on(p[i][i & 1]) < 0) || (coe(p[i][i & 1]) < 0)) { - e = errno ; goto errp ; + i++ ; goto errpi ; } + } for (i = 2 ; i < n ; i++) { m += uint_fmt(modifs + m, p[i][!(i & 1)]) ; @@ -66,7 +69,7 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const #ifdef SKALIBS_HASPOSIXSPAWN e = posix_spawnattr_init(&attr) ; - if (e) goto errsp ; + if (e) goto erre ; { sigset_t set ; sigemptyset(&set) ; @@ -92,16 +95,16 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const if (e) goto erractions ; } { - int haspath = !!getenv("PATH") ; + int nopath = !getenv("PATH") ; size_t envlen = env_len(envp) ; char const *newenv[envlen + 2] ; - if (!env_merge(newenv, envlen+2, envp, envlen, modifs, m)) goto erractions ; - if (!haspath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) + if (!env_mergen(newenv, envlen+2, envp, envlen, modifs, m, 1)) goto erractions ; + if (nopath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; goto erractions ; } e = posix_spawnp(&pid, prog, &actions, &attr, (char *const *)argv, (char *const *)newenv) ; - if (!haspath) unsetenv("PATH") ; + if (nopath) unsetenv("PATH") ; if (e) goto erractions ; } @@ -109,11 +112,10 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const posix_spawnattr_destroy(&attr) ; #else - if (pipe(syncpipe) < 0) { e = errno ; goto errp ; } - if (coe(syncpipe[1]) < 0) { e = errno ; goto errsp ; } + if (pipecoe(syncpipe) < 0) goto errp ; pid = fork() ; - if (pid < 0) { e = errno ; goto errsp ; } + if (pid < 0) goto errsp ; else if (!pid) { size_t len = strlen(PROG) ; @@ -121,7 +123,6 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const memcpy(name, PROG, len) ; memcpy(name + len, " (child)", 9) ; PROG = name ; - fd_close(syncpipe[0]) ; if (n >= 2) { if (fd_move2(0, p[1][0], 1, p[0][1]) < 0) goto syncdie ; @@ -131,7 +132,7 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const if (fd_move(1, p[0][1]) < 0) goto syncdie ; } sig_blocknone() ; - pathexec_r_name(prog, argv, envp, env_len(envp), modifs, m) ; + mexec_aen(prog, argv, envp, modifs, m, 1) ; syncdie: { @@ -147,13 +148,10 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const syncpipe[1] = fd_read(syncpipe[0], &c, 1) ; if (syncpipe[1]) { + int e = c ; if (syncpipe[1] < 0) e = errno ; - else - { - kill(pid, SIGKILL) ; - e = c ; - } - wait_pid(pid, &syncpipe[1]) ; + if (wait_pid(pid, &syncpipe[1]) < 0) e = errno ; + errno = e ; goto errsp0 ; } } @@ -172,14 +170,16 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const posix_spawn_file_actions_destroy(&actions) ; errattr: posix_spawnattr_destroy(&attr) ; + erre: + errno = e ; #endif - errsp: #ifndef SKALIBS_HASPOSIXSPAWN + errsp: fd_close(syncpipe[1]) ; errsp0: fd_close(syncpipe[0]) ; -#endif errp: +#endif i = n ; errpi: while (i--) @@ -187,6 +187,5 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const fd_close(p[i][1]) ; fd_close(p[i][0]) ; } - errno = e ; return 0 ; } diff --git a/src/libstddjb/child_spawn0.c b/src/libstddjb/child_spawn0.c @@ -8,14 +8,15 @@ #include <signal.h> #include <spawn.h> #include <stdlib.h> + #include <skalibs/config.h> pid_t child_spawn0 (char const *prog, char const *const *argv, char const *const *envp) { + pid_t pid ; posix_spawnattr_t attr ; int e ; - pid_t pid ; - int haspath = !!getenv("PATH") ; + int nopath = !getenv("PATH") ; e = posix_spawnattr_init(&attr) ; if (e) goto err ; { @@ -26,9 +27,9 @@ pid_t child_spawn0 (char const *prog, char const *const *argv, char const *const e = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGMASK) ; if (e) goto errattr ; } - if (!haspath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; 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 (!haspath) unsetenv("PATH") ; + if (nopath) unsetenv("PATH") ; posix_spawnattr_destroy(&attr) ; if (e) goto err ; return pid ; @@ -44,16 +45,18 @@ pid_t child_spawn0 (char const *prog, char const *const *argv, char const *const #include <unistd.h> #include <string.h> + #include <skalibs/allreadwrite.h> #include <skalibs/strerr2.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 e ; int p[2] ; - pid_t pid ; if (pipecoe(p) < 0) return 0 ; pid = fork() ; if (pid < 0) @@ -71,7 +74,7 @@ pid_t child_spawn0 (char const *prog, char const *const *argv, char const *const PROG = name ; fd_close(p[0]) ; sig_blocknone() ; - pathexec_run(prog, argv, envp) ; + exec_ae(prog, argv, envp) ; e = errno ; fd_write(p[1], (char *)&e, sizeof(e)) ; _exit(127) ; diff --git a/src/libstddjb/child_spawn1_internal.c b/src/libstddjb/child_spawn1_internal.c @@ -9,19 +9,20 @@ #include <signal.h> #include <spawn.h> #include <stdlib.h> + #include <skalibs/config.h> #include <skalibs/djbunix.h> pid_t child_spawn1_internal (char const *prog, char const *const *argv, char const *const *envp, int *p, int to) { + pid_t pid ; posix_spawn_file_actions_t actions ; posix_spawnattr_t attr ; int e ; - pid_t pid ; - int haspath = !!getenv("PATH") ; - if (coe(p[!(to & 1)]) < 0) { e = errno ; goto err ; } + int nopath = !getenv("PATH") ; + if (coe(p[!(to & 1)]) < 0) goto err ; e = posix_spawnattr_init(&attr) ; - if (e) goto err ; + if (e) goto erre ; { sigset_t set ; sigemptyset(&set) ; @@ -44,55 +45,45 @@ pid_t child_spawn1_internal (char const *prog, char const *const *argv, char con e = posix_spawn_file_actions_adddup2(&actions, to & 1, !(to & 1)) ; if (e) goto erractions ; } - if (!haspath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; goto erractions ; } + if (nopath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; goto erractions ; } e = posix_spawnp(&pid, prog, &actions, &attr, (char *const *)argv, (char *const *)envp) ; - if (!haspath) unsetenv("PATH") ; + if (nopath) unsetenv("PATH") ; + if (e) goto erractions ; posix_spawn_file_actions_destroy(&actions) ; posix_spawnattr_destroy(&attr) ; fd_close(p[to & 1]) ; - if (e) goto errp ; return pid ; erractions: posix_spawn_file_actions_destroy(&actions) ; errattr: posix_spawnattr_destroy(&attr) ; - err: - fd_close(p[to & 1]) ; - errp: - fd_close(p[!(to & 1)]) ; + erre: errno = e ; + err: + fd_close(p[1]) ; + fd_close(p[0]) ; return 0 ; } #else #include <string.h> + #include <skalibs/allreadwrite.h> #include <skalibs/strerr2.h> #include <skalibs/sig.h> #include <skalibs/djbunix.h> +#include <skalibs/exec.h> pid_t child_spawn1_internal (char const *prog, char const *const *argv, char const *const *envp, int *p, int to) { - int e ; - int syncp[2] ; pid_t pid ; - if (coe(p[0]) < 0 || pipecoe(syncp) < 0) - { - fd_close(p[1]) ; - fd_close(p[0]) ; - return 0 ; - } + int syncpipe[2] ; + if (coe(p[0]) < 0 || pipecoe(syncpipe) < 0) goto err ; + pid = fork() ; - if (pid < 0) - { - fd_close(syncp[1]) ; - fd_close(syncp[0]) ; - fd_close(p[1]) ; - fd_close(p[0]) ; - return 0 ; - } + if (pid < 0) goto errsp ; if (!pid) { size_t len = strlen(PROG) ; @@ -100,35 +91,47 @@ pid_t child_spawn1_internal (char const *prog, char const *const *argv, char con memcpy(name, PROG, len) ; memcpy(name + len, " (child)", 9) ; PROG = name ; - fd_close(syncp[0]) ; fd_close(p[!(to & 1)]) ; - if (fd_move(to & 1, p[to & 1]) < 0) goto err ; - if ((to & 2) && (fd_copy(!(to & 1), to & 1) < 0)) goto err ; + if (fd_move(to & 1, p[to & 1]) < 0) goto syncdie ; + if ((to & 2) && (fd_copy(!(to & 1), to & 1) < 0)) goto syncdie ; sig_blocknone() ; - pathexec_run(prog, argv, envp) ; - err: - e = errno ; - fd_write(syncp[1], (char *)&e, sizeof(e)) ; + exec_ae(prog, argv, envp) ; + + syncdie: + { + char c = errno ; + fd_write(syncpipe[1], &c, 1) ; + } _exit(127) ; } - fd_close(syncp[1]) ; - fd_close(p[to & 1]) ; - syncp[1] = fd_read(syncp[0], (char *)&e, sizeof(e)) ; - if (syncp[1] < 0) + + fd_close(syncpipe[1]) ; + { - fd_close(syncp[0]) ; - fd_close(p[!(to & 1)]) ; - return 0 ; - } - fd_close(syncp[0]) ; - if (syncp[1] == sizeof(e)) - { - fd_close(p[!(to & 1)]) ; - wait_pid(pid, &syncp[1]) ; - errno = e ; - return 0 ; + char c ; + syncpipe[1] = fd_read(syncpipe[0], &c, 1) ; + if (syncpipe[1]) + { + int e = c ; + if (syncpipe[1] < 0) e = errno ; + if (wait_pid(pid, &syncpipe[1]) < 0) e = errno ; + errno = e ; + goto errsp0 ; + } } + fd_close(syncpipe[0]) ; + + fd_close(p[to & 1]) ; return pid ; + + errsp: + fd_close(syncpipe[1]) ; + errsp0: + fd_close(syncpipe[0]) ; + err: + fd_close(p[1]) ; + fd_close(p[0]) ; + return 0 ; } #endif diff --git a/src/libstddjb/child_spawn2.c b/src/libstddjb/child_spawn2.c @@ -22,6 +22,7 @@ #include <skalibs/allreadwrite.h> #include <skalibs/sig.h> #include <skalibs/strerr2.h> +#include <skalibs/exec.h> #endif @@ -29,23 +30,23 @@ pid_t child_spawn2 (char const *prog, char const *const *argv, char const *const *envp, int *fds) { + pid_t pid ; #ifdef SKALIBS_HASPOSIXSPAWN posix_spawn_file_actions_t actions ; posix_spawnattr_t attr ; + int e ; #else int syncpipe[2] ; #endif int p[2][2] ; - pid_t pid ; - int e ; if (pipe(p[0]) < 0) return 0 ; - if (ndelay_on(p[0][0]) < 0 || coe(p[0][0]) < 0 || pipe(p[1]) < 0) { e = errno ; goto errp ; } - if (ndelay_on(p[1][1]) < 0 || coe(p[1][1]) < 0) { e = errno ; goto errp1 ; } + if (ndelay_on(p[0][0]) < 0 || coe(p[0][0]) < 0 || pipe(p[1]) < 0) goto errp ; + if (ndelay_on(p[1][1]) < 0 || coe(p[1][1]) < 0) goto errp1 ; #ifdef SKALIBS_HASPOSIXSPAWN e = posix_spawnattr_init(&attr) ; - if (e) goto errsp ; + if (e) goto erre ; { sigset_t set ; sigemptyset(&set) ; @@ -71,13 +72,13 @@ pid_t child_spawn2 (char const *prog, char const *const *argv, char const *const if (e) goto erractions ; } { - int haspath = !!getenv("PATH") ; - if (!haspath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) + int nopath = !getenv("PATH") ; + if (nopath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; goto erractions ; } e = posix_spawnp(&pid, prog, &actions, &attr, (char *const *)argv, (char *const *)envp) ; - if (!haspath) unsetenv("PATH") ; + if (nopath) unsetenv("PATH") ; if (e) goto erractions ; } @@ -85,11 +86,10 @@ pid_t child_spawn2 (char const *prog, char const *const *argv, char const *const posix_spawnattr_destroy(&attr) ; #else - if (pipe(syncpipe) < 0) { e = errno ; goto errp1 ; } - if (coe(syncpipe[1]) < 0) { e = errno ; goto errsp ; } + if (pipecoe(syncpipe) < 0) goto errp1 ; pid = fork() ; - if (pid < 0) { e = errno ; goto errsp ; } + if (pid < 0) goto errsp ; else if (!pid) { size_t len = strlen(PROG) ; @@ -97,10 +97,9 @@ pid_t child_spawn2 (char const *prog, char const *const *argv, char const *const memcpy(name, PROG, len) ; memcpy(name + len, " (child)", 9) ; PROG = name ; - fd_close(syncpipe[0]) ; if (fd_move2(fds[0], p[1][0], fds[1], p[0][1]) < 0) goto syncdie ; sig_blocknone() ; - pathexec_run(prog, argv, envp) ; + exec_ae(prog, argv, envp) ; syncdie: { @@ -116,13 +115,10 @@ pid_t child_spawn2 (char const *prog, char const *const *argv, char const *const syncpipe[1] = fd_read(syncpipe[0], &c, 1) ; if (syncpipe[1]) { + int e = c ; if (syncpipe[1] < 0) e = errno ; - else - { - kill(pid, SIGKILL) ; - e = c ; - } - wait_pid(pid, &syncpipe[1]) ; + if (wait_pid(pid, &syncpipe[1]) < 0) e = errno ; + errno = e ; goto errsp0 ; } } @@ -138,9 +134,11 @@ pid_t child_spawn2 (char const *prog, char const *const *argv, char const *const posix_spawn_file_actions_destroy(&actions) ; errattr: posix_spawnattr_destroy(&attr) ; + erre: + errno = e ; #endif - errsp: #ifndef SKALIBS_HASPOSIXSPAWN + errsp: fd_close(syncpipe[1]) ; errsp0: fd_close(syncpipe[0]) ; @@ -151,6 +149,5 @@ pid_t child_spawn2 (char const *prog, char const *const *argv, char const *const errp: fd_close(p[0][1]) ; fd_close(p[0][0]) ; - errno = e ; return 0 ; } diff --git a/src/libstddjb/child_spawn3.c b/src/libstddjb/child_spawn3.c @@ -21,6 +21,7 @@ #include <string.h> #include <skalibs/sig.h> #include <skalibs/strerr2.h> +#include <skalibs/exec.h> #endif @@ -31,15 +32,15 @@ pid_t child_spawn3 (char const *prog, char const *const *argv, char const *const *envp, int *fds) { + pid_t pid ; #ifdef SKALIBS_HASPOSIXSPAWN posix_spawn_file_actions_t actions ; posix_spawnattr_t attr ; + int e ; #else int syncpipe[2] ; #endif int p[3][2] ; - pid_t pid ; - int e ; size_t m = sizeof(SKALIBS_CHILD_SPAWN_FDS_ENVVAR) ; char modifs[sizeof(SKALIBS_CHILD_SPAWN_FDS_ENVVAR) + UINT_FMT] = SKALIBS_CHILD_SPAWN_FDS_ENVVAR "=" ; if (pipe(p[0]) < 0 || ndelay_on(p[0][0]) < 0 || coe(p[0][0]) < 0) return 0 ; @@ -51,7 +52,7 @@ pid_t child_spawn3 (char const *prog, char const *const *argv, char const *const #ifdef SKALIBS_HASPOSIXSPAWN e = posix_spawnattr_init(&attr) ; - if (e) goto errp2 ; + if (e) goto erre ; { sigset_t set ; sigemptyset(&set) ; @@ -77,16 +78,16 @@ pid_t child_spawn3 (char const *prog, char const *const *argv, char const *const if (e) goto erractions ; } { - int haspath = !!getenv("PATH") ; + int nopath = !getenv("PATH") ; size_t envlen = env_len(envp) ; char const *newenv[envlen + 2] ; - if (!env_merge(newenv, envlen+2, envp, envlen, modifs, m)) goto erractions ; - if (!haspath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) + if (!env_mergen(newenv, envlen+2, envp, envlen, modifs, m, 1)) goto erractions ; + if (nopath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; goto erractions ; } e = posix_spawnp(&pid, prog, &actions, &attr, (char *const *)argv, (char *const *)newenv) ; - if (!haspath) unsetenv("PATH") ; + if (nopath) unsetenv("PATH") ; if (e) goto erractions ; } @@ -94,11 +95,10 @@ pid_t child_spawn3 (char const *prog, char const *const *argv, char const *const posix_spawnattr_destroy(&attr) ; #else - if (pipe(syncpipe) < 0) { e = errno ; goto errp2 ; } - if (coe(syncpipe[1]) < 0) { e = errno ; goto errsp ; } + if (pipecoe(syncpipe) < 0) goto errp2 ; pid = fork() ; - if (pid < 0) { e = errno ; goto errsp ; } + if (pid < 0) goto errsp ; else if (!pid) { size_t len = strlen(PROG) ; @@ -106,10 +106,9 @@ pid_t child_spawn3 (char const *prog, char const *const *argv, char const *const memcpy(name, PROG, len) ; memcpy(name + len, " (child)", 9) ; PROG = name ; - fd_close(syncpipe[0]) ; if (fd_move2(fds[0], p[1][0], fds[1], p[0][1]) < 0) goto syncdie ; sig_blocknone() ; - pathexec_r_name(prog, argv, envp, env_len(envp), modifs, m) ; + mexec_aen(prog, argv, envp, modifs, m, 1) ; syncdie: { @@ -125,13 +124,10 @@ pid_t child_spawn3 (char const *prog, char const *const *argv, char const *const syncpipe[1] = fd_read(syncpipe[0], &c, 1) ; if (syncpipe[1]) { + int e = c ; if (syncpipe[1] < 0) e = errno ; - else - { - kill(pid, SIGKILL) ; - e = c ; - } - wait_pid(pid, &syncpipe[1]) ; + if (wait_pid(pid, &syncpipe[1]) < 0) e = errno ; + errno = e ; goto errsp0 ; } } @@ -151,14 +147,16 @@ pid_t child_spawn3 (char const *prog, char const *const *argv, char const *const posix_spawn_file_actions_destroy(&actions) ; errattr: posix_spawnattr_destroy(&attr) ; + erre: + errno = e ; #endif #ifndef SKALIBS_HASPOSIXSPAWN errsp: fd_close(syncpipe[1]) ; errsp0: fd_close(syncpipe[0]) ; -#endif errp2: +#endif fd_close(p[2][1]) ; fd_close(p[2][0]) ; errp1: