diff options
-rw-r--r-- | doc/s6-devd.html | 2 | ||||
-rw-r--r-- | src/minutils/s6-devd.c | 67 | ||||
-rw-r--r-- | src/minutils/s6-uevent-listener.c | 8 |
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") ; |