version 1.20, 2007/09/05 23:55:57 |
version 1.21, 2008/07/31 16:44:04 |
|
|
#include "version.h" |
#include "version.h" |
|
|
#ifndef lint |
#ifndef lint |
__unused static const char rcsid[] = "$Sudo: visudo.c,v 1.166.2.10 2007/09/01 13:39:13 millert Exp $"; |
__unused static const char rcsid[] = "$Sudo: visudo.c,v 1.166.2.11 2008/06/21 00:47:52 millert Exp $"; |
#endif /* lint */ |
#endif /* lint */ |
|
|
struct sudoersfile { |
struct sudoersfile { |
|
|
char **argv; |
char **argv; |
{ |
{ |
int status; |
int status; |
pid_t pid; |
pid_t pid, rv; |
sigset_t set, oset; |
|
|
|
(void) sigemptyset(&set); |
|
(void) sigaddset(&set, SIGCHLD); |
|
(void) sigprocmask(SIG_BLOCK, &set, &oset); |
|
|
|
switch (pid = fork()) { |
switch (pid = fork()) { |
case -1: |
case -1: |
warn("unable to run %s", path); |
warn("unable to run %s", path); |
Exit(-1); |
Exit(-1); |
break; /* NOTREACHED */ |
break; /* NOTREACHED */ |
case 0: |
case 0: |
(void) sigprocmask(SIG_SETMASK, &oset, NULL); |
|
endpwent(); |
endpwent(); |
closefrom(STDERR_FILENO + 1); |
closefrom(STDERR_FILENO + 1); |
execv(path, argv); |
execv(path, argv); |
|
|
break; /* NOTREACHED */ |
break; /* NOTREACHED */ |
} |
} |
|
|
|
do { |
#ifdef sudo_waitpid |
#ifdef sudo_waitpid |
pid = sudo_waitpid(pid, &status, 0); |
rv = sudo_waitpid(pid, &status, 0); |
#else |
#else |
pid = wait(&status); |
rv = wait(&status); |
#endif |
#endif |
|
} while (rv == -1 && errno == EINTR); |
|
|
(void) sigprocmask(SIG_SETMASK, &oset, NULL); |
if (rv == -1 || !WIFEXITED(status)) |
|
|
if (pid == -1 || !WIFEXITED(status)) |
|
return(-1); |
return(-1); |
return(WEXITSTATUS(status)); |
return(WEXITSTATUS(status)); |
} |
} |