Also be sure to correctly initialize struct sigaction.
/* Define if you want to use execv() instead of execvp(). */
#undef USE_EXECV
-/* Define if you have POSIX signals. */
-#undef HAVE_SIGACTION
-#ifdef HAVE_SIGACTION
-# define POSIX_SIGNALS
-#endif /* HAVE_SIGACTION */
-
/* Define if you have tzset(3). */
#undef HAVE_TZSET
dnl
dnl Function checks
dnl
-AC_CHECK_FUNCS(strchr strrchr memchr memcpy memset sysconf sigaction tzset \
+AC_CHECK_FUNCS(strchr strrchr memchr memcpy memset sysconf tzset \
seteuid setegid strftime setrlimit initgroups fstat)
if test -z "$BROKEN_SETREUID"; then
AC_CHECK_FUNCS(setreuid)
AC_CHECK_FUNCS(lsearch, , [AC_CHECK_LIB(compat, lsearch, AC_CHECK_HEADER(search.h, AC_DEFINE(HAVE_LSEARCH) [LIBS="${LIBS} -lcompat"], AC_LIBOBJ(lsearch)), AC_LIBOBJ(lsearch))])
AC_CHECK_FUNCS(utime, SUDO_FUNC_UTIME_POSIX, AC_LIBOBJ(utime))
SUDO_FUNC_FNMATCH(AC_DEFINE(HAVE_FNMATCH), AC_LIBOBJ(fnmatch))
-AC_REPLACE_FUNCS(strerror strcasecmp)
+AC_REPLACE_FUNCS(strerror strcasecmp sigaction)
AC_CHECK_FUNCS(snprintf vsnprintf asprintf vasprintf, , [NEED_SNPRINTF=1])
dnl
dnl If NEED_SNPRINTF is set, add snprintf.c to LIBOBJS
FILE *mail;
char *p;
int pfd[2], pid, status;
-#ifdef POSIX_SIGNALS
sigset_t set, oset;
-#else
- int omask;
-#endif /* POSIX_SIGNALS */
/* Just return if mailer is disabled. */
if (!def_str(I_MAILERPATH) || !def_str(I_MAILTO))
return;
-#ifdef POSIX_SIGNALS
(void) sigemptyset(&set);
(void) sigaddset(&set, SIGCHLD);
(void) sigprocmask(SIG_BLOCK, &set, &oset);
-#else
- omask = sigblock(sigmask(SIGCHLD));
-#endif /* POSIX_SIGNALS */
if (pipe(pfd) == -1) {
(void) fprintf(stderr, "%s: cannot open pipe: %s\n",
#ifdef sudo_waitpid
(void) sudo_waitpid(pid, &status, WNOHANG);
#endif
-#ifdef POSIX_SIGNALS
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
-#else
- (void) sigsetmask(omask);
-#endif /* POSIX_SIGNALS */
}
/*
#else
(void) wait(&status);
#endif
-#ifndef POSIX_SIGNALS
- (void) signal(SIGCHLD, reapchild);
-#endif /* POSIX_SIGNALS */
errno = serrno;
}
int cmnd_status;
int sudo_mode;
int pwflag;
-#ifdef POSIX_SIGNALS
sigset_t set, oset;
-#else
- int omask;
-#endif /* POSIX_SIGNALS */
extern int printmatches;
extern char **environ;
* Block signals so the user cannot interrupt us at some point and
* avoid the logging.
*/
-#ifdef POSIX_SIGNALS
(void) sigemptyset(&set);
(void) sigaddset(&set, SIGINT);
(void) sigaddset(&set, SIGQUIT);
(void) sigaddset(&set, SIGTSTP);
(void) sigprocmask(SIG_BLOCK, &set, &oset);
-#else
- omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGTSTP));
-#endif /* POSIX_SIGNALS */
/*
* Setup signal handlers, turn off core dumps, and close open files.
endpwent();
/* Reset signal mask before we exec. */
-#ifdef POSIX_SIGNALS
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
-#else
- (void) sigsetmask(omask);
-#endif /* POSIX_SIGNALS */
/* Override user's umask if configured to do so. */
if (def_ival(I_UMASK) != 0777)
#ifdef HAVE_SETRLIMIT
struct rlimit rl;
#endif
-#ifdef POSIX_SIGNALS
- struct sigaction sa;
-#endif
+ sigaction_t sa;
#if defined(RLIMIT_CORE) && !defined(SUDO_DEVEL)
/*
(void) close(fd);
/* Catch children as they die... */
-#ifdef POSIX_SIGNALS
- (void) memset((VOID *)&sa, 0, sizeof(sa));
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_RESTART;
sa.sa_handler = reapchild;
(void) sigaction(SIGCHLD, &sa, NULL);
-#else
- (void) signal(SIGCHLD, reapchild);
-#endif /* POSIX_SIGNALS */
/* Set set_perms pointer to the correct function */
#if defined(_SC_SAVED_IDS) && defined(_SC_VERSION)
static void
setup_signals()
{
-#ifdef POSIX_SIGNALS
- struct sigaction action; /* POSIX signal structure */
-#endif /* POSIX_SIGNALS */
+ sigaction_t sa;
/*
* Setup signal handlers to cleanup nicely.
*/
-#ifdef POSIX_SIGNALS
- (void) memset((VOID *)&action, 0, sizeof(action));
- sigemptyset(&action.sa_mask);
- action.sa_flags = 0;
- action.sa_handler = Exit;
- (void) sigaction(SIGTERM, &action, NULL);
- (void) sigaction(SIGHUP, &action, NULL);
- (void) sigaction(SIGINT, &action, NULL);
- (void) sigaction(SIGQUIT, &action, NULL);
-#else
- (void) signal(SIGTERM, Exit);
- (void) signal(SIGHUP, Exit);
- (void) signal(SIGINT, Exit);
- (void) signal(SIGQUIT, Exit);
-#endif /* POSIX_SIGNALS */
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_RESTART;
+ sa.sa_handler = Exit;
+ (void) sigaction(SIGTERM, &sa, NULL);
+ (void) sigaction(SIGHUP, &sa, NULL);
+ (void) sigaction(SIGINT, &sa, NULL);
+ (void) sigaction(SIGQUIT, &sa, NULL);
}
static int
{
int status;
pid_t pid;
-#ifndef POSIX_SIGNALS
- int omask = sigblock(sigmask(SIGCHLD));
-#else
sigset_t set, oset;
(void) sigemptyset(&set);
(void) sigaddset(&set, SIGCHLD);
(void) sigprocmask(SIG_BLOCK, &set, &oset);
-#endif /* POSIX_SIGNALS */
switch (pid = fork()) {
case -1:
Exit(-1);
break; /* NOTREACHED */
case 0:
-#ifdef POSIX_SIGNALS
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
-#else
- (void) sigsetmask(omask);
-#endif /* POSIX_SIGNALS */
execv(path, argv);
(void) fprintf(stderr,
"%s: unable to run %s: %s\n", Argv[0], path, strerror(errno));
pid = wait(&status);
#endif
-#ifdef POSIX_SIGNALS
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
-#else
- (void) sigsetmask(omask);
-#endif /* POSIX_SIGNALS */
/* XXX - should use WEXITSTATUS() */
return(pid == -1 ? -1 : (status >> 8));