aboutsummaryrefslogtreecommitdiffstats
path: root/src/repo/s6rc_repo_badsub.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/repo/s6rc_repo_badsub.c')
-rw-r--r--src/repo/s6rc_repo_badsub.c32
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 ;
}