+++ /dev/null
-/*
- * dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2012 Roy Marples <roy@marples.name>
- * All rights reserved
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* This implementation of posix_spawn is only suitable for the needs of dhcpcd
- * but it could easily be extended to other applications. */
-
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <errno.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "common.h"
-#include "posix_spawn.h"
-
-#ifndef _NSIG
-#ifdef _SIG_MAXSIG
-#define _NSIG _SIG_MAXSIG + 1
-#else
-/* Guess */
-#define _NSIG SIGPWR + 1
-#endif
-#endif
-
-extern char **environ;
-
-static int
-posix_spawnattr_handle(const posix_spawnattr_t *attrp)
-{
- struct sigaction sa;
- int i;
-
- if (attrp->posix_attr_flags & POSIX_SPAWN_SETSIGMASK)
- sigprocmask(SIG_SETMASK, &attrp->posix_attr_sigmask, NULL);
-
- if (attrp->posix_attr_flags & POSIX_SPAWN_SETSIGDEF) {
- memset(&sa, 0, sizeof(sa));
- sa.sa_handler = SIG_DFL;
- for (i = 1; i < _NSIG; i++) {
- if (sigismember(&attrp->posix_attr_sigdefault, i)) {
- if (sigaction(i, &sa, NULL) == -1)
- return -1;
- }
- }
- }
-
- return 0;
-}
-
-inline static int
-is_vfork_safe(short int flags)
-{
- return !(flags & (POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK));
-}
-
-int
-posix_spawn(pid_t *pid, const char *path,
- const posix_spawn_file_actions_t *file_actions,
- const posix_spawnattr_t *attrp,
- char *const argv[], char *const envp[])
-{
- short int flags;
- pid_t p;
- volatile int error;
-
- error = 0;
- flags = attrp ? attrp->posix_attr_flags : 0;
- if (file_actions == NULL && is_vfork_safe(flags))
- p = vfork();
- else
-#ifdef THERE_IS_NO_FORK
- return ENOSYS;
-#else
- p = fork();
-#endif
- switch (p) {
- case -1:
- return errno;
- case 0:
- if (attrp) {
- error = posix_spawnattr_handle(attrp);
- if (error)
- _exit(127);
- }
- execve(path, argv, envp);
- error = errno;
- _exit(127);
- default:
- if (error != 0)
- waitpid(p, NULL, WNOHANG);
- else if (pid != NULL)
- *pid = p;
- return error;
- }
-}
-
-int
-posix_spawnattr_init(posix_spawnattr_t *attr)
-{
-
- memset(attr, 0, sizeof(*attr));
- attr->posix_attr_flags = 0;
- sigprocmask(0, NULL, &attr->posix_attr_sigmask);
- sigemptyset(&attr->posix_attr_sigdefault);
- return 0;
-}
-
-int
-posix_spawnattr_setflags(posix_spawnattr_t *attr, short flags)
-{
-
- attr->posix_attr_flags = flags;
- return 0;
-}
-
-int
-posix_spawnattr_setsigmask(posix_spawnattr_t *attr, const sigset_t *sigmask)
-{
-
- attr->posix_attr_sigmask = *sigmask;
- return 0;
-}
-
-int
-posix_spawnattr_setsigdefault(posix_spawnattr_t *attr, const sigset_t *sigmask)
-{
-
- attr->posix_attr_sigdefault = *sigmask;
- return 0;
-}
+++ /dev/null
-/*
- * dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2012 Roy Marples <roy@marples.name>
- * All rights reserved
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef POSIX_SPAWN_H
-#define POSIX_SPAWN_H
-
-#include <signal.h>
-
-typedef struct {
- short posix_attr_flags;
-#define POSIX_SPAWN_SETSIGDEF 0x10
-#define POSIX_SPAWN_SETSIGMASK 0x20
- sigset_t posix_attr_sigmask;
- sigset_t posix_attr_sigdefault;
-} posix_spawnattr_t;
-
-typedef struct {
-// int unused;
-} posix_spawn_file_actions_t;
-
-int posix_spawn(pid_t *, const char *,
- const posix_spawn_file_actions_t *, const posix_spawnattr_t *,
- char *const [], char *const []);
-int posix_spawnattr_init(posix_spawnattr_t *);
-int posix_spawnattr_setflags(posix_spawnattr_t *, short);
-int posix_spawnattr_setsigmask(posix_spawnattr_t *, const sigset_t *);
-int posix_spawnattr_setsigdefault(posix_spawnattr_t *, const sigset_t *);
-
-#endif
echo "#include \"compat/arc4random_uniform.h\"" >>$CONFIG_H
fi
-if [ -z "$GETLINE" ]; then
- printf "Testing for getline ... "
- cat <<EOF >_getline.c
-#include <stdio.h>
-int main(void) {
- char *buf = NULL;
- size_t n = 0;
- return getline(&buf, &n, stdin) == -1 ? -1 : 0;
-}
-EOF
- if $XCC _getline.c -o _getline 2>&3; then
- GETLINE=yes
- else
- GETLINE=no
- fi
- echo "$GETLINE"
- rm -f _getline.c _getline
-fi
-if [ "$GETLINE" = no ]; then
- echo "COMPAT_SRCS+= compat/getline.c" >>$CONFIG_MK
- echo "#include \"compat/getline.h\"" >>$CONFIG_H
-fi
-
if [ -z "$STRLCPY" ]; then
printf "Testing for strlcpy ... "
cat <<EOF >_strlcpy.c
echo "#define HAVE_SYS_QUEUE_H" >>$CONFIG_H
fi
-if [ -z "$POSIX_SPAWN" ]; then
- printf "Testing for posix_spawn ... "
- cat <<EOF >_posix_spawn.c
-#include <spawn.h>
-#include <stdlib.h>
-
-#ifdef __OpenBSD__
-# include <sys/param.h>
-# if OpenBSD<201505
-# error posix_spawn was fixed in OpenBSD-5.7
-# endif
-#endif
-
-int main(void) {
- posix_spawn(NULL, NULL, NULL, NULL, NULL, NULL);
- return 0;
-}
-EOF
- if $XCC _posix_spawn.c -o _posix_spawn 2>&3; then
- POSIX_SPAWN=yes
- else
- POSIX_SPAWN=no
- fi
- echo "$POSIX_SPAWN"
- rm -f _posix_spawn.c _posix_spawn
-fi
-if [ "$POSIX_SPAWN" = no ]; then
- echo "COMPAT_SRCS+= compat/posix_spawn.c" >>$CONFIG_MK
-else
- echo "#define HAVE_SPAWN_H" >>$CONFIG_H
-fi
-
if [ -z "$REALLOCARRAY" ]; then
printf "Testing for reallocarray ... "
cat <<EOF >_reallocarray.c