aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-12-20 23:50:19 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-12-20 23:50:19 +0000
commitb24a07fca1f2a410b3d97d1e3dc5de7720ad1d76 (patch)
treeb7294449f6640f2b9f75b5783d734464bd1dc8cd
parent6dd777fafbd23296d6bd91f8076f4b0ea5bae24e (diff)
downloads6-rc-b24a07fca1f2a410b3d97d1e3dc5de7720ad1d76.tar.gz
Working repo fix that understands pipelines
-rw-r--r--doc/s6-rc-db.html4
-rw-r--r--doc/s6-rc-set-change.html6
-rw-r--r--package/deps.mak9
-rw-r--r--src/include/s6-rc/repo.h5
-rw-r--r--src/repo/deps-lib/s6rcrepo1
-rw-r--r--src/repo/s6-rc-set-change.c9
-rw-r--r--src/repo/s6-rc-set-commit.c14
-rw-r--r--src/repo/s6-rc-set-fix.c9
-rw-r--r--src/repo/s6rc_repo_badpipeline.c96
-rw-r--r--src/repo/s6rc_repo_badsub.c32
-rw-r--r--src/repo/s6rc_repo_fixset.c35
-rw-r--r--src/repo/s6rc_repo_flattenservices.c8
-rw-r--r--src/repo/s6rc_repo_listcontents.c32
-rw-r--r--src/repo/s6rc_repo_listdeps_internal.c8
-rw-r--r--src/repo/s6rc_repo_ls.c8
-rw-r--r--src/repo/s6rc_repo_makedefbundle.c2
-rw-r--r--src/repo/s6rc_repo_makesetbundles.c10
-rw-r--r--src/repo/s6rc_repo_makesvlist.c6
-rw-r--r--src/s6-rc/s6-rc-db.c5
19 files changed, 202 insertions, 97 deletions
diff --git a/doc/s6-rc-db.html b/doc/s6-rc-db.html
index 4794be6..564ee59 100644
--- a/doc/s6-rc-db.html
+++ b/doc/s6-rc-db.html
@@ -193,8 +193,8 @@ is a bundle.
<p>
Prints the longrun service pipeline <em>longrunname</em> is a
-part of, one service per line, producers before consumers.
-If <em>longrunname</em> isn't
+part of, one producer/consumer pair by line. Producers and consumers
+are separated by a slash. If <em>longrunname</em> isn't
part of a pipeline, only <em>longrunname</em> is printed.
</p>
diff --git a/doc/s6-rc-set-change.html b/doc/s6-rc-set-change.html
index 6e45c2e..3a718c4 100644
--- a/doc/s6-rc-set-change.html
+++ b/doc/s6-rc-set-change.html
@@ -106,7 +106,11 @@ from being changed to <em>newsub</em>. </dd>
<li> s6-rc-set-change is the bread and butter of <em>repo</em> operations. It is how users
can tailor the set of services they want to be enabled at boot time. </li>
<li> Once a change has been effected, and the command says that the set is consistent,
-it needs to be <a href="s6-rc-set-commit">committed</a>. </li>
+it can be <a href="s6-rc-set-commit">committed</a>. </li>
+ <li> If you are masking or unmasking services, and you see it pulling services that
+are not dependencies of the service you're unmasking or are not depending on the service
+you're masking, it is because these services are part of the same pipeline. If you mask
+a part of a pipeline, the whole pipeline needs to be masked. </li>
</ul>
</body>
diff --git a/package/deps.mak b/package/deps.mak
index 837e179..dbfc92a 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -38,6 +38,7 @@ src/repo/s6-rc-set-fix.o src/repo/s6-rc-set-fix.lo: src/repo/s6-rc-set-fix.c src
src/repo/s6-rc-set-install.o src/repo/s6-rc-set-install.lo: src/repo/s6-rc-set-install.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
src/repo/s6-rc-set-new.o src/repo/s6-rc-set-new.lo: src/repo/s6-rc-set-new.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
src/repo/s6-rc-set-status.o src/repo/s6-rc-set-status.lo: src/repo/s6-rc-set-status.c src/include/s6-rc/config.h src/include/s6-rc/repo.h
+src/repo/s6rc_repo_badpipeline.o src/repo/s6rc_repo_badpipeline.lo: src/repo/s6rc_repo_badpipeline.c src/include/s6-rc/config.h src/include/s6-rc/repo.h
src/repo/s6rc_repo_badsub.o src/repo/s6rc_repo_badsub.lo: src/repo/s6rc_repo_badsub.c src/include/s6-rc/repo.h
src/repo/s6rc_repo_checkset.o src/repo/s6rc_repo_checkset.lo: src/repo/s6rc_repo_checkset.c src/include/s6-rc/repo.h
src/repo/s6rc_repo_cleanup.o src/repo/s6rc_repo_cleanup.lo: src/repo/s6rc_repo_cleanup.c src/include/s6-rc/repo.h
@@ -96,15 +97,15 @@ libs6rc.so.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_chec
libs6rc.dylib.xyzzy: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB}
libs6rc.dylib.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo
ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),)
-libs6rcrepo.a.xyzzy: src/repo/s6rc_repo_badsub.o src/repo/s6rc_repo_checkset.o src/repo/s6rc_repo_cleanup.o src/repo/s6rc_repo_compile.o src/repo/s6rc_repo_fillset.o src/repo/s6rc_repo_fixset.o src/repo/s6rc_repo_flattenservices.o src/repo/s6rc_repo_getserviceflags.o src/repo/s6rc_repo_list_sets.o src/repo/s6rc_repo_listalldeps.o src/repo/s6rc_repo_listcontents.o src/repo/s6rc_repo_listdeps.o src/repo/s6rc_repo_listdeps_internal.o src/repo/s6rc_repo_listsub.o src/repo/s6rc_repo_lock.o src/repo/s6rc_repo_ls.o src/repo/s6rc_repo_makedefbundle.o src/repo/s6rc_repo_makesetbundles.o src/repo/s6rc_repo_makestores.o src/repo/s6rc_repo_makesvlist.o src/repo/s6rc_repo_makesvlist_byname.o src/repo/s6rc_repo_moveservices.o src/repo/s6rc_repo_removeinternals.o src/repo/s6rc_repo_sanitize_setname.o src/repo/s6rc_repo_sanitize_svname.o src/repo/s6rc_repo_setcompile.o src/repo/s6rc_repo_setuptodate.o src/repo/s6rc_repo_subnames.o src/repo/s6rc_repo_sv_bcmpr.o src/repo/s6rc_repo_sv_cmpr.o src/repo/s6rc_repo_sync.o src/repo/s6rc_repo_syncset.o src/repo/s6rc_repo_syncset_tmp.o src/repo/s6rc_repo_touch.o src/repo/s6rc_repo_touchset.o src/repo/s6rc_repo_type_check.o
+libs6rcrepo.a.xyzzy: src/repo/s6rc_repo_badpipeline.o src/repo/s6rc_repo_badsub.o src/repo/s6rc_repo_checkset.o src/repo/s6rc_repo_cleanup.o src/repo/s6rc_repo_compile.o src/repo/s6rc_repo_fillset.o src/repo/s6rc_repo_fixset.o src/repo/s6rc_repo_flattenservices.o src/repo/s6rc_repo_getserviceflags.o src/repo/s6rc_repo_list_sets.o src/repo/s6rc_repo_listalldeps.o src/repo/s6rc_repo_listcontents.o src/repo/s6rc_repo_listdeps.o src/repo/s6rc_repo_listdeps_internal.o src/repo/s6rc_repo_listsub.o src/repo/s6rc_repo_lock.o src/repo/s6rc_repo_ls.o src/repo/s6rc_repo_makedefbundle.o src/repo/s6rc_repo_makesetbundles.o src/repo/s6rc_repo_makestores.o src/repo/s6rc_repo_makesvlist.o src/repo/s6rc_repo_makesvlist_byname.o src/repo/s6rc_repo_moveservices.o src/repo/s6rc_repo_removeinternals.o src/repo/s6rc_repo_sanitize_setname.o src/repo/s6rc_repo_sanitize_svname.o src/repo/s6rc_repo_setcompile.o src/repo/s6rc_repo_setuptodate.o src/repo/s6rc_repo_subnames.o src/repo/s6rc_repo_sv_bcmpr.o src/repo/s6rc_repo_sv_cmpr.o src/repo/s6rc_repo_sync.o src/repo/s6rc_repo_syncset.o src/repo/s6rc_repo_syncset_tmp.o src/repo/s6rc_repo_touch.o src/repo/s6rc_repo_touchset.o src/repo/s6rc_repo_type_check.o
else
-libs6rcrepo.a.xyzzy:src/repo/s6rc_repo_badsub.lo src/repo/s6rc_repo_checkset.lo src/repo/s6rc_repo_cleanup.lo src/repo/s6rc_repo_compile.lo src/repo/s6rc_repo_fillset.lo src/repo/s6rc_repo_fixset.lo src/repo/s6rc_repo_flattenservices.lo src/repo/s6rc_repo_getserviceflags.lo src/repo/s6rc_repo_list_sets.lo src/repo/s6rc_repo_listalldeps.lo src/repo/s6rc_repo_listcontents.lo src/repo/s6rc_repo_listdeps.lo src/repo/s6rc_repo_listdeps_internal.lo src/repo/s6rc_repo_listsub.lo src/repo/s6rc_repo_lock.lo src/repo/s6rc_repo_ls.lo src/repo/s6rc_repo_makedefbundle.lo src/repo/s6rc_repo_makesetbundles.lo src/repo/s6rc_repo_makestores.lo src/repo/s6rc_repo_makesvlist.lo src/repo/s6rc_repo_makesvlist_byname.lo src/repo/s6rc_repo_moveservices.lo src/repo/s6rc_repo_removeinternals.lo src/repo/s6rc_repo_sanitize_setname.lo src/repo/s6rc_repo_sanitize_svname.lo src/repo/s6rc_repo_setcompile.lo src/repo/s6rc_repo_setuptodate.lo src/repo/s6rc_repo_subnames.lo src/repo/s6rc_repo_sv_bcmpr.lo src/repo/s6rc_repo_sv_cmpr.lo src/repo/s6rc_repo_sync.lo src/repo/s6rc_repo_syncset.lo src/repo/s6rc_repo_syncset_tmp.lo src/repo/s6rc_repo_touch.lo src/repo/s6rc_repo_touchset.lo src/repo/s6rc_repo_type_check.lo
+libs6rcrepo.a.xyzzy:src/repo/s6rc_repo_badpipeline.lo src/repo/s6rc_repo_badsub.lo src/repo/s6rc_repo_checkset.lo src/repo/s6rc_repo_cleanup.lo src/repo/s6rc_repo_compile.lo src/repo/s6rc_repo_fillset.lo src/repo/s6rc_repo_fixset.lo src/repo/s6rc_repo_flattenservices.lo src/repo/s6rc_repo_getserviceflags.lo src/repo/s6rc_repo_list_sets.lo src/repo/s6rc_repo_listalldeps.lo src/repo/s6rc_repo_listcontents.lo src/repo/s6rc_repo_listdeps.lo src/repo/s6rc_repo_listdeps_internal.lo src/repo/s6rc_repo_listsub.lo src/repo/s6rc_repo_lock.lo src/repo/s6rc_repo_ls.lo src/repo/s6rc_repo_makedefbundle.lo src/repo/s6rc_repo_makesetbundles.lo src/repo/s6rc_repo_makestores.lo src/repo/s6rc_repo_makesvlist.lo src/repo/s6rc_repo_makesvlist_byname.lo src/repo/s6rc_repo_moveservices.lo src/repo/s6rc_repo_removeinternals.lo src/repo/s6rc_repo_sanitize_setname.lo src/repo/s6rc_repo_sanitize_svname.lo src/repo/s6rc_repo_setcompile.lo src/repo/s6rc_repo_setuptodate.lo src/repo/s6rc_repo_subnames.lo src/repo/s6rc_repo_sv_bcmpr.lo src/repo/s6rc_repo_sv_cmpr.lo src/repo/s6rc_repo_sync.lo src/repo/s6rc_repo_syncset.lo src/repo/s6rc_repo_syncset_tmp.lo src/repo/s6rc_repo_touch.lo src/repo/s6rc_repo_touchset.lo src/repo/s6rc_repo_type_check.lo
endif
libs6rcrepo.pc: EXTRA_LIBS := -lskarnet ${SPAWN_LIB}
libs6rcrepo.so.xyzzy: EXTRA_LIBS := -lskarnet ${SPAWN_LIB}
-libs6rcrepo.so.xyzzy:src/repo/s6rc_repo_badsub.lo src/repo/s6rc_repo_checkset.lo src/repo/s6rc_repo_cleanup.lo src/repo/s6rc_repo_compile.lo src/repo/s6rc_repo_fillset.lo src/repo/s6rc_repo_fixset.lo src/repo/s6rc_repo_flattenservices.lo src/repo/s6rc_repo_getserviceflags.lo src/repo/s6rc_repo_list_sets.lo src/repo/s6rc_repo_listalldeps.lo src/repo/s6rc_repo_listcontents.lo src/repo/s6rc_repo_listdeps.lo src/repo/s6rc_repo_listdeps_internal.lo src/repo/s6rc_repo_listsub.lo src/repo/s6rc_repo_lock.lo src/repo/s6rc_repo_ls.lo src/repo/s6rc_repo_makedefbundle.lo src/repo/s6rc_repo_makesetbundles.lo src/repo/s6rc_repo_makestores.lo src/repo/s6rc_repo_makesvlist.lo src/repo/s6rc_repo_makesvlist_byname.lo src/repo/s6rc_repo_moveservices.lo src/repo/s6rc_repo_removeinternals.lo src/repo/s6rc_repo_sanitize_setname.lo src/repo/s6rc_repo_sanitize_svname.lo src/repo/s6rc_repo_setcompile.lo src/repo/s6rc_repo_setuptodate.lo src/repo/s6rc_repo_subnames.lo src/repo/s6rc_repo_sv_bcmpr.lo src/repo/s6rc_repo_sv_cmpr.lo src/repo/s6rc_repo_sync.lo src/repo/s6rc_repo_syncset.lo src/repo/s6rc_repo_syncset_tmp.lo src/repo/s6rc_repo_touch.lo src/repo/s6rc_repo_touchset.lo src/repo/s6rc_repo_type_check.lo
+libs6rcrepo.so.xyzzy:src/repo/s6rc_repo_badpipeline.lo src/repo/s6rc_repo_badsub.lo src/repo/s6rc_repo_checkset.lo src/repo/s6rc_repo_cleanup.lo src/repo/s6rc_repo_compile.lo src/repo/s6rc_repo_fillset.lo src/repo/s6rc_repo_fixset.lo src/repo/s6rc_repo_flattenservices.lo src/repo/s6rc_repo_getserviceflags.lo src/repo/s6rc_repo_list_sets.lo src/repo/s6rc_repo_listalldeps.lo src/repo/s6rc_repo_listcontents.lo src/repo/s6rc_repo_listdeps.lo src/repo/s6rc_repo_listdeps_internal.lo src/repo/s6rc_repo_listsub.lo src/repo/s6rc_repo_lock.lo src/repo/s6rc_repo_ls.lo src/repo/s6rc_repo_makedefbundle.lo src/repo/s6rc_repo_makesetbundles.lo src/repo/s6rc_repo_makestores.lo src/repo/s6rc_repo_makesvlist.lo src/repo/s6rc_repo_makesvlist_byname.lo src/repo/s6rc_repo_moveservices.lo src/repo/s6rc_repo_removeinternals.lo src/repo/s6rc_repo_sanitize_setname.lo src/repo/s6rc_repo_sanitize_svname.lo src/repo/s6rc_repo_setcompile.lo src/repo/s6rc_repo_setuptodate.lo src/repo/s6rc_repo_subnames.lo src/repo/s6rc_repo_sv_bcmpr.lo src/repo/s6rc_repo_sv_cmpr.lo src/repo/s6rc_repo_sync.lo src/repo/s6rc_repo_syncset.lo src/repo/s6rc_repo_syncset_tmp.lo src/repo/s6rc_repo_touch.lo src/repo/s6rc_repo_touchset.lo src/repo/s6rc_repo_type_check.lo
libs6rcrepo.dylib.xyzzy: EXTRA_LIBS := -lskarnet ${SPAWN_LIB}
-libs6rcrepo.dylib.xyzzy:src/repo/s6rc_repo_badsub.lo src/repo/s6rc_repo_checkset.lo src/repo/s6rc_repo_cleanup.lo src/repo/s6rc_repo_compile.lo src/repo/s6rc_repo_fillset.lo src/repo/s6rc_repo_fixset.lo src/repo/s6rc_repo_flattenservices.lo src/repo/s6rc_repo_getserviceflags.lo src/repo/s6rc_repo_list_sets.lo src/repo/s6rc_repo_listalldeps.lo src/repo/s6rc_repo_listcontents.lo src/repo/s6rc_repo_listdeps.lo src/repo/s6rc_repo_listdeps_internal.lo src/repo/s6rc_repo_listsub.lo src/repo/s6rc_repo_lock.lo src/repo/s6rc_repo_ls.lo src/repo/s6rc_repo_makedefbundle.lo src/repo/s6rc_repo_makesetbundles.lo src/repo/s6rc_repo_makestores.lo src/repo/s6rc_repo_makesvlist.lo src/repo/s6rc_repo_makesvlist_byname.lo src/repo/s6rc_repo_moveservices.lo src/repo/s6rc_repo_removeinternals.lo src/repo/s6rc_repo_sanitize_setname.lo src/repo/s6rc_repo_sanitize_svname.lo src/repo/s6rc_repo_setcompile.lo src/repo/s6rc_repo_setuptodate.lo src/repo/s6rc_repo_subnames.lo src/repo/s6rc_repo_sv_bcmpr.lo src/repo/s6rc_repo_sv_cmpr.lo src/repo/s6rc_repo_sync.lo src/repo/s6rc_repo_syncset.lo src/repo/s6rc_repo_syncset_tmp.lo src/repo/s6rc_repo_touch.lo src/repo/s6rc_repo_touchset.lo src/repo/s6rc_repo_type_check.lo
+libs6rcrepo.dylib.xyzzy:src/repo/s6rc_repo_badpipeline.lo src/repo/s6rc_repo_badsub.lo src/repo/s6rc_repo_checkset.lo src/repo/s6rc_repo_cleanup.lo src/repo/s6rc_repo_compile.lo src/repo/s6rc_repo_fillset.lo src/repo/s6rc_repo_fixset.lo src/repo/s6rc_repo_flattenservices.lo src/repo/s6rc_repo_getserviceflags.lo src/repo/s6rc_repo_list_sets.lo src/repo/s6rc_repo_listalldeps.lo src/repo/s6rc_repo_listcontents.lo src/repo/s6rc_repo_listdeps.lo src/repo/s6rc_repo_listdeps_internal.lo src/repo/s6rc_repo_listsub.lo src/repo/s6rc_repo_lock.lo src/repo/s6rc_repo_ls.lo src/repo/s6rc_repo_makedefbundle.lo src/repo/s6rc_repo_makesetbundles.lo src/repo/s6rc_repo_makestores.lo src/repo/s6rc_repo_makesvlist.lo src/repo/s6rc_repo_makesvlist_byname.lo src/repo/s6rc_repo_moveservices.lo src/repo/s6rc_repo_removeinternals.lo src/repo/s6rc_repo_sanitize_setname.lo src/repo/s6rc_repo_sanitize_svname.lo src/repo/s6rc_repo_setcompile.lo src/repo/s6rc_repo_setuptodate.lo src/repo/s6rc_repo_subnames.lo src/repo/s6rc_repo_sv_bcmpr.lo src/repo/s6rc_repo_sv_cmpr.lo src/repo/s6rc_repo_sync.lo src/repo/s6rc_repo_syncset.lo src/repo/s6rc_repo_syncset_tmp.lo src/repo/s6rc_repo_touch.lo src/repo/s6rc_repo_touchset.lo src/repo/s6rc_repo_type_check.lo
s6-rc-repo-init: EXTRA_LIBS := ${SPAWN_LIB}
s6-rc-repo-init: src/repo/s6-rc-repo-init.o ${LIBS6RCREPO} -lskarnet
s6-rc-repo-list: EXTRA_LIBS := ${SPAWN_LIB}
diff --git a/src/include/s6-rc/repo.h b/src/include/s6-rc/repo.h
index 2dacf42..5957dd5 100644
--- a/src/include/s6-rc/repo.h
+++ b/src/include/s6-rc/repo.h
@@ -61,11 +61,12 @@ extern int s6rc_repo_getserviceflags (char const *, char const *, uint32_t *) ;
extern int s6rc_repo_flattenservices (char const *, char const *const *, uint32_t n, stralloc *storage, genalloc *indices) ;
extern int s6rc_repo_makesvlist (char const *, char const *, stralloc *, genalloc *, uint32_t *) ;
extern int s6rc_repo_makesvlist_byname (char const *, char const *, stralloc *, genalloc *) ;
-extern int s6rc_repo_badsub (char const *, char const *, char const **, uint32_t, uint8_t, uint8_t, s6rc_repo_sv const *, uint32_t, stralloc *, genalloc *) ;
+extern int s6rc_repo_badsub (char const *, char const *, char const **, uint32_t, uint8_t, uint8_t, s6rc_repo_sv const *, uint32_t, stralloc *, genalloc *, genalloc *) ;
+extern int s6rc_repo_badpipeline (char const *, char const *, size_t, s6rc_repo_sv const *, uint32_t, uint8_t, stralloc *, genalloc *) ;
extern int s6rc_repo_moveservices (char const *, char const *, s6rc_repo_sv const *, uint32_t, uint8_t, char const *, unsigned int) ;
extern void s6rc_repo_removeinternals (genalloc *, unsigned int, char const *) ;
-extern int s6rc_repo_fixset (char const *, char const *, uint32_t, unsigned int, stralloc *, genalloc *, genalloc *) ;
+extern int s6rc_repo_fixset (char const *, char const *, uint32_t, unsigned int, stralloc *, genalloc *, genalloc *, genalloc *) ;
extern int s6rc_repo_fix (char const *, uint32_t, unsigned int) ;
#endif
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 ;
}
diff --git a/src/s6-rc/s6-rc-db.c b/src/s6-rc/s6-rc-db.c
index 4b4c081..5521fc6 100644
--- a/src/s6-rc/s6-rc-db.c
+++ b/src/s6-rc/s6-rc-db.c
@@ -177,7 +177,7 @@ static void print_producers_rec (uint32_t n)
uint32_t m = db->producers[db->services[n].x.longrun.producers + i] ;
print_producers_rec(m) ;
if (buffer_puts(buffer_1, db->string + db->services[m].name) < 0
- || buffer_put(buffer_1, " | ", 3) < 0
+ || buffer_put(buffer_1, "/", 1) < 0
|| buffer_puts(buffer_1, db->string + db->services[n].name) < 0
|| buffer_put(buffer_1, "\n", 1) < 0)
strerr_diefu1sys(111, "write to stdout") ;
@@ -187,8 +187,7 @@ static void print_producers_rec (uint32_t n)
static inline void print_pipeline (char const *name)
{
unsigned int n = resolve_service(name) ;
- if (n >= db->nlong)
- strerr_dief5x(5, "in database ", compiled, ": identifier ", name, " does not represent a longrun") ;
+ if (n >= db->nlong) _exit(5) ;
for (;;)
{
uint32_t j = db->services[n].x.longrun.consumer ;