diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-12-20 23:50:19 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-12-20 23:50:19 +0000 |
| commit | b24a07fca1f2a410b3d97d1e3dc5de7720ad1d76 (patch) | |
| tree | b7294449f6640f2b9f75b5783d734464bd1dc8cd /src/repo | |
| parent | 6dd777fafbd23296d6bd91f8076f4b0ea5bae24e (diff) | |
| download | s6-rc-b24a07fca1f2a410b3d97d1e3dc5de7720ad1d76.tar.gz | |
Working repo fix that understands pipelines
Diffstat (limited to 'src/repo')
| -rw-r--r-- | src/repo/deps-lib/s6rcrepo | 1 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-change.c | 9 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-commit.c | 14 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-fix.c | 9 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_badpipeline.c | 96 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_badsub.c | 32 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_fixset.c | 35 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_flattenservices.c | 8 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_listcontents.c | 32 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_listdeps_internal.c | 8 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_ls.c | 8 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_makedefbundle.c | 2 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_makesetbundles.c | 10 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_makesvlist.c | 6 |
14 files changed, 185 insertions, 85 deletions
diff --git a/src/repo/deps-lib/s6rcrepo b/src/repo/deps-lib/s6rcrepo index c9d90f2..10737ee 100644 --- a/src/repo/deps-lib/s6rcrepo +++ b/src/repo/deps-lib/s6rcrepo @@ -1,3 +1,4 @@ +s6rc_repo_badpipeline.o s6rc_repo_badsub.o s6rc_repo_checkset.o s6rc_repo_cleanup.o diff --git a/src/repo/s6-rc-set-change.c b/src/repo/s6-rc-set-change.c index 439a865..d413eb1 100644 --- a/src/repo/s6-rc-set-change.c +++ b/src/repo/s6-rc-set-change.c @@ -14,7 +14,6 @@ #include <skalibs/genalloc.h> #include <skalibs/tai.h> #include <skalibs/djbunix.h> -#include <skalibs/lolstdio.h> #include <s6-rc/config.h> #include <s6-rc/s6rc.h> @@ -100,6 +99,7 @@ int main (int argc, char const *const *argv) stralloc storage = STRALLOC_ZERO ; genalloc svlist = GENALLOC_ZERO ; /* s6rc_repo_sv */ genalloc indices = GENALLOC_ZERO ; /* size_t then uint32_t */ + genalloc gatmp = GENALLOC_ZERO ; /* size_t */ int fdlock ; unsigned int verbosity = 1 ; unsigned int forcelevel = 1 ; @@ -176,7 +176,8 @@ int main (int argc, char const *const *argv) memcpy(tmpstore + m, storage.s + list[ind[i]].pos, len) ; m += len ; } - if (!s6rc_repo_badsub(wgola[GOLA_REPODIR], argv[0], tmpstart, n, newsub->sub, 3, list, listn, &storage, &indices)) _exit(111) ; + if (!s6rc_repo_badsub(wgola[GOLA_REPODIR], argv[0], tmpstart, n, newsub->sub, 3, list, listn, &storage, &indices, &gatmp)) _exit(111) ; + // genalloc_free(size_t, &gatmp) ; if (genalloc_len(uint32_t, &indices)) { uint32_t const *bads = genalloc_s(uint32_t, &indices) ; @@ -189,7 +190,7 @@ int main (int argc, char const *const *argv) arg[2] = !forcelevel ? "fatal" : "warning" ; arg[3] = ": the following services (" ; arg[4] = newsub->sub >= 2 ? "dependencies of" : "depending on" ; - arg[5] = " the ones given as arguments) " ; + arg[5] = " the ones given as arguments, or part of the same pipeline) " ; arg[6] = forcelevel == 2 ? "are also being" : "also need to be" ; arg[7] = " changed to \"" ; arg[8] = s6rc_repo_subnames[newsub->sub] ; @@ -213,7 +214,7 @@ int main (int argc, char const *const *argv) } } } - genalloc_free(uint32_t, &indices) ; + // genalloc_free(uint32_t, &indices) ; if (!(wgolb & GOLB_DRYRUN)) { diff --git a/src/repo/s6-rc-set-commit.c b/src/repo/s6-rc-set-commit.c index e5a3619..95af67d 100644 --- a/src/repo/s6-rc-set-commit.c +++ b/src/repo/s6-rc-set-commit.c @@ -88,6 +88,20 @@ int main (int argc, char const *const *argv) } } + { + stralloc sa = STRALLOC_ZERO ; + genalloc svlist = GENALLOC_ZERO ; /* s6rc_repo_sv */ + genalloc badga = GENALLOC_ZERO ; /* uint32_t */ + genalloc gatmp = GENALLOC_ZERO ; /* size_t whatever */ + int e = s6rc_repo_fixset(wgola[GOLA_REPODIR], argv[0], 8, verbosity, &sa, &svlist, &badga, &gatmp) ; + if (e == 1) strerr_diefu1x(1, "commit: found inconsistent dependencies") ; + if (e) _exit(e) ; + // genalloc_free(uint32_t, &badga) ; + // genalloc_free(s6rc_repo_sv, &svlist) ; + // genalloc_free(&gatmp) ; + // stralloc_free(&sa) ; + } + size_t oldclen = S6RC_REPO_COMPILE_BUFLEN(strlen(wgola[GOLA_REPODIR]), strlen(argv[0])) ; char oldc[oldclen] ; diff --git a/src/repo/s6-rc-set-fix.c b/src/repo/s6-rc-set-fix.c index 54e8c3c..630a2b4 100644 --- a/src/repo/s6-rc-set-fix.c +++ b/src/repo/s6-rc-set-fix.c @@ -26,7 +26,7 @@ enum gola_e GOLA_N } ; -static int fixall (char const *repo, unsigned int options, unsigned int verbosity, stralloc *sa, genalloc *svlist, stralloc *badga) +static int fixall (char const *repo, unsigned int options, unsigned int verbosity, stralloc *sa, genalloc *svlist, genalloc *badga, genalloc *gatmp) { stralloc setnames = STRALLOC_ZERO ; genalloc setindices = GENALLOC_ZERO ; /* size_t */ @@ -34,7 +34,7 @@ static int fixall (char const *repo, unsigned int options, unsigned int verbosit if (n == -1) { strerr_warnfu2sys("list sets at ", repo) ; return 111 ; } for (unsigned int i = 0 ; i < n ; i++) { - int e = s6rc_repo_fixset(repo, setnames.s + genalloc_s(size_t, &setindices)[i], options, verbosity, sa, svlist, badga) ; + int e = s6rc_repo_fixset(repo, setnames.s + genalloc_s(size_t, &setindices)[i], options, verbosity, sa, svlist, badga, gatmp) ; if (e) return e ; } // genalloc_free(size_t, &setindices) ; @@ -60,6 +60,7 @@ int main (int argc, char const **argv) stralloc sa = STRALLOC_ZERO ; genalloc svlist = GENALLOC_ZERO ; /* s6rc_repo_sv */ genalloc badga = GENALLOC_ZERO ; /* uint32_t */ + genalloc gatmp = GENALLOC_ZERO ; /* size_t whatever */ unsigned int verbosity = 1 ; int fdlock ; uint64_t wgolb = 0 ; @@ -79,7 +80,7 @@ int main (int argc, char const **argv) fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ; if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ; - if (!argc) _exit(fixall(wgola[GOLA_REPODIR], wgolb & 7, verbosity, &sa, &svlist, &badga)) ; + if (!argc) _exit(fixall(wgola[GOLA_REPODIR], wgolb & 7, verbosity, &sa, &svlist, &badga, &gatmp)) ; for (unsigned int i = 0 ; i < argc ; i++) { @@ -88,7 +89,7 @@ int main (int argc, char const **argv) } for (unsigned int i = 0 ; i < argc ; i++) { - int e = s6rc_repo_fixset(wgola[GOLA_REPODIR], argv[i], wgolb & 7, verbosity, &sa, &svlist, &badga) ; + int e = s6rc_repo_fixset(wgola[GOLA_REPODIR], argv[i], wgolb & 7, verbosity, &sa, &svlist, &badga, &gatmp) ; if (e) _exit(e) ; } _exit(0) ; diff --git a/src/repo/s6rc_repo_badpipeline.c b/src/repo/s6rc_repo_badpipeline.c new file mode 100644 index 0000000..654408d --- /dev/null +++ b/src/repo/s6rc_repo_badpipeline.c @@ -0,0 +1,96 @@ +/* ISC license. */ + +#include <sys/wait.h> +#include <string.h> +#include <unistd.h> + +#include <skalibs/posixplz.h> +#include <skalibs/types.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> +#include <skalibs/cspawn.h> +#include <skalibs/djbunix.h> + +#include <s6-rc/config.h> +#include <s6-rc/repo.h> + +static int notfound (uint32_t k, uint32_t const *tab, uint32_t n) +{ + for (uint32_t i = 0 ; i < n ; i++) if (k == tab[i]) return 0 ; + return 1 ; +} + +int s6rc_repo_badpipeline (char const *repo, char const *set, size_t svind, s6rc_repo_sv const *svlist, uint32_t ntot, uint8_t newsub, stralloc *sa, genalloc *badga) +{ + size_t sabase = sa->len ; + size_t gabase = genalloc_len(uint32_t, badga) ; + size_t repolen = strlen(repo) ; + pid_t pid ; + int fd ; + int wstat ; + size_t mark = sabase ; + char refdb[repolen + 15] ; + char const *argv[8] = { S6RC_BINPREFIX "s6-rc-db", "-c", refdb, "-b", "--", "pipeline", sa->s + svind, 0 } ; + memcpy(refdb, repo, repolen) ; + memcpy(refdb + repolen, "/compiled/.ref", 15) ; + pid = child_spawn1_pipe(argv[0], argv, (char const *const *)environ, &fd, 1) ; + if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return 111 ; } + if (!slurpn(fd, sa, 0)) { strerr_warnfu2sys("read output from ", argv[0]) ; return 111 ; } + fd_close(fd) ; + if (wait_pid(pid, &wstat) == -1) + { + strerr_warnfu2sys("wait for ", argv[0]) ; + return 111 ; + } + if (WIFSIGNALED(wstat)) + { + char fmt[UINT_FMT] ; + fmt[uint_fmt(fmt, WTERMSIG(wstat))] = 0 ; + strerr_warnf3x(argv[0], " crashed with signal ", fmt) ; + return wait_estatus(wstat) ; + } + if (WEXITSTATUS(wstat) == 5) return 0 ; + if (WEXITSTATUS(wstat)) + { + char fmt[UINT_FMT] ; + fmt[uint_fmt(fmt, WEXITSTATUS(wstat))] = 0 ; + strerr_warnf3x(argv[0], " exited with code ", fmt) ; + return WEXITSTATUS(wstat) ; + } + + for (size_t pos = sabase ; pos < sa->len ; pos++) + { + if (sa->s[pos] == '/' || sa->s[pos] == '\n') + { + sa->s[pos] = 0 ; + if (strcmp(sa->s + mark, sa->s + svind)) + { + uint32_t k ; + s6rc_repo_sv *p = bsearchr(sa->s + mark, svlist, ntot, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, sa->s) ; + if (!p) + { + strerr_warnfu("find service ", sa->s + mark, " in set ", set, " of repository ", repo) ; + goto err ; + } + k = p - svlist ; + if (!newsub != !p->sub && notfound(k, genalloc_s(uint32_t, badga), genalloc_len(uint32_t, badga))) + { + if (!genalloc_append(uint32_t, badga, &k)) + { + strerr_warnfu1sys("make bad pipeline list") ; + goto err ; + } + } + } + mark = pos + 1 ; + } + } + sa->len = sabase ; + return 0 ; + + err: + sa->len = sabase ; + genalloc_setlen(uint32_t, badga, gabase) ; + return 111 ; +} diff --git a/src/repo/s6rc_repo_badsub.c b/src/repo/s6rc_repo_badsub.c index 246396c..d658e3a 100644 --- a/src/repo/s6rc_repo_badsub.c +++ b/src/repo/s6rc_repo_badsub.c @@ -14,24 +14,21 @@ #include <s6-rc/repo.h> -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 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, genalloc *fulldeps) { - int sawasnull = !!sa->s ; - int gawasnull = !!genalloc_s(uint32_t, badga) ; size_t sabase = sa->len ; size_t gabase = genalloc_len(uint32_t, badga) ; - genalloc fulldeps = GENALLOC_ZERO ; size_t fulln ; size_t const *ind ; uint32_t mid ; - 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 && (what & 2) && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 1)) goto err ; + 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 && (what & 2) && s6rc_repo_listalldeps(repo, services, n, sa, fulldeps, 1)) goto err ; qsort(services, n, sizeof(char const *), &str_cmp) ; - fulln = genalloc_len(size_t, &fulldeps) ; - ind = genalloc_s(size_t, &fulldeps) ; + fulln = genalloc_len(size_t, fulldeps) ; + ind = genalloc_s(size_t, fulldeps) ; for (uint32_t i = 0 ; i < fulln ; i++) { @@ -54,12 +51,21 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services, } } } - genalloc_free(size_t, &fulldeps) ; + + if ((!newsub && (what & 1)) || (newsub && (what & 2))) + { + for (uint32_t i = 0 ; i < fulln ; i++) + { + int e = s6rc_repo_badpipeline(repo, set, ind[i], svlist, ntot, newsub, sa, badga) ; + if (e) goto err ; + } + } + genalloc_setlen(size_t, fulldeps, 0) ; 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) ; + genalloc_setlen(size_t, fulldeps, 0) ; + sa->len = sabase ; + genalloc_setlen(uint32_t, badga, gabase) ; return 0 ; } diff --git a/src/repo/s6rc_repo_fixset.c b/src/repo/s6rc_repo_fixset.c index 45cc36e..d0252a0 100644 --- a/src/repo/s6rc_repo_fixset.c +++ b/src/repo/s6rc_repo_fixset.c @@ -11,65 +11,66 @@ #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) +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, genalloc *gatmp) { size_t sabase = sa->len ; - uint32_t gabase = genalloc_len(uint32_t, badga) ; uint32_t const *bads ; uint32_t badn ; int e = 0 ; - if (!s6rc_repo_badsub(repo, set, bysub + subind[sub], subn[sub], sub, options & 1 ? 2 : 1, byname, ntot, sa, badga)) return 111 ; + if (!s6rc_repo_badsub(repo, set, bysub + subind[sub], subn[sub], sub, options & 1 ? 2 : 1, byname, ntot, sa, badga, gatmp)) return 111 ; bads = genalloc_s(uint32_t, badga) ; badn = genalloc_len(uint32_t, badga) ; if (!badn) return 0 ; + if (options & 8) 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(options & 4 ? "(dry run) " : "", "in set ", set, " of repository ", repo, ": ", options & 1 ? "up" : "down", "fix 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(options & 4 ? "(dry run) " : "", "service ", sa->s + tomove[j].pos, " will automatically be unmasked by an upfix to ", s6rc_repo_subnames[sub]) ; + strerr_warni(options & 4 ? "(dry run) " : "", "in set ", set, " of repository ", repo, ": ", "moving service ", sa->s + tomove[j].pos, " from ", s6rc_repo_subnames[tomove[j].sub], " to ", s6rc_repo_subnames[sub]) ; + else if (tomove[j].sub == 0 && verbosity) + strerr_warnw(options & 4 ? "(dry run) " : "", "service ", sa->s + tomove[j].pos, " will be unmasked by an upfix to ", s6rc_repo_subnames[sub]) ; + else if (sub == 0 && verbosity) + strerr_warnw(options & 4 ? "(dry run) " : "", "service ", sa->s + tomove[j].pos, " will be masked by a downfix to ", s6rc_repo_subnames[sub]) ; if (tomove[j].sub == 3) { if (!(options & 2)) { if (options & 4) - strerr_warnw(options & 4 ? "(dry run) " : "", "in set ", set, " of repository ", repo, ": service ", sa->s + tomove[j].pos, " is marked as essential and cannot be downfixed (--no-force-essential") ; + strerr_warnw(options & 4 ? "(dry run) " : "", "in set ", set, " of repository ", repo, ": service ", sa->s + tomove[j].pos, " is marked as essential and cannot be downfixed (--no-force-essential)") ; else { - strerr_warnf(options & 4 ? "(dry run) " : "", "in set ", set, " of repository ", repo, ": service ", sa->s + tomove[j].pos, " is marked as essential and cannot be downfixed (--no-force-essential") ; + strerr_warnf(options & 4 ? "(dry run) " : "", "in set ", set, " of repository ", repo, ": service ", sa->s + tomove[j].pos, " is marked as essential and cannot be downfixed (--no-force-essential)") ; e = 1 ; goto err ; } } else if (verbosity) - strerr_warnw(options & 4 ? "(dry run) " : "", "service ", sa->s + tomove[j].pos, " will automatically be marked non-essential by a downfix to ", s6rc_repo_subnames[sub]) ; + strerr_warnw(options & 4 ? "(dry run) " : "", "service ", sa->s + tomove[j].pos, " will automatically be marked non-essential by a downfix to ", s6rc_repo_subnames[sub]) ; } } if (!(options & 4)) { if (!s6rc_repo_moveservices(repo, set, tomove, badn, sub, sa->s, verbosity)) { e = 111 ; goto err ; } - for (uint32_t j = 0 ; j < badn ; j++) byname[bads[j]].sub = sub ; } + for (uint32_t j = 0 ; j < badn ; j++) byname[bads[j]].sub = sub ; err: - genalloc_setlen(uint32_t, badga, gabase) ; + genalloc_setlen(uint32_t, badga, 0) ; sa->len = sabase ; return e ; } -int s6rc_repo_fixset (char const *repo, char const *set, uint32_t options, unsigned int verbosity, stralloc *sa, genalloc *svlist, genalloc *badga) +int s6rc_repo_fixset (char const *repo, char const *set, uint32_t options, unsigned int verbosity, stralloc *sa, genalloc *svlist, genalloc *badga, genalloc *gatmp) { int e = 0 ; 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 ; + genalloc_setlen(s6rc_repo_sv, svlist, 0) ; 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) ; @@ -84,12 +85,10 @@ int s6rc_repo_fixset (char const *repo, char const *set, uint32_t options, unsig for (uint8_t sub = 0 ; sub < 4 ; sub++) if (sublen[sub]) { - e = s6rc_repo_fixsub(repo, set, sub, byname, bysub, ntot, options, subind, sublen, verbosity, sa, badga) ; + e = s6rc_repo_fixsub(repo, set, sub, byname, bysub, ntot, options, subind, sublen, verbosity, sa, badga, gatmp) ; if (e) break ; } - genalloc_setlen(uint32_t, badga, gabase) ; - genalloc_setlen(s6rc_repo_sv, svlist, svbase) ; - sa->len = sabase ; + genalloc_setlen(s6rc_repo_sv, svlist, 0) ; return e ; } diff --git a/src/repo/s6rc_repo_flattenservices.c b/src/repo/s6rc_repo_flattenservices.c index 36a0aad..277c297 100644 --- a/src/repo/s6rc_repo_flattenservices.c +++ b/src/repo/s6rc_repo_flattenservices.c @@ -19,8 +19,6 @@ int s6rc_repo_flattenservices (char const *repo, char const *const *services, uint32_t n, stralloc *storage, genalloc *indices) { - int swasnull = !storage->s ; - int gwasnull = !indices->s ; size_t sabase = storage->len ; uint32_t gabase = genalloc_len(size_t, indices) ; @@ -68,9 +66,7 @@ int s6rc_repo_flattenservices (char const *repo, char const *const *services, ui err2: strerr_warnfu1sys("index services") ; err: - if (gwasnull) genalloc_free(size_t, indices) ; - else genalloc_setlen(size_t, indices, gabase) ; - if (swasnull) stralloc_free(storage) ; - else storage->len = sabase ; + genalloc_setlen(size_t, indices, gabase) ; + storage->len = sabase ; return 111 ; } diff --git a/src/repo/s6rc_repo_listcontents.c b/src/repo/s6rc_repo_listcontents.c index bb9a99b..1af3d77 100644 --- a/src/repo/s6rc_repo_listcontents.c +++ b/src/repo/s6rc_repo_listcontents.c @@ -19,8 +19,6 @@ int s6rc_repo_listcontents (char const *repo, char const *bundle, stralloc *storage, genalloc *indices) { - int swasnull = !storage->s ; - int gwasnull = !indices->s ; size_t sabase = storage->len ; size_t gabase = genalloc_len(size_t, indices) ; size_t repolen = strlen(repo) ; @@ -33,37 +31,35 @@ int s6rc_repo_listcontents (char const *repo, char const *bundle, stralloc *stor memcpy(refdb, repo, repolen) ; memcpy(refdb + repolen, "/compiled/.ref", 15) ; pid = child_spawn1_pipe(argv[0], argv, (char const *const *)environ, &fd, 1) ; - if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return -1 ; } - if (!slurpn(fd, storage, 0)) { strerr_warnfu2sys("read output from ", argv[0]) ; return -1 ; } + if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return 111 ; } + if (!slurpn(fd, storage, 0)) { strerr_warnfu2sys("read output from ", argv[0]) ; return 111 ; } fd_close(fd) ; - if (wait_pid(pid, &wstat) == -1) - { - strerr_warnfu2sys("wait for ", argv[0]) ; - return -1 ; - } + if (wait_pid(pid, &wstat) == -1) { strerr_warnfu2sys("wait for ", argv[0]) ; return 111 ; } if (WIFSIGNALED(wstat)) { char fmt[UINT_FMT] ; fmt[uint_fmt(fmt, WTERMSIG(wstat))] = 0 ; strerr_warnf3x(argv[0], " crashed with signal ", fmt) ; - return -1 ; + return wait_estatus(wstat) ; } if (WEXITSTATUS(wstat)) { char fmt[UINT_FMT] ; fmt[uint_fmt(fmt, WEXITSTATUS(wstat))] = 0 ; strerr_warnf3x(argv[0], " exited with code ", fmt) ; - return (WEXITSTATUS(wstat) < 99) - 1 ; + return WEXITSTATUS(wstat) ; } - if (!string_index(storage->s, sabase, storage->len - sabase, '\n', indices)) goto err ; + if (!string_index(storage->s, sabase, storage->len - sabase, '\n', indices)) + { + strerr_warnfu1sys("index result from s6-rc-db") ; + goto err ; + } s6rc_repo_removeinternals(indices, gabase, storage->s) ; - return 1 ; + return 0 ; err: - if (gwasnull) genalloc_free(size_t, indices) ; - else genalloc_setlen(size_t, indices, gabase) ; - if (swasnull) stralloc_free(storage) ; - else storage->len = sabase ; - return -1 ; + genalloc_setlen(size_t, indices, gabase) ; + storage->len = sabase ; + return 111 ; } diff --git a/src/repo/s6rc_repo_listdeps_internal.c b/src/repo/s6rc_repo_listdeps_internal.c index 78c7ca1..78f7ad5 100644 --- a/src/repo/s6rc_repo_listdeps_internal.c +++ b/src/repo/s6rc_repo_listdeps_internal.c @@ -19,8 +19,6 @@ int s6rc_repo_listdeps_internal (char const *repo, char const *const *services, uint32_t n, stralloc *storage, genalloc *indices, uint32_t options) { - int swasnull = !storage->s ; - int gwasnull = !indices->s ; size_t sabase = storage->len ; size_t gabase = genalloc_len(size_t, indices) ; @@ -67,9 +65,7 @@ int s6rc_repo_listdeps_internal (char const *repo, char const *const *services, return 0 ; err: - if (gwasnull) genalloc_free(size_t, indices) ; - else genalloc_setlen(size_t, indices, gabase) ; - if (swasnull) stralloc_free(storage) ; - else storage->len = sabase ; + genalloc_setlen(size_t, indices, gabase) ; + storage->len = sabase ; return 111 ; } diff --git a/src/repo/s6rc_repo_ls.c b/src/repo/s6rc_repo_ls.c index 1294f48..6f61bd1 100644 --- a/src/repo/s6rc_repo_ls.c +++ b/src/repo/s6rc_repo_ls.c @@ -13,8 +13,6 @@ int s6rc_repo_ls (char const *fn, stralloc *sa, genalloc *ga) { size_t sabase = sa->len ; size_t gabase = genalloc_len(size_t, ga) ; - int sawasnull = !sa->s ; - int gawasnull = !genalloc_s(size_t, ga) ; int n = 0 ; DIR *dir = opendir(fn) ; @@ -38,9 +36,7 @@ int s6rc_repo_ls (char const *fn, stralloc *sa, genalloc *ga) err: dir_close(dir) ; - if (gawasnull) genalloc_free(size_t, ga) ; - else genalloc_setlen(size_t, ga, gabase) ; - if (sawasnull) stralloc_free(sa) ; - else sa->len = sabase ; + genalloc_setlen(size_t, ga, gabase) ; + sa->len = sabase ; return -1 ; } diff --git a/src/repo/s6rc_repo_makedefbundle.c b/src/repo/s6rc_repo_makedefbundle.c index d0d5d32..e56fa74 100644 --- a/src/repo/s6rc_repo_makedefbundle.c +++ b/src/repo/s6rc_repo_makedefbundle.c @@ -69,7 +69,7 @@ int s6rc_repo_makedefbundle (char const *repo, char const *set, char const *bund strerr_warnfu2sys("write to ", bfn) ; return 0 ; } - bfn[bfnlen] = '/' ; + memcpy(bfn + repolen + setlen + 18 + bundlelen, "contents.d/", 11) ; memcpy(subfn, bfn, repolen + 10 + setlen) ; for (uint8_t sub = 2 ; sub < 4 ; sub++) diff --git a/src/repo/s6rc_repo_makesetbundles.c b/src/repo/s6rc_repo_makesetbundles.c index 5bb72a6..64e269c 100644 --- a/src/repo/s6rc_repo_makesetbundles.c +++ b/src/repo/s6rc_repo_makesetbundles.c @@ -64,7 +64,7 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve } for (;;) { - int m, i = 0 ; + int e, i = 0 ; direntry *d ; errno = 0 ; d = readdir(dir) ; @@ -73,14 +73,14 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve sa.len = 0 ; genalloc_setlen(size_t, &ga, 0) ; - m = s6rc_repo_listcontents(repo, d->d_name, &sa, &ga) ; - if (m < 0) + e = s6rc_repo_listcontents(repo, d->d_name, &sa, &ga) ; + if (e) { dir_close(dir) ; goto err0 ; } - for (; i < m ; i++) + for (; i < genalloc_len(size_t, &ga) ; i++) { char const *x = sa.s + genalloc_s(size_t, &ga)[i] ; if (bsearch(x, masked, n, sizeof(char const *), &str_bcmp)) @@ -90,7 +90,7 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve break ; } } - if (i < m) continue ; + if (i < genalloc_len(size_t, &ga)) continue ; size_t len = strlen(d->d_name) ; char target[16 + len] ; diff --git a/src/repo/s6rc_repo_makesvlist.c b/src/repo/s6rc_repo_makesvlist.c index 99a174e..f7f51c9 100644 --- a/src/repo/s6rc_repo_makesvlist.c +++ b/src/repo/s6rc_repo_makesvlist.c @@ -43,8 +43,6 @@ int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genal 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) ; @@ -60,7 +58,7 @@ int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genal 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) ; + sa->len = sabase ; + genalloc_setlen(s6rc_repo_sv, ga, gabase) ; return 0 ; } |
