Simplify execute_script(). It will probably work under Windows as well.

This commit is contained in:
Guus Sliepen 2003-08-08 14:48:33 +00:00
parent deba3ed900
commit 863349638b
2 changed files with 35 additions and 82 deletions

View file

@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script. 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_PREREQ(2.57)
AC_INIT(src/tincd.c) AC_INIT(src/tincd.c)
@ -253,7 +253,7 @@ dnl Checks for library functions.
AC_FUNC_MEMCMP AC_FUNC_MEMCMP
AC_FUNC_ALLOCA AC_FUNC_ALLOCA
AC_TYPE_SIGNAL 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_MALLOC
jm_FUNC_REALLOC jm_FUNC_REALLOC

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #include "system.h"
@ -347,46 +347,9 @@ bool detach(void)
return true; 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) bool execute_script(const char *name, char **envp)
{ {
#ifdef HAVE_FORK #ifdef HAVE_SYSTEM
pid_t pid; pid_t pid;
int status; int status;
struct stat s; struct stat s;
@ -401,52 +364,42 @@ bool execute_script(const char *name, char **envp)
if(stat(scriptname, &s)) if(stat(scriptname, &s))
return true; return true;
pid = fork(); /* Set environment */
while(*envp)
putenv(*envp++);
if(pid < 0) { ifdebug(STATUS) logger(LOG_INFO, _("Executing script %s"), name);
logger(LOG_ERR, _("System call `%s' failed: %s"), "fork",
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)); strerror(errno));
return false; 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 #endif
return true;
} }