diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-08 23:24:56 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-08 23:24:56 +0000 |
| commit | 82091de2b091fbfa548b0d273067de22d49ca9d3 (patch) | |
| tree | 191991611efbde3d7662104013e27eb2723e8f9d /src/libs6rc | |
| parent | c7c4b79d5d50ee29236038518a2e0bf5a39ed060 (diff) | |
| download | s6-rc-82091de2b091fbfa548b0d273067de22d49ca9d3.tar.gz | |
Reorganize for 4 subs; add makesvlist, start badsub
Diffstat (limited to 'src/libs6rc')
| -rw-r--r-- | src/libs6rc/deps-lib/s6rc | 2 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_badsub.c | 58 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_fillset.c | 13 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makesvlist.c | 64 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_refcompile.c | 2 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_setcompile.c | 4 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sublist.c | 2 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sv_cmp.c | 11 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sync.c | 2 |
9 files changed, 145 insertions, 13 deletions
diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index 4af4acb..e0bfe6e 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -26,9 +26,11 @@ s6rc_repo_lock.o s6rc_repo_makedefbundle.o s6rc_repo_makesetbundles.o s6rc_repo_moveservices.o +s6rc_repo_makesvlist.o s6rc_repo_refcompile.o s6rc_repo_setcompile.o s6rc_repo_sublist.o +s6rc_repo_sv_cmp.o s6rc_repo_sync.o s6rc_sanitize_dir.o s6rc_servicedir_internal.o diff --git a/src/libs6rc/s6rc_repo_badsub.c b/src/libs6rc/s6rc_repo_badsub.c new file mode 100644 index 0000000..8e52913 --- /dev/null +++ b/src/libs6rc/s6rc_repo_badsub.c @@ -0,0 +1,58 @@ +/* ISC license. */ + +#include <string.h> +#include <stdlib.h> +#include <errno.h> + +#include <skalibs/posixplz.h> +#include <skalibs/direntry.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> + +#include <s6-rc/repo.h> + +#define dienomem() strerr_diefu1sys(111, "stralloc_catb") + +typedef int qsortcmp_func (void const *, void const *) ; +typedef qsortcmp_func *qsortcmp_func_ref ; + +static int s6rc_repo_sv_bcmpr (void const *a, void const *b, void *aux) +{ + char const *key = a ; + s6rc_repo_sv const *elem = b ; + stralloc *sa = aux ; + return strcmp(key, sa->s + elem->pos) ; +} + +static int strqcmp (void const *a, void const *b) +{ + char const *const *aa = a ; + char const *const *bb = b ; + return strcmp(*aa, *bb) ; +} + +int s6rc_repo_listinconsistent (char const *repo, char const *set, char const **services, size_t n, uint8_t newsub, s6rc_repo_sv const *svlist, size_t nlist, stralloc *sa, genalloc *inconga) +{ + size_t sabase = sa->len ; + genalloc fulldeps = GENALLOC_ZERO ; + size_t fulln ; + size_t const *ind ; + + if (s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, sub >= 2) <= 0) return 0 ; + qsort(services, n, sizeof(char const *), &strqcmp) ; + fulln = genalloc_len(size_t, &fulldeps) ; + ind = genalloc_s(size_t, &fulldeps) ; + + for (size_t i = 0 ; i < fulln ; i++) + { + s6rc_repo_sv *p ; + char const *cur = sa->s + ind[i] ; + uint8_t oldsub ; + if (bsearch(&cur, services, n, sizeof(char const *), &strqcmp)) continue ; + p = bsearchr(cur, svlist, nlist, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, sa) ; + if (!p) + { + } + } +} diff --git a/src/libs6rc/s6rc_repo_fillset.c b/src/libs6rc/s6rc_repo_fillset.c index 50c0156..5a82ddd 100644 --- a/src/libs6rc/s6rc_repo_fillset.c +++ b/src/libs6rc/s6rc_repo_fillset.c @@ -47,25 +47,22 @@ int s6rc_repo_fillset (char const *repo, char const *set, char const *const *exi memcpy(src + 12, d->d_name, len+1) ; if (n && bsearch(&d->d_name, existing, n, sizeof(char const *), &s6rc_strrefcmp)) continue ; memcpy(src + 12 + len, "/flag-essential", 16) ; - if (access(src, F_OK) == -1) + if (access(src, F_OK) == 0) subi = 3 ; + else { if (errno != ENOENT) { strerr_warnfu2sys("access ", src) ; break ; } - } - else subi = 2 ; - memcpy(src + 18 + len, "recommended", 12) ; - if (access(src, F_OK) == -1) - { - if (errno != ENOENT) + memcpy(src + 18 + len, "recommended", 12) ; + if (access(src, F_OK) == 0) subi = 2 ; + else if (errno != ENOENT) { strerr_warnfu2sys("access ", src) ; break ; } } - else subi = 2 ; src[12 + len] = 0 ; memcpy(dst, setfn, repolen + 10 + setlen) ; memcpy(dst + repolen + 10 + setlen, s6rc_repo_sublist[subi], 6) ; diff --git a/src/libs6rc/s6rc_repo_makesvlist.c b/src/libs6rc/s6rc_repo_makesvlist.c new file mode 100644 index 0000000..4eeacf7 --- /dev/null +++ b/src/libs6rc/s6rc_repo_makesvlist.c @@ -0,0 +1,64 @@ +/* ISC license. */ + +#include <string.h> +#include <stdlib.h> +#include <errno.h> + +#include <skalibs/posixplz.h> +#include <skalibs/direntry.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> + +#include <s6-rc/repo.h> + +#define dienomem() strerr_diefu1sys(111, "stralloc_catb") + +static inline int s6rc_repo_addsub (char const *sub, uint8_t i, stralloc *sa, genalloc *ga) +{ + DIR *dir = opendir(sub) ; + if (!dir) { strerr_warnfu2sys("opendir ", sub) ; return 0 ; } + for (;;) + { + s6rc_repo_sv sv = { .pos = sa->len, .sub = i } ; + direntry *d ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + + if (!stralloc_cats(sa, d->d_name) || !stralloc_0(sa)) dienomem() ; + if (!genalloc_append(s6rc_repo_sv, ga, &sv)) dienomem() ; + } + dir_close(dir) ; + if (errno) { strerr_warnfu2sys("readdir ", sub) ; return 0 ; } + return 1 ; +} + +int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genalloc *ga) +{ + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + size_t sabase = sa->len ; + size_t gabase = genalloc_len(s6rc_repo_sv, ga) ; + int sawasnull = !sa->s ; + int gawasnull = !genalloc_s(s6rc_repo_sv, ga) ; + char subfn[repolen + setlen + 17] ; + + memcpy(subfn, repo, repolen) ; + memcpy(subfn + repolen, "/sources/", 9) ; + memcpy(subfn + repolen + 9, set, setlen) ; + subfn[repolen + 9 + setlen] = '/' ; + for (uint8_t i = 0 ; i < 4 ; i++) + { + memcpy(subfn + repolen + setlen + 10, s6rc_repo_sublist[i], 7) ; + if (!s6rc_repo_addsub(subfn, i, sa, ga)) goto err ; + } + qsortr(genalloc_s(s6rc_repo_sv, ga), genalloc_len(s6rc_repo_sv, ga), sizeof(s6rc_repo_sv), &s6rc_repo_sv_cmp, sa) ; + return 1 ; + + err: + if (sawasnull) stralloc_free(sa) ; else sa->len = sabase ; + if (gawasnull) genalloc_free(s6rc_repo_sv, ga) ; else genalloc_setlen(s6rc_repo_sv, ga, gabase) ; + return 0 ; +} diff --git a/src/libs6rc/s6rc_repo_refcompile.c b/src/libs6rc/s6rc_repo_refcompile.c index 5cc4d18..baffe87 100644 --- a/src/libs6rc/s6rc_repo_refcompile.c +++ b/src/libs6rc/s6rc_repo_refcompile.c @@ -5,5 +5,5 @@ int s6rc_repo_refcompile (char const *repo, char *oldc, unsigned int verbosity, char const *fdhuser) { static char const *const subs[2] = { ".atomics", ".bundles" } ; - return s6rc_repo_compile(repo, ".ref", subs, 3, oldc, verbosity, fdhuser) ; + return s6rc_repo_compile(repo, ".ref", subs, 2, oldc, verbosity, fdhuser) ; } diff --git a/src/libs6rc/s6rc_repo_setcompile.c b/src/libs6rc/s6rc_repo_setcompile.c index 88af42b..82f7d02 100644 --- a/src/libs6rc/s6rc_repo_setcompile.c +++ b/src/libs6rc/s6rc_repo_setcompile.c @@ -4,8 +4,8 @@ int s6rc_repo_setcompile (char const *repo, char const *set, char const *defbundle, char *oldc, unsigned int verbosity, char const *fdhuser) { - static char const *const subs[3] = { "active", "onboot", "bundle" } ; + static char const *const subs[4] = { "active", "onboot", "always", "bundle" } ; if (!s6rc_repo_makesetbundles(repo, set, verbosity)) return -1 ; if (!s6rc_repo_makedefbundle(repo, set, defbundle)) return -1 ; - return s6rc_repo_compile(repo, set, subs, 3, oldc, verbosity, fdhuser) ; + return s6rc_repo_compile(repo, set, subs, 4, oldc, verbosity, fdhuser) ; } diff --git a/src/libs6rc/s6rc_repo_sublist.c b/src/libs6rc/s6rc_repo_sublist.c index ad6ce0e..f252b6e 100644 --- a/src/libs6rc/s6rc_repo_sublist.c +++ b/src/libs6rc/s6rc_repo_sublist.c @@ -2,4 +2,4 @@ #include <s6-rc/repo.h> -char const s6rc_repo_sublist[3][7] = { "masked", "active", "onboot" } ; +char const s6rc_repo_sublist[4][7] = { "masked", "active", "onboot", "always" } ; diff --git a/src/libs6rc/s6rc_repo_sv_cmp.c b/src/libs6rc/s6rc_repo_sv_cmp.c new file mode 100644 index 0000000..472e472 --- /dev/null +++ b/src/libs6rc/s6rc_repo_sv_cmp.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include <s6-rc/repo.h> + +int s6rc_repo_sv_cmp (void const *a, void const *b, void *aux) +{ + s6rc_repo_sv const *aa = a ; + s6rc_repo_sv const *bb = b ; + stralloc *sa = aux ; + return strcmp(sa->s + aa->pos, sa->s + bb->pos) ; +} diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c index e3d71fd..46b14be 100644 --- a/src/libs6rc/s6rc_repo_sync.c +++ b/src/libs6rc/s6rc_repo_sync.c @@ -91,7 +91,7 @@ static int unlink_stales_in_sub (char const *repo, char const *set, char const * static inline int s6rc_repo_syncset (char const *repo, size_t repolen, char const *set, stralloc *sa, genalloc *ga, unsigned int verbosity) { - for (unsigned int i = 0 ; i < 3 ; i++) + for (unsigned int i = 0 ; i < 4 ; i++) if (unlink_stales_in_sub(repo, set, s6rc_repo_sublist[i], i, sa, ga, verbosity)) goto err ; { |
