-void
-setup_signals(void)
-{
- int i;
-
- for(i=0;i<32;i++)
- signal(i,sighuh);
-
- if(signal(SIGTERM, SIG_IGN) != SIG_ERR)
- signal(SIGTERM, sigterm_handler);
- if(signal(SIGQUIT, SIG_IGN) != SIG_ERR)
- signal(SIGQUIT, sigquit_handler);
- if(signal(SIGSEGV, SIG_IGN) != SIG_ERR)
- signal(SIGSEGV, sigsegv_handler);
- if(signal(SIGHUP, SIG_IGN) != SIG_ERR)
- signal(SIGHUP, sighup_handler);
- signal(SIGPIPE, SIG_IGN);
- if(signal(SIGINT, SIG_IGN) != SIG_ERR)
- signal(SIGINT, sigint_handler);
- signal(SIGUSR1, sigusr1_handler);
- signal(SIGUSR2, sigusr2_handler);
- signal(SIGCHLD, SIG_IGN);
+ if(scriptinterpreter)
+ xasprintf(&command, "%s \"%s\"", scriptinterpreter, scriptname);
+ else
+ xasprintf(&command, "\"%s\"", scriptname);
+
+ int status = system(command);
+
+ free(command);
+ free(scriptname);
+
+ /* Unset environment */
+
+ for(int i = 0; envp[i]; i++) {
+ char *e = strchr(envp[i], '=');
+ if(e) {
+ char p[e - envp[i] + 1];
+ strncpy(p, envp[i], e - envp[i]);
+ p[e - envp[i]] = '\0';
+ putenv(p);
+ }
+ }
+
+#ifdef WEXITSTATUS
+ if(status != -1) {
+ if(WIFEXITED(status)) { /* Child exited by itself */
+ if(WEXITSTATUS(status)) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Script %s exited with non-zero status %d",
+ name, WEXITSTATUS(status));
+ return false;
+ }
+ } else if(WIFSIGNALED(status)) { /* Child was killed by a signal */
+ logger(DEBUG_ALWAYS, LOG_ERR, "Script %s was killed by signal %d (%s)",
+ name, WTERMSIG(status), strsignal(WTERMSIG(status)));
+ return false;
+ } else { /* Something strange happened */
+ logger(DEBUG_ALWAYS, LOG_ERR, "Script %s terminated abnormally", name);
+ return false;
+ }
+ } else {
+ logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "system", strerror(errno));
+ return false;
+ }
+#endif
+#endif
+ return true;