summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/s6-devd.html2
-rw-r--r--src/minutils/s6-devd.c67
-rw-r--r--src/minutils/s6-uevent-listener.c8
3 files changed, 40 insertions, 37 deletions
diff --git a/doc/s6-devd.html b/doc/s6-devd.html
index d2f85f3..13e4dec 100644
--- a/doc/s6-devd.html
+++ b/doc/s6-devd.html
@@ -32,7 +32,7 @@ interface does.
 
 <ul>
  <li> s6-devd rewrites its command line into
-<tt><a href="s6-uevent-listener.html">s6-uevent-listener</a>
+<tt><a href="s6-uevent-listener.html">s6-uevent-listener</a> <tt>|</tt>
 <a href="s6-uevent-spawner.html">s6-uevent-spawner</a> <em>prog...</em></tt>,
 dispatching its options to the appropriate programs; then it execs into
 this new command line. It does nothing else: it's just a wrapper. </li>
diff --git a/src/minutils/s6-devd.c b/src/minutils/s6-devd.c
index f14a8f1..7122e13 100644
--- a/src/minutils/s6-devd.c
+++ b/src/minutils/s6-devd.c
@@ -30,6 +30,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
   unsigned int kbufsz = 65536, verbosity = 1 ;
   char const *linevar = 0 ;
   char const *targ = 0 ;
+  char fmtv[UINT_FMT] ;
   PROG = "s6-devd" ;
   {
     subgetopt_t l = SUBGETOPT_ZERO ;
@@ -50,50 +51,54 @@ int main (int argc, char const *const *argv, char const *const *envp)
     argc -= l.ind ; argv += l.ind ;
   }
   if (!argc) strerr_dieusage(100, USAGE) ;
+  if (verbosity != 1) fmtv[uint_fmt(fmtv, verbosity)] = 0 ;
 
   {
-    size_t pos = 0 ;
     unsigned int m = 0 ;
-    char fmt[UINT_FMT * 3] ;
-    char const *newargv[argc + 15] ;
-    newargv[m++] = S6_LINUX_UTILS_BINPREFIX "s6-uevent-listener" ;
+    int fd ;
+    char const *cargv[argc + 9] ;
+    cargv[m++] = S6_LINUX_UTILS_BINPREFIX "s6-uevent-spawner" ;
     if (verbosity != 1)
     {
-      newargv[m++] = "-v" ;
-      newargv[m++] = fmt + pos ;
-      pos += uint_fmt(fmt + pos, verbosity) ;
-      fmt[pos++] = 0 ;
+      cargv[m++] = "-v" ;
+      cargv[m++] = fmtv ;
     }
-    if (kbufsz != 65536)
+    if (linevar)
     {
-      newargv[m++] = "-b" ;
-      newargv[m++] = fmt + pos ;
-      pos += uint_fmt(fmt + pos, kbufsz) ;
-      fmt[pos++] = 0 ;
+      cargv[m++] = "-l" ;
+      cargv[m++] = linevar ;
     }
-    newargv[m++] = "--" ;
-    newargv[m++] = S6_LINUX_UTILS_BINPREFIX "s6-uevent-spawner" ;
-    if (verbosity != 1)
+    if (targ)
     {
-      newargv[m++] = "-v" ;
-      newargv[m++] = fmt + pos ;
-      pos += uint_fmt(fmt + pos, verbosity) ;
-      fmt[pos++] = 0 ;
+      cargv[m++] = "-t" ;
+      cargv[m++] = targ ;
     }
-    if (linevar)
+    cargv[m++] = "--" ;
+    while (*argv) cargv[m++] = *argv++ ;
+    cargv[m++] = 0 ;
+    if (!child_spawn1_pipe(cargv[0], cargv, envp, &fd, 0))
+      strerr_diefu2sys(111, "spawn ", cargv[0]) ;
+    if (fd_move(1, fd) < 0) strerr_diefu1sys(111, "fd_move") ;
+  }
+
+  {
+    unsigned int m = 0 ;
+    char const *pargv[6] ;
+    char fmtk[UINT_FMT] ;
+    pargv[m++] = S6_LINUX_UTILS_BINPREFIX "s6-uevent-listener" ;
+    if (verbosity != 1)
     {
-      newargv[m++] = "-l" ;
-      newargv[m++] = linevar ;
+      pargv[m++] = "-v" ;
+      pargv[m++] = fmtv ;
     }
-    if (targ)
+    if (kbufsz != 65536)
     {
-      newargv[m++] = "-t" ;
-      newargv[m++] = targ ;
+      pargv[m++] = "-b" ;
+      pargv[m++] = fmtk ;
+      fmtk[uint_fmt(fmtk, kbufsz)] = 0 ;
     }
-    newargv[m++] = "--" ;
-    while (*argv) newargv[m++] = *argv++ ;
-    newargv[m++] = 0 ;
-    pathexec_run(newargv[0], newargv, envp) ;
-    strerr_dieexec(111, newargv[0]) ;
+    pargv[m++] = 0 ;
+    pathexec_run(pargv[0], pargv, envp) ;
+    strerr_dieexec(111, pargv[0]) ;
   }
 }
diff --git a/src/minutils/s6-uevent-listener.c b/src/minutils/s6-uevent-listener.c
index e882821..4998cd9 100644
--- a/src/minutils/s6-uevent-listener.c
+++ b/src/minutils/s6-uevent-listener.c
@@ -156,12 +156,10 @@ int main (int argc, char const *const *argv, char const *const *envp)
     r = iopause(x, 2 + cont, 0, 0) ;
     if (r < 0) strerr_diefu1sys(111, "iopause") ;
     if (!r) continue ;
-    for (r = 0 ; r < 2 ; r++)
-      if (x[r].revents & IOPAUSE_EXCEPT)
-        x[r].revents |= IOPAUSE_READ | IOPAUSE_WRITE ;
-    if (x[0].revents & IOPAUSE_READ) handle_signals() ;
+    if (x[1].revents & IOPAUSE_EXCEPT) break ;
     if (x[1].revents & IOPAUSE_WRITE) handle_stdout() ;
-    if (cont && x[2].events & IOPAUSE_READ && x[2].revents & IOPAUSE_READ)
+    if (x[0].revents & (IOPAUSE_READ | IOPAUSE_EXCEPT)) handle_signals() ;
+    if (cont && x[2].events & IOPAUSE_READ && x[2].revents & (IOPAUSE_READ | IOPAUSE_EXCEPT))
       handle_netlink() ;
   }
   if (verbosity >= 2) strerr_warni1x("exiting") ;