aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2026-03-17 16:00:25 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2026-03-17 16:00:25 +0000
commit4cdcab0506e76666800d2bc111c602bb3154cc30 (patch)
tree0debe5948f819f7ed030f569fc333c1d07ff9318
parent41dec6436242c4daccdd9fdee3ac052004c439bd (diff)
downloads6-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/info2
-rw-r--r--src/libs6/s6_supervise_unlink_names.c14
-rw-r--r--src/supervision/s6-svscan.c2
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))