aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-09-18 23:18:13 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-09-18 23:18:13 +0000
commit8671af033b2f5512e9138cbadcfc068b3ae3e135 (patch)
treebd7655e57e01ba283cbf1c17638e13c4714b9984
parent3c4f07c296d743b535d74ebaff7f13919dea1ab9 (diff)
downloads6-rc-8671af033b2f5512e9138cbadcfc068b3ae3e135.tar.gz
Support bundles in changestate, various refactors
-rw-r--r--package/deps.mak9
-rw-r--r--src/include/s6-rc/repo.h9
-rw-r--r--src/include/s6-rc/s6rc-utils.h1
-rw-r--r--src/libs6rc/deps-lib/s6rc1
-rw-r--r--src/libs6rc/s6rc_repo_badsub.c10
-rw-r--r--src/libs6rc/s6rc_repo_compile.c6
-rw-r--r--src/libs6rc/s6rc_repo_fillset.c2
-rw-r--r--src/libs6rc/s6rc_repo_flattenservices.c73
-rw-r--r--src/libs6rc/s6rc_repo_listalldeps.c2
-rw-r--r--src/libs6rc/s6rc_repo_listdeps_internal.c24
-rw-r--r--src/libs6rc/s6rc_repo_setcompile.c26
-rw-r--r--src/repo/s6-rc-set-changestate.c56
12 files changed, 165 insertions, 54 deletions
diff --git a/package/deps.mak b/package/deps.mak
index eaee1b0..3ba2e42 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -24,6 +24,7 @@ src/libs6rc/s6rc_repo_badsub.o src/libs6rc/s6rc_repo_badsub.lo: src/libs6rc/s6rc
src/libs6rc/s6rc_repo_cleanup.o src/libs6rc/s6rc_repo_cleanup.lo: src/libs6rc/s6rc_repo_cleanup.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_compile.lo: src/libs6rc/s6rc_repo_compile.c src/include/s6-rc/config.h src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_fillset.o src/libs6rc/s6rc_repo_fillset.lo: src/libs6rc/s6rc_repo_fillset.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
+src/libs6rc/s6rc_repo_flattenservices.o src/libs6rc/s6rc_repo_flattenservices.lo: src/libs6rc/s6rc_repo_flattenservices.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listalldeps.lo: src/libs6rc/s6rc_repo_listalldeps.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_listcontents.o src/libs6rc/s6rc_repo_listcontents.lo: src/libs6rc/s6rc_repo_listcontents.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps.lo: src/libs6rc/s6rc_repo_listdeps.c src/include/s6-rc/repo.h
@@ -67,15 +68,15 @@ src/s6-rc/s6-rc-update.o src/s6-rc/s6-rc-update.lo: src/s6-rc/s6-rc-update.c src
src/s6-rc/s6-rc.o src/s6-rc/s6-rc.lo: src/s6-rc/s6-rc.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),)
-libs6rc.a.xyzzy: src/libs6rc/s6rc_db_check_depcycles.o src/libs6rc/s6rc_db_check_pipelines.o src/libs6rc/s6rc_db_check_revdeps.o src/libs6rc/s6rc_db_read.o src/libs6rc/s6rc_db_read_sizes.o src/libs6rc/s6rc_db_read_uint32.o src/libs6rc/s6rc_graph_closure.o src/libs6rc/s6rc_live_state_size.o src/libs6rc/s6rc_live_state_read.o src/libs6rc/s6rc_livedir_canon.o src/libs6rc/s6rc_livedir_create.o src/libs6rc/s6rc_livedir_prefix.o src/libs6rc/s6rc_livedir_prefixsize.o src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_read_uint.o src/libs6rc/s6rc_repo_badsub.o src/libs6rc/s6rc_repo_cleanup.o src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_fillset.o src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listcontents.o src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_makesetbundles.o src/libs6rc/s6rc_repo_makesvlist.o src/libs6rc/s6rc_repo_moveservices.o src/libs6rc/s6rc_repo_refcompile.o src/libs6rc/s6rc_repo_setcompile.o src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_sv_bcmpr.o src/libs6rc/s6rc_repo_sv_cmpr.o src/libs6rc/s6rc_repo_sync.o src/libs6rc/s6rc_sanitize_dir.o src/libs6rc/s6rc_servicedir_internal.o src/libs6rc/s6rc_servicedir_block.o src/libs6rc/s6rc_servicedir_unblock.o src/libs6rc/s6rc_servicedir_copy_offline.o src/libs6rc/s6rc_servicedir_copy_online.o src/libs6rc/s6rc_servicedir_manage.o src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_strrefcmp.o src/libs6rc/s6rc_type_check.o
+libs6rc.a.xyzzy: src/libs6rc/s6rc_db_check_depcycles.o src/libs6rc/s6rc_db_check_pipelines.o src/libs6rc/s6rc_db_check_revdeps.o src/libs6rc/s6rc_db_read.o src/libs6rc/s6rc_db_read_sizes.o src/libs6rc/s6rc_db_read_uint32.o src/libs6rc/s6rc_graph_closure.o src/libs6rc/s6rc_live_state_size.o src/libs6rc/s6rc_live_state_read.o src/libs6rc/s6rc_livedir_canon.o src/libs6rc/s6rc_livedir_create.o src/libs6rc/s6rc_livedir_prefix.o src/libs6rc/s6rc_livedir_prefixsize.o src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_read_uint.o src/libs6rc/s6rc_repo_badsub.o src/libs6rc/s6rc_repo_cleanup.o src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_fillset.o src/libs6rc/s6rc_repo_flattenservices.o src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listcontents.o src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_makesetbundles.o src/libs6rc/s6rc_repo_makesvlist.o src/libs6rc/s6rc_repo_moveservices.o src/libs6rc/s6rc_repo_refcompile.o src/libs6rc/s6rc_repo_setcompile.o src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_sv_bcmpr.o src/libs6rc/s6rc_repo_sv_cmpr.o src/libs6rc/s6rc_repo_sync.o src/libs6rc/s6rc_sanitize_dir.o src/libs6rc/s6rc_servicedir_internal.o src/libs6rc/s6rc_servicedir_block.o src/libs6rc/s6rc_servicedir_unblock.o src/libs6rc/s6rc_servicedir_copy_offline.o src/libs6rc/s6rc_servicedir_copy_online.o src/libs6rc/s6rc_servicedir_manage.o src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_strrefcmp.o src/libs6rc/s6rc_type_check.o
else
-libs6rc.a.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_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.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 src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
+libs6rc.a.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_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.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 src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
endif
libs6rc.pc: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB}
libs6rc.so.xyzzy: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB}
-libs6rc.so.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_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.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 src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
+libs6rc.so.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_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.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 src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
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_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.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 src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
+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_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.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 src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
s6-rc-repo-init: EXTRA_LIBS := ${SYSCLOCK_LIB}
s6-rc-repo-init: src/repo/s6-rc-repo-init.o ${LIBS6RC} -lskarnet
s6-rc-set-changestate: EXTRA_LIBS := ${SYSCLOCK_LIB}
diff --git a/src/include/s6-rc/repo.h b/src/include/s6-rc/repo.h
index 640e57f..9cb39b0 100644
--- a/src/include/s6-rc/repo.h
+++ b/src/include/s6-rc/repo.h
@@ -21,7 +21,7 @@ extern int s6rc_repo_sv_bcmpr (void const *a, void const *b, void *aux) ;
extern char const s6rc_repo_subnames[4][7] ;
-extern int s6rc_repo_fillset (char const *, char const *, char const *const *, size_t) ;
+extern int s6rc_repo_fillset (char const *, char const *, char const *const *, uint32_t) ;
extern int s6rc_repo_cleanup (char const *) ;
extern int s6rc_repo_sync (char const *, char const *const *, size_t, unsigned int, char const *) ;
@@ -31,16 +31,17 @@ extern int s6rc_repo_makesetbundles (char const *, char const *, unsigned int) ;
extern int s6rc_repo_makedefbundle (char const *, char const *, char const *) ;
#define S6RC_REPO_COMPILE_BUFLEN(repolen, setlen) ((repolen) + (setlen) + 45)
-extern int s6rc_repo_compile (char const *, char const *, char const *const *, size_t, char *, unsigned int, char const *) ;
+extern int s6rc_repo_compile (char const *, char const *, char const *const *, uint8_t, char *, unsigned int, char const *) ;
extern int s6rc_repo_refcompile (char const *, char *, unsigned int, char const *) ;
extern int s6rc_repo_setcompile (char const *, char const *, char const *, char *, unsigned int, char const *) ;
extern int s6rc_repo_listsub (char const *, char const *, char const *, stralloc *, genalloc *) ;
extern int s6rc_repo_listcontents (char const *, char const *, stralloc *, genalloc *) ;
extern int s6rc_repo_listdeps (char const *, char const *, stralloc *, genalloc *, int) ;
-extern int s6rc_repo_listalldeps (char const *, char const *const *, size_t, stralloc *, genalloc *, int) ;
-extern int s6rc_repo_listdeps_internal (char const *, char const *const *, size_t, stralloc *, genalloc *, uint32_t) ;
+extern int s6rc_repo_listalldeps (char const *, char const *const *, uint32_t, stralloc *, genalloc *, int) ;
+extern int s6rc_repo_listdeps_internal (char const *, char const *const *, uint32_t, stralloc *, genalloc *, 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 *) ;
extern int s6rc_repo_badsub (char const *, char const *, char const **, uint32_t, uint8_t, s6rc_repo_sv const *, uint32_t, stralloc *, genalloc *) ;
extern int s6rc_repo_moveservices (char const *, char const *, s6rc_repo_sv const *, uint32_t, uint8_t, char const *, unsigned int) ;
diff --git a/src/include/s6-rc/s6rc-utils.h b/src/include/s6-rc/s6rc-utils.h
index af2ad88..636a696 100644
--- a/src/include/s6-rc/s6rc-utils.h
+++ b/src/include/s6-rc/s6rc-utils.h
@@ -8,6 +8,7 @@
#include <skalibs/stralloc.h>
#include <skalibs/genalloc.h>
+#include <skalibs/avltree.h>
#include <s6-rc/s6rc-db.h>
diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc
index a155e34..62fdd6f 100644
--- a/src/libs6rc/deps-lib/s6rc
+++ b/src/libs6rc/deps-lib/s6rc
@@ -18,6 +18,7 @@ s6rc_repo_badsub.o
s6rc_repo_cleanup.o
s6rc_repo_compile.o
s6rc_repo_fillset.o
+s6rc_repo_flattenservices.o
s6rc_repo_listalldeps.o
s6rc_repo_listcontents.o
s6rc_repo_listdeps.o
diff --git a/src/libs6rc/s6rc_repo_badsub.c b/src/libs6rc/s6rc_repo_badsub.c
index 1848870..fc2a6ba 100644
--- a/src/libs6rc/s6rc_repo_badsub.c
+++ b/src/libs6rc/s6rc_repo_badsub.c
@@ -21,14 +21,18 @@ static int strqcmp (void const *a, void const *b)
int s6rc_repo_badsub (char const *repo, char const *set, char const **services, uint32_t n, uint8_t newsub, s6rc_repo_sv const *svlist, uint32_t ntot, stralloc *sa, genalloc *badga)
{
int sawasnull = !!sa->s ;
- size_t sabase = sa->len ;
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 && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 0)) return 0 ;
+ mid = genalloc_len(size_t, &fulldeps) ;
+ if (newsub > 0 && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 1)) goto err ;
- if (s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, newsub >= 2) <= 0) return 0 ;
qsort(services, n, sizeof(char const *), &strqcmp) ;
fulln = genalloc_len(size_t, &fulldeps) ;
ind = genalloc_s(size_t, &fulldeps) ;
@@ -44,7 +48,7 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services,
strerr_warnfu6x("find service ", cur, " in set ", set, " of repository ", repo) ;
goto err ;
}
- if (newsub >= 2 ? p->sub < newsub : p->sub > newsub)
+ if (i >= mid ? p->sub < newsub : p->sub > newsub)
{
uint32_t k = p - svlist ;
if (!genalloc_append(uint32_t, badga, &k))
diff --git a/src/libs6rc/s6rc_repo_compile.c b/src/libs6rc/s6rc_repo_compile.c
index 390219a..b31a981 100644
--- a/src/libs6rc/s6rc_repo_compile.c
+++ b/src/libs6rc/s6rc_repo_compile.c
@@ -16,7 +16,7 @@
#include <s6-rc/config.h>
#include <s6-rc/repo.h>
-int s6rc_repo_compile (char const *repo, char const *set, char const *const *subs, size_t nsubs, char *oldc, unsigned int verbosity, char const *fdhuser)
+int s6rc_repo_compile (char const *repo, char const *set, char const *const *subs, uint8_t nsubs, char *oldc, unsigned int verbosity, char const *fdhuser)
{
size_t repolen = strlen(repo) ;
size_t setlen = strlen(set) ;
@@ -31,7 +31,7 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *sub
memcpy(newc + repolen + 37 + setlen, ":XXXXXX", 8) ;
memcpy(oldc, newc, repolen + 10) ;
if (mkntemp(newc) == -1) { strerr_warnfu2sys("mkntemp ", newc) ; return -1 ; }
- for (size_t i = 0 ; i < nsubs ; i++) totsublen += strlen(subs[i]) + 1 ;
+ for (uint8_t i = 0 ; i < nsubs ; i++) totsublen += strlen(subs[i]) + 1 ;
{
pid_t pid ;
@@ -53,7 +53,7 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *sub
}
argv[m++] = "--" ;
argv[m++] = newc ;
- for (size_t i = 0 ; i < nsubs ; i++)
+ for (uint8_t i = 0 ; i < nsubs ; i++)
{
size_t sublen = strlen(subs[i]) ;
argv[m++] = w ;
diff --git a/src/libs6rc/s6rc_repo_fillset.c b/src/libs6rc/s6rc_repo_fillset.c
index 549de07..2332e3c 100644
--- a/src/libs6rc/s6rc_repo_fillset.c
+++ b/src/libs6rc/s6rc_repo_fillset.c
@@ -11,7 +11,7 @@
#include <s6-rc/s6rc-utils.h>
#include <s6-rc/repo.h>
-int s6rc_repo_fillset (char const *repo, char const *set, char const *const *existing, size_t n)
+int s6rc_repo_fillset (char const *repo, char const *set, char const *const *existing, uint32_t n)
{
size_t repolen = strlen(repo) ;
size_t setlen = strlen(set) ;
diff --git a/src/libs6rc/s6rc_repo_flattenservices.c b/src/libs6rc/s6rc_repo_flattenservices.c
new file mode 100644
index 0000000..15363ac
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_flattenservices.c
@@ -0,0 +1,73 @@
+/* ISC license. */
+
+#include <sys/wait.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.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/s6rc-utils.h>
+#include <s6-rc/repo.h>
+
+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 ;
+ size_t gabase = genalloc_len(size_t, indices) ;
+
+ {
+ size_t m = 0 ;
+ size_t repolen = strlen(repo) ;
+ pid_t pid ;
+ int fd ;
+ int wstat ;
+ char const *argv[7 + n] ;
+ char refdb[repolen + 15] ;
+ memcpy(refdb, repo, repolen) ;
+ memcpy(refdb + repolen, "/compiled/.ref", 15) ;
+ argv[m++] = S6RC_BINPREFIX "s6-rc-db" ;
+ argv[m++] = "-c";
+ argv[m++] = refdb ;
+ argv[m++] = "-b" ;
+ argv[m++] = "--" ;
+ argv[m++] = "atomics" ;
+ for (size_t i = 0 ; i < n ; i++) argv[m++] = services[i] ;
+ argv[m++] = 0 ;
+ 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, 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]) ;
+ goto err ;
+ }
+ if (WIFSIGNALED(wstat))
+ {
+ char fmt[UINT_FMT] ;
+ fmt[uint_fmt(fmt, WTERMSIG(wstat))] = 0 ;
+ strerr_warnf3x(argv[0], " crashed with signal ", fmt) ;
+ goto err ;
+ }
+ if (WEXITSTATUS(wstat)) return WEXITSTATUS(wstat) ;
+ }
+
+ if (!s6rc_nlto0(storage->s + sabase, sabase, storage->len, indices)) goto err ;
+ 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 111 ;
+}
diff --git a/src/libs6rc/s6rc_repo_listalldeps.c b/src/libs6rc/s6rc_repo_listalldeps.c
index 1c5d4fa..7e9aca6 100644
--- a/src/libs6rc/s6rc_repo_listalldeps.c
+++ b/src/libs6rc/s6rc_repo_listalldeps.c
@@ -2,7 +2,7 @@
#include <s6-rc/repo.h>
-int s6rc_repo_listalldeps (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, int up)
+int s6rc_repo_listalldeps (char const *repo, char const *const *services, uint32_t n, stralloc *storage, genalloc *indices, int up)
{
return s6rc_repo_listdeps_internal(repo, services, n, storage, indices, 2 | !!up) ;
}
diff --git a/src/libs6rc/s6rc_repo_listdeps_internal.c b/src/libs6rc/s6rc_repo_listdeps_internal.c
index 033d3c2..30ecf26 100644
--- a/src/libs6rc/s6rc_repo_listdeps_internal.c
+++ b/src/libs6rc/s6rc_repo_listdeps_internal.c
@@ -17,7 +17,7 @@
#include <s6-rc/s6rc-utils.h>
#include <s6-rc/repo.h>
-int s6rc_repo_listdeps_internal (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, uint32_t options)
+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 ;
@@ -41,40 +41,34 @@ int s6rc_repo_listdeps_internal (char const *repo, char const *const *services,
argv[m++] = options & 1 ? "-u" : "-d" ;
argv[m++] = "--" ;
argv[m++] = options & 2 ? "all-dependencies" : "dependencies" ;
- for (size_t i = 0 ; i < n ; i++) argv[m++] = services[i] ;
+ for (uint32_t i = 0 ; i < n ; i++) argv[m++] = services[i] ;
argv[m++] = 0 ;
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 ;
+ goto err ;
}
if (WIFSIGNALED(wstat))
{
char fmt[UINT_FMT] ;
fmt[uint_fmt(fmt, WTERMSIG(wstat))] = 0 ;
strerr_warnf3x(argv[0], " crashed with signal ", fmt) ;
- return -1 ;
- }
- 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 ;
+ goto err ;
}
+ if (WEXITSTATUS(wstat)) return wait_estatus(wstat) ;
}
if (!s6rc_nlto0(storage->s + sabase, sabase, storage->len, indices)) goto err ;
- 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 ;
+ return 111 ;
}
diff --git a/src/libs6rc/s6rc_repo_setcompile.c b/src/libs6rc/s6rc_repo_setcompile.c
index 82f7d02..5da136a 100644
--- a/src/libs6rc/s6rc_repo_setcompile.c
+++ b/src/libs6rc/s6rc_repo_setcompile.c
@@ -1,11 +1,33 @@
/* ISC license. */
+#include <string.h>
+#include <errno.h>
+
+#include <skalibs/djbunix.h>
+
#include <s6-rc/repo.h>
int s6rc_repo_setcompile (char const *repo, char const *set, char const *defbundle, char *oldc, unsigned int verbosity, char const *fdhuser)
{
- static char const *const subs[4] = { "active", "onboot", "always", "bundle" } ;
+ static char const *const subs[4] = { "bundle", s6rc_repo_subnames[1], s6rc_repo_subnames[2], s6rc_repo_subnames[3] } ;
+ int r ;
if (!s6rc_repo_makesetbundles(repo, set, verbosity)) return -1 ;
if (!s6rc_repo_makedefbundle(repo, set, defbundle)) return -1 ;
- return s6rc_repo_compile(repo, set, subs, 4, oldc, verbosity, fdhuser) ;
+ r = s6rc_repo_compile(repo, set, subs, 4, oldc, verbosity, fdhuser) ;
+
+ {
+ int e = errno ;
+ size_t repolen = strlen(repo) ;
+ size_t setlen = strlen(set) ;
+ size_t sublen = strlen(subs[0]) ;
+ char fn[repolen + setlen + 11 + sublen] ;
+ memcpy(fn, repo, repolen) ;
+ memcpy(fn + repolen, "/sources/", 9) ;
+ memcpy(fn + repolen + 9, set, setlen) ;
+ fn[repolen + 9 + setlen] = '/' ;
+ memcpy(fn + repolen + setlen + 10, subs[0], sublen + 1) ;
+ rm_rf(fn) ;
+ errno = e ;
+ }
+ return r ;
}
diff --git a/src/repo/s6-rc-set-changestate.c b/src/repo/s6-rc-set-changestate.c
index 89cdea8..8ce491d 100644
--- a/src/repo/s6-rc-set-changestate.c
+++ b/src/repo/s6-rc-set-changestate.c
@@ -90,6 +90,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 */
char const *repo = S6RC_REPO_BASE ;
int fdlock ;
unsigned int verbosity = 1 ;
@@ -97,9 +98,9 @@ int main (int argc, char const *const *argv)
char const *wgola[3] = { 0 } ;
unsigned int golc ;
struct subname_s *newsub ;
- size_t max = 0, m = 0 ;
+ size_t max = 0, sabase ;
s6rc_repo_sv *list ;
- uint32_t listn ;
+ uint32_t listn, n ;
PROG = "s6-rc-set-changestate" ;
golc = gol_main(argc, argv, rgolb, 1, rgola, 2, &wgolb, wgola) ;
@@ -129,26 +130,37 @@ int main (int argc, char const *const *argv)
if (!s6rc_repo_makesvlist(repo, argv[0], &storage, &svlist)) _exit(111) ;
list = genalloc_s(s6rc_repo_sv, &svlist) ;
listn = genalloc_len(s6rc_repo_sv, &svlist) ;
+ sabase = storage.len ;
+ {
+ int r = s6rc_repo_flattenservices(repo, argv + 2, argc - 2, &storage, &indices) ;
+ if (r) _exit(r) ;
+ }
+ n = genalloc_len(size_t, &indices) ;
+ if (!n) strerr_dief1x(101, "can't happen: 0 services in flattened list!") ;
- s6rc_repo_sv starting[argc - 2] ;
- uint32_t ind[argc - 2] ;
+ s6rc_repo_sv starting[n] ;
+ uint32_t ind[n] ;
- for (unsigned int i = 0 ; i < argc - 2 ; i++)
+ for (uint32_t i = 0 ; i < n ; i++)
{
- s6rc_repo_sv *p = bsearchr(argv[2+i], list, listn, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, storage.s) ;
- if (!p) strerr_dief6x(100, "unknown service ", argv[2+i], " in set ", argv[0], " of repository ", repo) ;
+ char const *s = storage.s + genalloc_s(size_t, &indices)[i] ;
+ s6rc_repo_sv *p = bsearchr(s, list, listn, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, storage.s) ;
+ if (!p) strerr_dief7x(102, "inconsistent view in set ", argv[0], " of repository ", repo, ": service ", s, " is defined in the reference database but not in the textual representation of the set") ;
starting[i] = *p ;
ind[i] = p - list ;
- max += strlen(argv[2+i]) + 1 ;
+ max += strlen(s) + 1 ;
}
+ storage.len = sabase ;
+ genalloc_setlen(size_t, &indices, 0) ;
+
if (!(wgolb & GOLB_IGNORE_DEPENDENCIES))
{
- genalloc badga = GENALLOC_ZERO ; /* uint32_t */
- char const *tmpstart[argc - 2] ;
+ size_t m = 0 ;
+ char const *tmpstart[n] ;
char tmpstore[max] ;
- for (unsigned int i = 0 ; i < argc - 2 ; i++)
+ for (uint32_t i = 0 ; i < n ; i++)
{
size_t len ;
list[ind[i]].sub = newsub->sub ;
@@ -158,11 +170,11 @@ int main (int argc, char const *const *argv)
m += len ;
}
- if (!s6rc_repo_badsub(repo, argv[0], tmpstart, argc - 2, newsub->sub, list, listn, &storage, &badga)) _exit(111) ;
- if (genalloc_len(uint32_t, &badga))
+ if (!s6rc_repo_badsub(repo, argv[0], tmpstart, n, newsub->sub, list, listn, &storage, &indices)) _exit(111) ;
+ if (genalloc_len(uint32_t, &indices))
{
- uint32_t const *bads = genalloc_s(uint32_t, &badga) ;
- unsigned int badn = genalloc_len(uint32_t, &badga) ;
+ uint32_t const *bads = genalloc_s(uint32_t, &indices) ;
+ uint32_t badn = genalloc_len(uint32_t, &indices) ;
if (verbosity)
{
char const *arg[10 + (badn << 1)] ;
@@ -176,7 +188,7 @@ int main (int argc, char const *const *argv)
arg[7] = " changed to \"" ;
arg[8] = s6rc_repo_subnames[newsub->sub] ;
arg[9] = "\": " ;
- for (unsigned int i = 0 ; i < badn ; i++)
+ for (uint32_t i = 0 ; i < badn ; i++)
{
arg[10 + (i << 1)] = storage.s + list[bads[i]].pos ;
arg[11 + (i << 1)] = i < badn ? " " : "" ;
@@ -187,18 +199,20 @@ int main (int argc, char const *const *argv)
if (wgolb & GOLB_DRYRUN) _exit(0) ;
if (forcelevel == 2)
{
- s6rc_repo_sv full[argc - 2 + badn] ;
- for (unsigned int i = 0 ; i < argc - 2 ; i++) full[i] = starting[i] ;
- for (unsigned int i = 0 ; i < badn ; i++) full[argc - 2 + i] = list[bads[i]] ;
- if (!s6rc_repo_moveservices(repo, argv[0], full, argc - 2 + badn, newsub->sub, storage.s, verbosity)) _exit(111) ;
+ s6rc_repo_sv full[n + badn] ;
+ for (unsigned int i = 0 ; i < n ; i++) full[i] = starting[i] ;
+ for (unsigned int i = 0 ; i < badn ; i++) full[n + i] = list[bads[i]] ;
+ if (!s6rc_repo_moveservices(repo, argv[0], full, n + badn, newsub->sub, storage.s, verbosity)) _exit(111) ;
_exit(0) ;
}
}
}
+ genalloc_free(uint32_t, &indices) ;
+ stralloc_free(&storage) ;
if (!(wgolb & GOLB_DRYRUN))
{
- if (!s6rc_repo_moveservices(repo, argv[0], starting, argc - 2, newsub->sub, storage.s, verbosity)) _exit(111) ;
+ if (!s6rc_repo_moveservices(repo, argv[0], starting, n, newsub->sub, storage.s, verbosity)) _exit(111) ;
}
_exit(0) ;
}