diff options
| author | Roy Marples <roy@marples.name> | 2008-02-02 21:56:12 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2008-02-02 21:56:12 +0000 |
| commit | 1b3ab874f4aec73ed01dfb8055a05cd813d27342 (patch) | |
| tree | c56739faaabb49c2bb64e2596f6975658630c9ad /configure.c | |
| parent | 76ef136f1d0b2c1252da87a3c39e489e579f7eb0 (diff) | |
| download | dhcpcd-1b3ab874f4aec73ed01dfb8055a05cd813d27342.tar.xz | |
Revert posix_spawn as it seems only glibc supports it for us right now. Hope that libc is tolerant to changing signals inside a vfork if we put them back afterwards in the parent.
Diffstat (limited to 'configure.c')
| -rw-r--r-- | configure.c | 47 |
1 files changed, 17 insertions, 30 deletions
diff --git a/configure.c b/configure.c index 6372ee55..559ba338 100644 --- a/configure.c +++ b/configure.c @@ -41,21 +41,11 @@ #include <errno.h> #include <netdb.h> #include <resolv.h> +#include <signal.h> #include <stdarg.h> #include <stdlib.h> #include <unistd.h> -#ifndef BSD -# define HAVE_POSIX_SPAWN -#endif - -#ifdef HAVE_POSIX_SPAWN -# include <spawn.h> -extern char **environ; -#else -# include <signal.h> -#endif - #include "config.h" #include "common.h" #include "configure.h" @@ -66,11 +56,8 @@ extern char **environ; #include "interface.h" #include "dhcpcd.h" #include "logger.h" -#include "socket.h" - -#ifndef HAVE_POSIX_SPAWN #include "signal.h" -#endif +#include "socket.h" static int file_in_path (const char *file) { @@ -106,11 +93,9 @@ static int exec_cmd (const char *cmd, const char *args, ...) char **argv; int n = 1; int ret; -#ifndef HAVE_POSIX_SPAWN pid_t pid; sigset_t full; sigset_t old; -#endif va_start (va, args); while (va_arg (va, char *) != NULL) @@ -126,38 +111,40 @@ static int exec_cmd (const char *cmd, const char *args, ...) n++; va_end (va); -#ifdef HAVE_POSIX_SPAWN - errno = 0; - ret = posix_spawnp (NULL, argv[0], NULL, NULL, argv, environ); - if (ret != 0 || errno != 0) { - logger (LOG_ERR, "error executing \"%s\": %s", - cmd, strerror (errno)); - ret = -1; - } -#else /* OK, we need to block signals */ sigfillset (&full); sigprocmask (SIG_SETMASK, &full, &old); - switch (pid = fork()) { +#ifdef THERE_IS_NO_FORK + signal_reset (); + pid = vfork (); +#else + pid = fork(); +#endif + + switch (pid) { case -1: logger (LOG_ERR, "vfork: %s", strerror (errno)); ret = -1; break; case 0: - /* Reset signals and clear block */ +#ifndef THERE_IS_NO_FORK signal_reset (); +#endif sigprocmask (SIG_SETMASK, &old, NULL); if (execvp (cmd, argv) && errno != ENOENT) logger (LOG_ERR, "error executing \"%s\": %s", cmd, strerror (errno)); - _exit (0); + _exit (111); /* NOTREACHED */ } +#ifdef THERE_IS_NO_FORK + signal_setup (); +#endif + /* Restore our signals */ sigprocmask (SIG_SETMASK, &old, NULL); -#endif free (argv); return (ret); |
