* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#define RCSID "$Id: main.c,v 1.153 2006/06/04 03:52:50 paulus Exp $"
+#define RCSID "$Id: main.c,v 1.156 2008/06/23 11:47:18 paulus Exp $"
#include <stdio.h>
#include <ctype.h>
char *prog;
void (*done) __P((void *));
void *arg;
+ int killable;
struct subprocess *next;
};
int sig;
{
struct sigaction act, oldact;
+ struct subprocess *chp;
+
+ if (!detached) {
+ /*
+ * There might be other things in our process group that we
+ * didn't start that would get hit if we did a kill(0), so
+ * just send the signal individually to our children.
+ */
+ for (chp = children; chp != NULL; chp = chp->next)
+ if (chp->killable)
+ kill(chp->pid, sig);
+ return;
+ }
+ /* We've done a setsid(), so we can just use a kill(0) */
sigemptyset(&act.sa_mask); /* unnecessary in fact */
act.sa_handler = SIG_IGN;
act.sa_flags = 0;
if (errfd == 0 || errfd == 1)
errfd = dup(errfd);
+ closelog();
+
/* dup the in, out, err fds to 0, 1, 2 */
if (infd != 0)
dup2(infd, 0);
if (errfd != 2)
dup2(errfd, 2);
- closelog();
if (log_to_fd > 2)
close(log_to_fd);
if (the_channel->close)
}
if (pid != 0) {
- if (dont_wait) {
- record_child(pid, program, NULL, NULL);
- status = 0;
- } else {
+ record_child(pid, program, NULL, NULL, 1);
+ status = 0;
+ if (!dont_wait) {
while (waitpid(pid, &status, 0) < 0) {
if (errno == EINTR)
continue;
fatal("error waiting for (dis)connection process: %m");
}
+ forget_child(pid, status);
--conn_running;
}
return (status == 0 ? 0 : -1);
/*
- * run-program - execute a program with given arguments,
+ * run_program - execute a program with given arguments,
* but don't wait for it unless wait is non-zero.
* If the program can't be executed, logs an error unless
* must_exist is 0 and the program file doesn't exist.
if (pid != 0) {
if (debug)
dbglog("Script %s started (pid %d)", prog, pid);
- record_child(pid, prog, done, arg);
+ record_child(pid, prog, done, arg, 0);
if (wait) {
while (waitpid(pid, &status, 0) < 0) {
if (errno == EINTR)
* to use.
*/
void
-record_child(pid, prog, done, arg)
+record_child(pid, prog, done, arg, killable)
int pid;
char *prog;
void (*done) __P((void *));
void *arg;
+ int killable;
{
struct subprocess *chp;
chp->done = done;
chp->arg = arg;
chp->next = children;
+ chp->killable = killable;
children = chp;
}
}
dbuf.dptr = vbuf;
dbuf.dsize = vlen;
if (tdb_store(pppdb, key, dbuf, TDB_REPLACE))
- error("tdb_store failed: %s", tdb_error(pppdb));
+ error("tdb_store failed: %s", tdb_errorstr(pppdb));
if (vbuf)
free(vbuf);
dbuf.dptr = db_key;
dbuf.dsize = strlen(db_key);
if (tdb_store(pppdb, key, dbuf, TDB_REPLACE))
- error("tdb_store key failed: %s", tdb_error(pppdb));
+ error("tdb_store key failed: %s", tdb_errorstr(pppdb));
}
/*