X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/fwd/blobdiff_plain/1cd4a3bfdaf82f0bc0691671954b239dccb003fb..57ceb980e3c55306f3f70f92604703abf132cf27:/exec.c diff --git a/exec.c b/exec.c index 92c0b26..fc8b679 100644 --- a/exec.c +++ b/exec.c @@ -272,8 +272,9 @@ static int rlimit_option(xlimit *xl, scanner *sc) break; case w_soft: if (v > rl->rlim_max) - error(sc, "soft limit %l exceeds hard limit %l for %s", - v, rl->rlim_max, chosen->rname); + error(sc, "soft limit %lu exceeds hard limit %lu for %s", + (unsigned long)v, (unsigned long)rl->rlim_max, + chosen->rname); rl->rlim_cur = v; break; case w_hard: @@ -449,7 +450,7 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) /* --- Make a pipe for standard error --- */ if (pipe(fd)) { - fw_log(-1, "[%s] couldn't create pipe: %s", xe->desc, strerror(errno)); + fw_log(NOW, "[%s] couldn't create pipe: %s", xe->desc, strerror(errno)); return; } fdflags(fd[0], O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); @@ -457,7 +458,7 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) /* --- Fork a child, and handle an error if there was one --- */ if ((kid = fork()) == -1) { - fw_log(-1, "[%s] couldn't fork: %s", xe->desc, strerror(errno)); + fw_log(NOW, "[%s] couldn't fork: %s", xe->desc, strerror(errno)); close(fd[0]); close(fd[1]); return; @@ -562,7 +563,7 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) xept_list->prev = xe; xept_list = xe; if (!(xe->xo->f & XF_NOLOG)) - fw_log(-1, "[%s] started with pid %i", xe->desc, kid); + fw_log(NOW, "[%s] started with pid %i", xe->desc, kid); fw_inc(); return; } @@ -599,9 +600,9 @@ static void xept_destroy(xept *xe) /* Nothin' doin' */; else if (WIFEXITED(xe->st)) { if (WEXITSTATUS(xe->st) == 0) - fw_log(-1, "[%s] pid %i exited successfully", xe->desc, xe->kid); + fw_log(NOW, "[%s] pid %i exited successfully", xe->desc, xe->kid); else { - fw_log(-1, "[%s] pid %i failed: status %i", + fw_log(NOW, "[%s] pid %i failed: status %i", xe->desc, xe->kid, WEXITSTATUS(xe->st)); } } else if (WIFSIGNALED(xe->st)) { @@ -615,9 +616,10 @@ static void xept_destroy(xept *xe) sprintf(buf, "signal %i", WTERMSIG(xe->st)); s = buf; #endif - fw_log(-1, "[%s] pid %i failed: %s", xe->desc, xe->kid, s); + fw_log(NOW, "[%s] pid %i failed: %s", xe->desc, xe->kid, s); } else - fw_log(-1, "[%s] pid %i failed: unrecognized status", xe->desc, xe->kid); + fw_log(NOW, "[%s] pid %i failed: unrecognized status", + xe->desc, xe->kid); /* --- Free up the parent-side resources --- */ @@ -682,7 +684,7 @@ static void xept_error(char *p, size_t len, void *v) { xept *xe = v; if (p) - fw_log(-1, "[%s] pid %i: %s", xe->desc, xe->kid, p); + fw_log(NOW, "[%s] pid %i: %s", xe->desc, xe->kid, p); else { close(xe->err.reader.fd); selbuf_destroy(&xe->err); @@ -1002,6 +1004,8 @@ static source *xsource_read(scanner *sc) return (0); xs = CREATE(xsource); xs->s.ops = &xsource_ops; + xs->s.ref = 1; + xs->s.f = 0; xs->s.desc = 0; exec_read(&xs->x, sc); return (&xs->s); @@ -1030,18 +1034,12 @@ static void xsource_attach(source *s, scanner *sc, target *t) /* --- Create the endpoints --- */ if ((ee = t->ops->create(t, xs->s.desc)) == 0) - goto tidy; + return; if ((e = exec_endpt(&xs->x, xs->s.desc)) == 0) { ee->ops->close(ee); - goto tidy; + return; } endpt_join(e, ee, xs->s.desc); - - /* --- Dispose of source and target --- */ - -tidy: - t->ops->destroy(t); - xsource_destroy(&xs->s); } /* --- @destroy@ --- */ @@ -1058,7 +1056,7 @@ static void xsource_destroy(source *s) source_ops xsource_ops = { "exec", - xsource_option, xsource_read, xsource_attach, xsource_destroy + xsource_option, xsource_read, xsource_attach, 0, xsource_destroy }; /*----- Exec target description -------------------------------------------*/ @@ -1082,6 +1080,7 @@ static target *xtarget_read(scanner *sc) return (0); xt = CREATE(xtarget); xt->t.ops = &xtarget_ops; + xt->t.ref = 1; exec_read(&xt->x, sc); exec_desc(&xt->x, &d); xt->t.desc = xstrdup(d.buf);