diff options
Diffstat (limited to 'src/repo/s6rc_repo_badsub.c')
| -rw-r--r-- | src/repo/s6rc_repo_badsub.c | 32 |
1 files changed, 19 insertions, 13 deletions
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 ; } |
