chiark / gitweb /
fwd: Improve `source' and `target' lifecycle management.
[fwd] / exec.c
diff --git a/exec.c b/exec.c
index 9b7e87b7347ed2376ccfd407f2e16e211e278171..fc8b679795ff6e81c868d37d3650640293114e16 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -33,8 +33,9 @@
 #ifdef HAVE_SETRLIMIT
 
 typedef struct xlimit {
-#define R(r, n) struct rlimit n;
-#include "rlimits.h"
+#define XLIMIT_ENTRY(name, constant) struct rlimit name;
+  RLIMITS(XLIMIT_ENTRY)
+#undef XLIMIT_ENTRY
 } xlimit;
 
 #endif
@@ -138,8 +139,10 @@ typedef struct rlimit_ent {
 } rlimit_ent;
 
 static rlimit_ent rlimits[] = {
-#define R(r, n) { #n, #r, r, offsetof(xlimit, n) },
-#include "rlimits.h"
+#define TABLE_ENTRY(name, constant)                                    \
+  { #name, #constant, constant, offsetof(xlimit, name) },
+  RLIMITS(TABLE_ENTRY)
+#undef TABLE_ENTRY
   { 0, 0, 0, 0 }
 };
 
@@ -269,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:
@@ -446,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);
@@ -454,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;
@@ -559,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;
 }
@@ -596,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)) {
@@ -612,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 --- */
 
@@ -679,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);
@@ -999,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);
@@ -1027,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@ --- */
@@ -1055,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 -------------------------------------------*/
@@ -1079,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);