diff options
Diffstat (limited to 'src/libs6/s6_supervise_unlink_names.c')
| -rw-r--r-- | src/libs6/s6_supervise_unlink_names.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/libs6/s6_supervise_unlink_names.c b/src/libs6/s6_supervise_unlink_names.c index a0b424d..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 uint16_t registerit (ftrigr_t *a, 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, fn, "x", 0, deadline, stamp) ; + sa->len = 0 ; + if (sarealpath(sa, fn) == -1) return 0 ; + return ftrigr_subscribe(a, id, 0, 0, sa->s, "x", deadline, stamp) ; } /* @@ -62,9 +66,10 @@ int s6_supervise_unlink_names (char const *scdir, char const *const *names, size } { - ftrigr_t a = FTRIGR_ZERO ; + ftrigr a = FTRIGR_ZERO ; + stralloc sa = STRALLOC_ZERO ; unsigned int m = 0 ; - uint16_t ids[ntotal] ; + uint32_t ids[ntotal] ; if (options & 1 && !ftrigr_startf(&a, deadline, stamp)) return -1 ; for (size_t i = 0 ; i < n ; i++) { @@ -75,13 +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)) { - ids[m] = registerit(&a, fn, scdirlen + 1 + nlen, deadline, stamp) ; - if (ids[m]) 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) ; - ids[m] = registerit(&a, fn, scdirlen + 5 + nlen, deadline, stamp) ; - if (ids[m]) m++ ; + if (registerit(&a, ids + m, fn, scdirlen + 5 + nlen, &sa, deadline, stamp)) m++ ; } } fn[scdirlen + 1 + nlen] = 0 ; @@ -90,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) ; } |
