This is execute.c in view mode; [Download] [Up]
/* $Id: execute.c,v 1.2 1995/12/19 19:30:47 eilts Exp eilts $ */
#include "bbs.h"
static volatile PID_T execute_pid;
int execute(const char *path, char *const args[], const int loglevel,
const confrecordtyp *confrecord)
{
int rw, sig;
int status;
void (*oldsigint)();
if ( (execute_pid = fork()) < 0 ) {
errormsg(E_LOGFILE|E_USER,confrecord,"bbs","execute","fork: %m");
return -1;
}
if ( execute_pid == 0 ) {
setsighandler(SIGINT, SIG_DFL);
execv(path, args);
errormsg(E_LOGFILE|E_USER,confrecord,"bbs","execute","execv %s: %m",path);
exit(1);
}
else {
oldsigint = setsighandler(SIGINT, executesighandler);
}
while (wait(&status) != execute_pid );
setsighandler(SIGINT, oldsigint);
rw = status;
if (WIFEXITED(status)) {
rw = WEXITSTATUS(status);
}
if (loglevel > 1) {
if (WIFEXITED(status)) {
bbslog(LOG_FILE,confrecord,"%s exited, return: %i",args[0],rw);
}
if (WIFSIGNALED(status)) {
sig = WTERMSIG(status);
bbslog(LOG_FILE,confrecord,"%s got signal %i", args[0], sig);
if (WCOREDUMP(status)) {
bbslog(LOG_FILE,confrecord,"%s dumped core",args[0]);
}
}
}
#if 0
if (loglevel > 1) {
if (WIFEXITED(status)) {
printf("%s exited, return: %i\n", args[0], rw);
}
if (WIFSIGNALED(status)) {
sig = WTERMSIG(status);
printf("%s got signal %i\n", args[0], sig);
if (WCOREDUMP(status)) {
printf("%s dumped core\n",args[0]);
}
}
}
#endif
return rw;
}
void executesighandler(int sig)
{
kill(execute_pid,sig);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.