summaryrefslogtreecommitdiffstats
path: root/configure.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2008-02-02 21:56:12 +0000
committerRoy Marples <roy@marples.name>2008-02-02 21:56:12 +0000
commit1b3ab874f4aec73ed01dfb8055a05cd813d27342 (patch)
treec56739faaabb49c2bb64e2596f6975658630c9ad /configure.c
parent76ef136f1d0b2c1252da87a3c39e489e579f7eb0 (diff)
downloaddhcpcd-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.c47
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);