diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2026-03-17 16:00:25 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2026-03-17 16:00:25 +0000 |
| commit | 4cdcab0506e76666800d2bc111c602bb3154cc30 (patch) | |
| tree | 0debe5948f819f7ed030f569fc333c1d07ff9318 | |
| parent | 41dec6436242c4daccdd9fdee3ac052004c439bd (diff) | |
| download | s6-4cdcab0506e76666800d2bc111c602bb3154cc30.tar.gz | |
s6-svscan trivial fix; s6-svunlink bugfix; start prep for 2.15.0.0
s6_supervise_unlink_names can spawn a s6-ftrigrd to wait for an 'x'
event. This creates a fifodir under $scandir/$name/event. But after
the unlink, $scandir/$name doesn't exist anymore, so s6-ftrigrd
fails to clean it up. To fix that, we subscribe with the realpath
of $scandir/$name instead.
| -rw-r--r-- | package/info | 2 | ||||
| -rw-r--r-- | src/libs6/s6_supervise_unlink_names.c | 14 | ||||
| -rw-r--r-- | src/supervision/s6-svscan.c | 2 |
3 files changed, 12 insertions, 6 deletions
diff --git a/package/info b/package/info index 8c56c0c..edaa30f 100644 --- a/package/info +++ b/package/info @@ -1,4 +1,4 @@ package=s6 -version=2.14.0.1 +version=2.15.0.0 category=admin package_macro_name=S6 diff --git a/src/libs6/s6_supervise_unlink_names.c b/src/libs6/s6_supervise_unlink_names.c index d8bb4e0..a6c7be5 100644 --- a/src/libs6/s6_supervise_unlink_names.c +++ b/src/libs6/s6_supervise_unlink_names.c @@ -8,14 +8,18 @@ #include <skalibs/posixplz.h> #include <skalibs/bitarray.h> +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> #include <s6/ftrigr.h> #include <s6/supervise.h> -static int registerit (ftrigr *a, uint32_t *id, char *fn, size_t len, tain const *deadline, tain *stamp) +static int registerit (ftrigr *a, uint32_t *id, char *fn, size_t len, stralloc *sa, tain const *deadline, tain *stamp) { memcpy(fn + len, "/" S6_SUPERVISE_EVENTDIR, sizeof(S6_SUPERVISE_EVENTDIR) + 1) ; - return ftrigr_subscribe(a, id, 0, 0, fn, "x", deadline, stamp) ; + sa->len = 0 ; + if (sarealpath(sa, fn) == -1) return 0 ; + return ftrigr_subscribe(a, id, 0, 0, sa->s, "x", deadline, stamp) ; } /* @@ -63,6 +67,7 @@ int s6_supervise_unlink_names (char const *scdir, char const *const *names, size { ftrigr a = FTRIGR_ZERO ; + stralloc sa = STRALLOC_ZERO ; unsigned int m = 0 ; uint32_t ids[ntotal] ; if (options & 1 && !ftrigr_startf(&a, deadline, stamp)) return -1 ; @@ -75,11 +80,11 @@ int s6_supervise_unlink_names (char const *scdir, char const *const *names, size memcpy(fn + scdirlen + 1, names[i], nlen) ; if (options & 1 && bitarray_peek(locked, i)) { - if (registerit(&a, ids + m, fn, scdirlen + 1 + nlen, deadline, stamp)) m++ ; + if (registerit(&a, ids + m, fn, scdirlen + 1 + nlen, &sa, deadline, stamp)) m++ ; if (bitarray_peek(logged, i)) { memcpy(fn + scdirlen + 1 + nlen, "/log", 4) ; - if (registerit(&a, ids + m, fn, scdirlen + 5 + nlen, deadline, stamp)) m++ ; + if (registerit(&a, ids + m, fn, scdirlen + 5 + nlen, &sa, deadline, stamp)) m++ ; } } fn[scdirlen + 1 + nlen] = 0 ; @@ -88,6 +93,7 @@ int s6_supervise_unlink_names (char const *scdir, char const *const *names, size s6_svc_writectl(scdir, S6_SVSCAN_CTLDIR, "an", 2) ; if (options & 1) { + stralloc_free(&sa) ; ftrigr_wait_and(&a, ids, m, deadline, stamp) ; ftrigr_end(&a) ; } diff --git a/src/supervision/s6-svscan.c b/src/supervision/s6-svscan.c index cf73c13..2f425a2 100644 --- a/src/supervision/s6-svscan.c +++ b/src/supervision/s6-svscan.c @@ -683,7 +683,7 @@ int main (int argc, char const *const *argv) PROG = "s6-svscan" ; golc = gol_main(argc, argv, 0, 0, rgola, GOLA_N, 0, wgola) ; argc -= golc ; argv += golc ; - if (argc < 2) dieusage() ; + if (!argc) dieusage() ; if (wgola[GOLA_MAX]) { if (!uint320_scan(wgola[GOLA_MAX], &max)) |
