+
+/*
+ * run-program - execute a program with given arguments.
+ * Returns the exit status, or -1 if an error occurred.
+ * If the program can't be executed, logs an error unless
+ * must_exist is 0 and the program file doesn't exist.
+ */
+
+int
+run_program(prog, args, must_exist)
+ char *prog;
+ char **args;
+ int must_exist;
+{
+ pid_t pid;
+ int status;
+
+ pid = fork();
+ if (pid == -1) {
+ syslog(LOG_ERR, "can't fork to run %s: %m", prog);
+ return -1;
+ }
+ if (pid == 0) {
+ execv(prog, args);
+ if (must_exist || errno != ENOENT)
+ syslog(LOG_WARNING, "can't execute %s: %m", prog);
+ _exit(-1);
+ }
+ if (waitpid(pid, &status, 0) == -1) {
+ syslog(LOG_ERR, "waitpid: %m");
+ return -1;
+ }
+ if (WIFSIGNALED(status)) {
+ syslog(LOG_INFO, "%s terminated with signal %d", prog,
+ WTERMSIG(status));
+ return -1;
+ }
+ return WEXITSTATUS(status);
+}