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 | |
| parent | 6dd777fafbd23296d6bd91f8076f4b0ea5bae24e (diff) | |
| download | s6-rc-b24a07fca1f2a410b3d97d1e3dc5de7720ad1d76.tar.gz | |
Working repo fix that understands pipelines
| -rw-r--r-- | doc/s6-rc-db.html | 4 | ||||
| -rw-r--r-- | doc/s6-rc-set-change.html | 6 | ||||
| -rw-r--r-- | package/deps.mak | 9 | ||||
| -rw-r--r-- | src/include/s6-rc/repo.h | 5 | ||||
| -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 | ||||
| -rw-r--r-- | src/s6-rc/s6-rc-db.c | 5 |
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 ; |
