diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-22 00:12:06 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-22 00:12:06 +0000 |
| commit | 1b5442d9e15cb9549e2f2b25cb8f776482189054 (patch) | |
| tree | e1a31107898403d6544f15f0bc3a6e8a1282a252 /src/libs6rc | |
| parent | 0efd4cf8041f107a4460cfefa16667ee012e85d3 (diff) | |
| download | s6-rc-1b5442d9e15cb9549e2f2b25cb8f776482189054.tar.gz | |
Add s6rc_repo_fixset
Diffstat (limited to 'src/libs6rc')
| -rw-r--r-- | src/libs6rc/deps-lib/s6rc | 2 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_badsub.c | 7 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_fixset.c | 97 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makesvlist.c | 4 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makesvlist_byname.c | 14 |
5 files changed, 119 insertions, 5 deletions
diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index 62fdd6f..a4bb8bd 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -18,6 +18,7 @@ s6rc_repo_badsub.o s6rc_repo_cleanup.o s6rc_repo_compile.o s6rc_repo_fillset.o +s6rc_repo_fixset.o s6rc_repo_flattenservices.o s6rc_repo_listalldeps.o s6rc_repo_listcontents.o @@ -28,6 +29,7 @@ s6rc_repo_lock.o s6rc_repo_makedefbundle.o s6rc_repo_makesetbundles.o s6rc_repo_makesvlist.o +s6rc_repo_makesvlist_byname.o s6rc_repo_moveservices.o s6rc_repo_refcompile.o s6rc_repo_setcompile.o diff --git a/src/libs6rc/s6rc_repo_badsub.c b/src/libs6rc/s6rc_repo_badsub.c index fc2a6ba..69697eb 100644 --- a/src/libs6rc/s6rc_repo_badsub.c +++ b/src/libs6rc/s6rc_repo_badsub.c @@ -18,7 +18,7 @@ static int strqcmp (void const *a, void const *b) return strcmp(*(char const *const *)a, *(char const *const *)b) ; } -int s6rc_repo_badsub (char const *repo, char const *set, char const **services, uint32_t n, uint8_t newsub, s6rc_repo_sv const *svlist, uint32_t ntot, stralloc *sa, genalloc *badga) +int s6rc_repo_badsub (char const *repo, char const *set, char const **services, uint32_t n, uint8_t newsub, uint8_t what, s6rc_repo_sv const *svlist, uint32_t ntot, stralloc *sa, genalloc *badga) { int sawasnull = !!sa->s ; int gawasnull = !!genalloc_s(uint32_t, badga) ; @@ -29,9 +29,9 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services, size_t const *ind ; uint32_t mid ; - if (newsub < 3 && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 0)) return 0 ; + if (newsub < 3 && (what & 1) && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 0)) return 0 ; mid = genalloc_len(size_t, &fulldeps) ; - if (newsub > 0 && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 1)) goto err ; + if (newsub > 0 && (what & 2) && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 1)) goto err ; qsort(services, n, sizeof(char const *), &strqcmp) ; fulln = genalloc_len(size_t, &fulldeps) ; @@ -62,6 +62,7 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services, return 1 ; err: + genalloc_free(size_t, &fulldeps) ; if (sawasnull) stralloc_free(sa) ; else sa->len = sabase ; if (gawasnull) genalloc_free(uint32_t, badga) ; else genalloc_setlen(uint32_t, badga, gabase) ; return 0 ; diff --git a/src/libs6rc/s6rc_repo_fixset.c b/src/libs6rc/s6rc_repo_fixset.c new file mode 100644 index 0000000..efc6320 --- /dev/null +++ b/src/libs6rc/s6rc_repo_fixset.c @@ -0,0 +1,97 @@ +/* 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> + +static inline int s6rc_repo_fixsub (char const *repo, char const *set, uint8_t sub, s6rc_repo_sv *byname, char const **bysub, uint32_t ntot, uint32_t options, uint32_t const *subind, uint32_t const *subn, unsigned int verbosity, stralloc *sa, genalloc *badga) +{ + size_t sabase = sa->len ; + uint32_t gabase = genalloc_len(uint32_t, badga) ; + uint32_t const *bads ; + uint32_t badn ; + if (!s6rc_repo_badsub(repo, set, bysub + subind[sub], subn[sub], sub, options & 1 ? 2 : 1, byname, ntot, sa, badga)) return 0 ; + bads = genalloc_s(uint32_t, badga) ; + badn = genalloc_len(uint32_t, badga) ; + if (!badn) return 1 ; + + s6rc_repo_sv tomove[badn] ; + for (uint32_t j = 0 ; j < badn ; j++) + { + tomove[j] = byname[bads[j]] ; + if (verbosity >= 2) + strerr_warni("in set ", set, " of repository ", repo, ": ", options & 1 ? "up" : "down", "fixing service ", sa->s + tomove[j].pos, " from ", s6rc_repo_subnames[tomove[j].sub], " to ", s6rc_repo_subnames[sub]) ; + if (tomove[j].sub == 0 && verbosity) + strerr_warnw("service ", sa->s + tomove[j].pos, " is being automatically unmasked by an upfix to ", s6rc_repo_subnames[sub]) ; + if (tomove[j].sub == 3) + { + if (!(options & 2)) + { + strerr_warnf("in set ", set, " of repository ", repo, ": service ", sa->s + tomove[j].pos, " is marked as essential and cannot be downfixed. If you are sure of yourself, try --force-essential") ; + goto err ; + } + if (verbosity) + strerr_warnw("service ", sa->s + tomove[j].pos, " is being automatically marked non-essential by a downfix to ", s6rc_repo_subnames[sub]) ; + } + } + if (!s6rc_repo_moveservices(repo, set, tomove, badn, sub, sa->s, verbosity)) goto err ; + for (uint32_t j = 0 ; j < badn ; j++) byname[bads[j]].sub = sub ; + genalloc_setlen(uint32_t, badga, gabase) ; + sa->len = sabase ; + return 1 ; + + err: + genalloc_setlen(uint32_t, badga, gabase) ; + sa->len = sabase ; + return 0 ; +} + +int s6rc_repo_fixset (char const *repo, char const *set, uint32_t options, unsigned int verbosity, stralloc *sa, genalloc *svlist, genalloc *badga) +{ + int sawasnull = !sa->s ; + int svwasnull = !genalloc_s(s6rc_repo_sv, svlist) ; + int gawasnull = !genalloc_s(uint32_t, badga) ; + size_t sabase = sa->len ; + uint32_t svbase = genalloc_len(s6rc_repo_sv, svlist) ; + uint32_t gabase = genalloc_len(uint32_t, badga) ; + uint32_t ntot ; + uint32_t subind[4] ; + uint32_t sublen[4] ; + s6rc_repo_sv *byname ; + if (!s6rc_repo_makesvlist(repo, set, sa, svlist, subind)) return 0 ; + byname = genalloc_s(s6rc_repo_sv, svlist) ; + ntot = genalloc_len(s6rc_repo_sv, svlist) ; + if (!ntot) return 1 ; + for (uint8_t i = 0 ; i < 4 ; i++) sublen[i] = (i == 3 ? ntot : subind[i+1]) - subind[i] ; + + char const *bysub[ntot] ; + char bysub_storage[sa->len - sabase] ; + memcpy(bysub_storage, sa->s + sabase, sa->len - sabase) ; + for (uint32_t i = 0 ; i < ntot ; i++) bysub[i] = bysub_storage + byname[i].pos - sabase ; + qsortr(byname, ntot, sizeof(s6rc_repo_sv), &s6rc_repo_sv_cmpr, sa->s) ; + + for (uint8_t i = 0 ; i < 4 ; i++) if (sublen[i]) + { + if (!s6rc_repo_fixsub(repo, set, i, byname, bysub, ntot, options, subind, sublen, verbosity, sa, badga)) + goto err ; + } + + genalloc_setlen(uint32_t, badga, gabase) ; + genalloc_setlen(s6rc_repo_sv, svlist, svbase) ; + sa->len = sabase ; + return 1 ; + + err: + if (gawasnull) genalloc_free(uint32_t, badga) ; else genalloc_setlen(uint32_t, badga, gabase) ; + if (svwasnull) genalloc_free(s6rc_repo_sv, svlist) ; else genalloc_setlen(s6rc_repo_sv, svlist, svbase) ; + if (sawasnull) stralloc_free(sa) ; else sa->len = sabase ; + return 0 ; +} diff --git a/src/libs6rc/s6rc_repo_makesvlist.c b/src/libs6rc/s6rc_repo_makesvlist.c index 3567bf7..99a174e 100644 --- a/src/libs6rc/s6rc_repo_makesvlist.c +++ b/src/libs6rc/s6rc_repo_makesvlist.c @@ -37,7 +37,7 @@ static inline int s6rc_repo_addsub (char const *sub, uint8_t i, stralloc *sa, ge return 0 ; } -int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genalloc *ga) +int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genalloc *ga, uint32_t *tab) { size_t repolen = strlen(repo) ; size_t setlen = strlen(set) ; @@ -53,10 +53,10 @@ int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genal subfn[repolen + 9 + setlen] = '/' ; for (uint8_t i = 0 ; i < 4 ; i++) { + if (tab) tab[i] = genalloc_len(s6rc_repo_sv, ga) ; memcpy(subfn + repolen + setlen + 10, s6rc_repo_subnames[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_cmpr, sa->s) ; return 1 ; err: diff --git a/src/libs6rc/s6rc_repo_makesvlist_byname.c b/src/libs6rc/s6rc_repo_makesvlist_byname.c new file mode 100644 index 0000000..c017be6 --- /dev/null +++ b/src/libs6rc/s6rc_repo_makesvlist_byname.c @@ -0,0 +1,14 @@ +/* ISC license. */ + +#include <skalibs/posixplz.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> + +#include <s6-rc/repo.h> + +int s6rc_repo_makesvlist_byname (char const *repo, char const *set, stralloc *sa, genalloc *ga) +{ + if (!s6rc_repo_makesvlist(repo, set, sa, ga, 0)) return 0 ; + qsortr(genalloc_s(s6rc_repo_sv, ga), genalloc_len(s6rc_repo_sv, ga), sizeof(s6rc_repo_sv), &s6rc_repo_sv_cmpr, sa->s) ; + return 1 ; +} |
