Simplify execute_script(). It will probably work under Windows as well.
This commit is contained in:
parent
deba3ed900
commit
863349638b
2 changed files with 35 additions and 82 deletions
|
@ -1,6 +1,6 @@
|
|||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
dnl $Id: configure.in,v 1.13.2.81 2003/08/08 14:07:11 guus Exp $
|
||||
dnl $Id: configure.in,v 1.13.2.82 2003/08/08 14:48:33 guus Exp $
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
AC_INIT(src/tincd.c)
|
||||
|
@ -253,7 +253,7 @@ dnl Checks for library functions.
|
|||
AC_FUNC_MEMCMP
|
||||
AC_FUNC_ALLOCA
|
||||
AC_TYPE_SIGNAL
|
||||
AC_CHECK_FUNCS([asprintf daemon fcloseall flock ftime fork get_current_dir_name gettimeofday mlockall putenv random select strdup strerror strsignal strtol unsetenv vsyslog])
|
||||
AC_CHECK_FUNCS([asprintf daemon fcloseall flock ftime fork get_current_dir_name gettimeofday mlockall putenv random select strdup strerror strsignal strtol system unsetenv vsyslog])
|
||||
jm_FUNC_MALLOC
|
||||
jm_FUNC_REALLOC
|
||||
|
||||
|
|
113
src/process.c
113
src/process.c
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: process.c,v 1.1.2.64 2003/08/08 12:55:05 guus Exp $
|
||||
$Id: process.c,v 1.1.2.65 2003/08/08 14:48:33 guus Exp $
|
||||
*/
|
||||
|
||||
#include "system.h"
|
||||
|
@ -347,46 +347,9 @@ bool detach(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
#ifdef HAVE_FORK
|
||||
/*
|
||||
Execute the program name, with sane environment.
|
||||
*/
|
||||
static void _execute_script(const char *scriptname, char **envp)
|
||||
__attribute__ ((__noreturn__));
|
||||
static void _execute_script(const char *scriptname, char **envp)
|
||||
{
|
||||
int save_errno;
|
||||
|
||||
cp();
|
||||
|
||||
while(*envp)
|
||||
putenv(*envp++);
|
||||
|
||||
chdir("/");
|
||||
|
||||
closelogger();
|
||||
|
||||
/* Close all file descriptors */
|
||||
fcloseall();
|
||||
|
||||
execl(scriptname, scriptname, NULL);
|
||||
/* No return on success */
|
||||
|
||||
save_errno = errno;
|
||||
|
||||
openlogger(identname, use_logfile?LOGMODE_FILE:(do_detach?LOGMODE_SYSLOG:LOGMODE_STDERR));
|
||||
logger(LOG_ERR, _("Could not execute `%s': %s"), scriptname,
|
||||
strerror(save_errno));
|
||||
exit(save_errno);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
Fork and execute the program pointed to by name.
|
||||
*/
|
||||
bool execute_script(const char *name, char **envp)
|
||||
{
|
||||
#ifdef HAVE_FORK
|
||||
#ifdef HAVE_SYSTEM
|
||||
pid_t pid;
|
||||
int status;
|
||||
struct stat s;
|
||||
|
@ -401,52 +364,42 @@ bool execute_script(const char *name, char **envp)
|
|||
if(stat(scriptname, &s))
|
||||
return true;
|
||||
|
||||
pid = fork();
|
||||
/* Set environment */
|
||||
|
||||
while(*envp)
|
||||
putenv(*envp++);
|
||||
|
||||
if(pid < 0) {
|
||||
logger(LOG_ERR, _("System call `%s' failed: %s"), "fork",
|
||||
ifdebug(STATUS) logger(LOG_INFO, _("Executing script %s"), name);
|
||||
|
||||
status = system(scriptname);
|
||||
|
||||
free(scriptname);
|
||||
|
||||
/* Unset environment? */
|
||||
|
||||
if(status != -1) {
|
||||
if(WIFEXITED(status)) { /* Child exited by itself */
|
||||
if(WEXITSTATUS(status)) {
|
||||
logger(LOG_ERR, _("Process %d (%s) exited with non-zero status %d"),
|
||||
pid, name, WEXITSTATUS(status));
|
||||
return false;
|
||||
}
|
||||
} else if(WIFSIGNALED(status)) { /* Child was killed by a signal */
|
||||
logger(LOG_ERR, _("Process %d (%s) was killed by signal %d (%s)"), pid,
|
||||
name, WTERMSIG(status), strsignal(WTERMSIG(status)));
|
||||
return false;
|
||||
} else { /* Something strange happened */
|
||||
logger(LOG_ERR, _("Process %d (%s) terminated abnormally"), pid,
|
||||
name);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
logger(LOG_ERR, _("System call `%s' failed: %s"), "system",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
if(pid) {
|
||||
ifdebug(STATUS) logger(LOG_INFO, _("Executing script %s"), name);
|
||||
|
||||
free(scriptname);
|
||||
|
||||
if(waitpid(pid, &status, 0) == pid) {
|
||||
if(WIFEXITED(status)) { /* Child exited by itself */
|
||||
if(WEXITSTATUS(status)) {
|
||||
logger(LOG_ERR, _("Process %d (%s) exited with non-zero status %d"),
|
||||
pid, name, WEXITSTATUS(status));
|
||||
return false;
|
||||
} else
|
||||
return true;
|
||||
} else if(WIFSIGNALED(status)) { /* Child was killed by a signal */
|
||||
logger(LOG_ERR, _("Process %d (%s) was killed by signal %d (%s)"), pid,
|
||||
name, WTERMSIG(status), strsignal(WTERMSIG(status)));
|
||||
return false;
|
||||
} else { /* Something strange happened */
|
||||
logger(LOG_ERR, _("Process %d (%s) terminated abnormally"), pid,
|
||||
name);
|
||||
return false;
|
||||
}
|
||||
} else if (errno != EINTR) {
|
||||
logger(LOG_ERR, _("System call `%s' failed: %s"), "waitpid",
|
||||
strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Why do we get EINTR? */
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Child here */
|
||||
|
||||
_execute_script(scriptname, envp);
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue