From f513ab225005661e9b4674a1b333abea0c6670f0 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Tue, 5 Aug 2025 19:54:42 +0000 Subject: Next additions: better bundle management and autobuild Signed-off-by: Laurent Bercot --- package/deps.mak | 24 +++--- src/include/s6-rc/repo.h | 18 ++-- src/libs6rc/deps-lib/s6rc | 15 ++-- src/libs6rc/s6rc_repo_compile.c | 112 +++++++++++++++++++++++++ src/libs6rc/s6rc_repo_defcompile.c | 11 +++ src/libs6rc/s6rc_repo_listalldeps.c | 8 ++ src/libs6rc/s6rc_repo_listdeps.c | 8 ++ src/libs6rc/s6rc_repo_listdeps_internal.c | 77 +++++++++++++++++ src/libs6rc/s6rc_repo_listsub.c | 59 +++++++++++++ src/libs6rc/s6rc_repo_makebbuild.c | 87 +++++++++++++++++++ src/libs6rc/s6rc_repo_makedefbundle.c | 116 ++++++++++++++++++++++++++ src/libs6rc/s6rc_repo_moveservices.c | 62 ++++++++++++++ src/libs6rc/s6rc_repo_set_compile.c | 112 ------------------------- src/libs6rc/s6rc_repo_set_defcompile.c | 10 --- src/libs6rc/s6rc_repo_set_listalldeps.c | 8 -- src/libs6rc/s6rc_repo_set_listdeps.c | 8 -- src/libs6rc/s6rc_repo_set_listdeps_internal.c | 77 ----------------- src/libs6rc/s6rc_repo_set_makebundle.c | 92 -------------------- src/libs6rc/s6rc_repo_set_moveservices.c | 57 ------------- src/libs6rc/s6rc_repo_sync.c | 4 +- src/repo/s6-rc-set-new.c | 58 +++++++------ 21 files changed, 607 insertions(+), 416 deletions(-) create mode 100644 src/libs6rc/s6rc_repo_compile.c create mode 100644 src/libs6rc/s6rc_repo_defcompile.c create mode 100644 src/libs6rc/s6rc_repo_listalldeps.c create mode 100644 src/libs6rc/s6rc_repo_listdeps.c create mode 100644 src/libs6rc/s6rc_repo_listdeps_internal.c create mode 100644 src/libs6rc/s6rc_repo_listsub.c create mode 100644 src/libs6rc/s6rc_repo_makebbuild.c create mode 100644 src/libs6rc/s6rc_repo_makedefbundle.c create mode 100644 src/libs6rc/s6rc_repo_moveservices.c delete mode 100644 src/libs6rc/s6rc_repo_set_compile.c delete mode 100644 src/libs6rc/s6rc_repo_set_defcompile.c delete mode 100644 src/libs6rc/s6rc_repo_set_listalldeps.c delete mode 100644 src/libs6rc/s6rc_repo_set_listdeps.c delete mode 100644 src/libs6rc/s6rc_repo_set_listdeps_internal.c delete mode 100644 src/libs6rc/s6rc_repo_set_makebundle.c delete mode 100644 src/libs6rc/s6rc_repo_set_moveservices.c diff --git a/package/deps.mak b/package/deps.mak index 09a3cb8..9b1f7fd 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -21,14 +21,16 @@ src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_lock.lo: src/libs6rc/s6rc_lock.c src/in src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_nlto0.lo: src/libs6rc/s6rc_nlto0.c src/include/s6-rc/s6rc-utils.h src/libs6rc/s6rc_read_uint.o src/libs6rc/s6rc_read_uint.lo: src/libs6rc/s6rc_read_uint.c src/include/s6-rc/s6rc-utils.h 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_defcompile.o src/libs6rc/s6rc_repo_defcompile.lo: src/libs6rc/s6rc_repo_defcompile.c src/include/s6-rc/repo.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_listdeps.o src/libs6rc/s6rc_repo_listdeps.lo: src/libs6rc/s6rc_repo_listdeps.c src/include/s6-rc/repo.h +src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_listdeps_internal.lo: src/libs6rc/s6rc_repo_listdeps_internal.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h +src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_listsub.lo: src/libs6rc/s6rc_repo_listsub.c src/include/s6-rc/repo.h src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_lock.lo: src/libs6rc/s6rc_repo_lock.c src/include/s6-rc/repo.h -src/libs6rc/s6rc_repo_set_compile.o src/libs6rc/s6rc_repo_set_compile.lo: src/libs6rc/s6rc_repo_set_compile.c src/include/s6-rc/config.h src/include/s6-rc/repo.h -src/libs6rc/s6rc_repo_set_defcompile.o src/libs6rc/s6rc_repo_set_defcompile.lo: src/libs6rc/s6rc_repo_set_defcompile.c src/include/s6-rc/repo.h -src/libs6rc/s6rc_repo_set_listalldeps.o src/libs6rc/s6rc_repo_set_listalldeps.lo: src/libs6rc/s6rc_repo_set_listalldeps.c src/include/s6-rc/repo.h -src/libs6rc/s6rc_repo_set_listdeps.o src/libs6rc/s6rc_repo_set_listdeps.lo: src/libs6rc/s6rc_repo_set_listdeps.c src/include/s6-rc/repo.h -src/libs6rc/s6rc_repo_set_listdeps_internal.o src/libs6rc/s6rc_repo_set_listdeps_internal.lo: src/libs6rc/s6rc_repo_set_listdeps_internal.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h -src/libs6rc/s6rc_repo_set_makebundle.o src/libs6rc/s6rc_repo_set_makebundle.lo: src/libs6rc/s6rc_repo_set_makebundle.c src/include/s6-rc/repo.h -src/libs6rc/s6rc_repo_set_moveservices.o src/libs6rc/s6rc_repo_set_moveservices.lo: src/libs6rc/s6rc_repo_set_moveservices.c src/include/s6-rc/repo.h +src/libs6rc/s6rc_repo_makebbuild.o src/libs6rc/s6rc_repo_makebbuild.lo: src/libs6rc/s6rc_repo_makebbuild.c src/include/s6-rc/repo.h +src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_makedefbundle.lo: src/libs6rc/s6rc_repo_makedefbundle.c src/include/s6-rc/repo.h +src/libs6rc/s6rc_repo_moveservices.o src/libs6rc/s6rc_repo_moveservices.lo: src/libs6rc/s6rc_repo_moveservices.c src/include/s6-rc/repo.h src/libs6rc/s6rc_repo_sync.o src/libs6rc/s6rc_repo_sync.lo: src/libs6rc/s6rc_repo_sync.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h src/libs6rc/s6rc_sanitize_dir.o src/libs6rc/s6rc_sanitize_dir.lo: src/libs6rc/s6rc_sanitize_dir.c src/include/s6-rc/s6rc-utils.h src/libs6rc/s6rc_servicedir_block.o src/libs6rc/s6rc_servicedir_block.lo: src/libs6rc/s6rc_servicedir_block.c src/include/s6-rc/s6rc-servicedir.h @@ -56,15 +58,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_cleanup.o src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_set_compile.o src/libs6rc/s6rc_repo_set_defcompile.o src/libs6rc/s6rc_repo_set_listalldeps.o src/libs6rc/s6rc_repo_set_listdeps.o src/libs6rc/s6rc_repo_set_listdeps_internal.o src/libs6rc/s6rc_repo_set_makebundle.o src/libs6rc/s6rc_repo_set_moveservices.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_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_cleanup.o src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_defcompile.o src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_moveservices.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_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_cleanup.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_set_compile.lo src/libs6rc/s6rc_repo_set_defcompile.lo src/libs6rc/s6rc_repo_set_listalldeps.lo src/libs6rc/s6rc_repo_set_listdeps.lo src/libs6rc/s6rc_repo_set_listdeps_internal.lo src/libs6rc/s6rc_repo_set_makebundle.lo src/libs6rc/s6rc_repo_set_moveservices.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_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_cleanup.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_defcompile.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_moveservices.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_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_cleanup.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_set_compile.lo src/libs6rc/s6rc_repo_set_defcompile.lo src/libs6rc/s6rc_repo_set_listalldeps.lo src/libs6rc/s6rc_repo_set_listdeps.lo src/libs6rc/s6rc_repo_set_listdeps_internal.lo src/libs6rc/s6rc_repo_set_makebundle.lo src/libs6rc/s6rc_repo_set_moveservices.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_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_cleanup.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_defcompile.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_moveservices.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_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_cleanup.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_set_compile.lo src/libs6rc/s6rc_repo_set_defcompile.lo src/libs6rc/s6rc_repo_set_listalldeps.lo src/libs6rc/s6rc_repo_set_listdeps.lo src/libs6rc/s6rc_repo_set_listdeps_internal.lo src/libs6rc/s6rc_repo_set_makebundle.lo src/libs6rc/s6rc_repo_set_moveservices.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_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_cleanup.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_defcompile.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_moveservices.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_type_check.lo s6-rc-repo-init: EXTRA_LIBS := s6-rc-repo-init: src/repo/s6-rc-repo-init.o ${LIBS6RC} -lskarnet s6-rc-set-copy: EXTRA_LIBS := diff --git a/src/include/s6-rc/repo.h b/src/include/s6-rc/repo.h index 958a135..ba55b9d 100644 --- a/src/include/s6-rc/repo.h +++ b/src/include/s6-rc/repo.h @@ -13,15 +13,17 @@ extern int s6rc_repo_cleanup (char const *) ; extern int s6rc_repo_sync (char const *, char const *const *, size_t, unsigned int, char const *) ; extern int s6rc_repo_lock (char const *, int) ; -#define S6RC_REPO_SET_COMPILE_BUFLEN(repolen, setlen) ((repolen) + (setlen) + 45) -extern int s6rc_repo_set_makebundle (char const *, char const *, char const *, char const *) ; -extern int s6rc_repo_set_compile (char const *, char const *, char const *const *, size_t, char *, unsigned int, char const *) ; -extern int s6rc_repo_set_defcompile (char const *, char const *, char const *, char *, unsigned int, char const *) ; +extern int s6rc_repo_makebbuild (char const *, char const *) ; +extern int s6rc_repo_makedefbundle (char const *, char const *, char const *) ; -extern int s6rc_repo_set_listdeps (char const *, char const *, stralloc *, genalloc *, int) ; -extern int s6rc_repo_set_listalldeps (char const *, char const *const *, size_t, stralloc *, genalloc *, int) ; -extern int s6rc_repo_set_listdeps_internal (char const *, char const *const *, size_t, stralloc *, genalloc *, uint32_t) ; +#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_defcompile (char const *, char const *, char const *, char *, unsigned int, char const *) ; -extern int s6rc_repo_set_moveservices (char const *, char const *, char const *const *, size_t, char const *, char const *) ; +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_moveservices (char const *, char const *, char const *const *, size_t, char const *, char const *, unsigned int) ; #endif diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index 81e7385..b1ce2e8 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -15,14 +15,15 @@ s6rc_lock.o s6rc_nlto0.o s6rc_read_uint.o s6rc_repo_cleanup.o +s6rc_repo_listsub.o s6rc_repo_lock.o -s6rc_repo_set_compile.o -s6rc_repo_set_defcompile.o -s6rc_repo_set_listalldeps.o -s6rc_repo_set_listdeps.o -s6rc_repo_set_listdeps_internal.o -s6rc_repo_set_makebundle.o -s6rc_repo_set_moveservices.o +s6rc_repo_compile.o +s6rc_repo_defcompile.o +s6rc_repo_listalldeps.o +s6rc_repo_listdeps.o +s6rc_repo_listdeps_internal.o +s6rc_repo_makedefbundle.o +s6rc_repo_moveservices.o s6rc_repo_sync.o s6rc_sanitize_dir.o s6rc_servicedir_internal.o diff --git a/src/libs6rc/s6rc_repo_compile.c b/src/libs6rc/s6rc_repo_compile.c new file mode 100644 index 0000000..db41f89 --- /dev/null +++ b/src/libs6rc/s6rc_repo_compile.c @@ -0,0 +1,112 @@ +/* ISC license. */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +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) +{ + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + size_t totsublen = 0 ; + char newc[S6RC_REPO_COMPILE_BUFLEN(repolen, setlen)] ; + memcpy(newc, repo, repolen) ; + memcpy(newc + repolen, "/compiled/.", 11) ; + memcpy(newc + repolen + 11, set, setlen) ; + newc[repolen + 11 + setlen] = ':' ; + timestamp_g(newc + repolen + 12 + setlen) ; + 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 ; + + { + pid_t pid ; + size_t m = 0 ; + int wstat ; + char const *argv[9 + nsubs + !nsubs] ; + char fmtv[UINT_FMT] ; + char src[(nsubs + !nsubs) * (repolen + 10 + setlen) + totsublen] ; + char *w = src ; + fmtv[uint_fmt(fmtv, verbosity)] = 0 ; + argv[m++] = S6RC_BINPREFIX "s6-rc-compile" ; + argv[m++] = "-v"; + argv[m++] = fmtv ; + argv[m++] = "-b" ; + if (fdhuser) + { + argv[m++] = "-h" ; + argv[m++] = fdhuser ; + } + argv[m++] = "--" ; + argv[m++] = newc ; + if (nsubs) + { + for (size_t i = 0 ; i < nsubs ; i++) + { + size_t sublen = strlen(subs[i]) ; + argv[m++] = w ; + memcpy(w, repo, repolen) ; w += repolen ; + memcpy(w, "/sources/", 9) ; w += 9 ; + memcpy(w, set, setlen) ; w += setlen ; + *w++ = '/' ; + memcpy(w, subs[i], sublen+1) ; w += sublen + 1 ; + } + } + else + { + argv[m++] = w ; + memcpy(w, repo, repolen) ; w += repolen ; + memcpy(w, "/sources/", 9) ; w += 9 ; + memcpy(w, set, setlen+1) ; w += setlen+1 ; + } + argv[m++] = 0 ; + pid = cspawn(argv[0], argv, (char const *const *)environ, 0, 0, 0) ; + if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return -1 ; } + if (wait_pid(pid, &wstat) == -1) + { + strerr_warnfu2sys("wait for ", argv[0]) ; + return -1 ; + } + 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) == 1) - 1 ; + } + } + { + char fn[repolen + setlen + 11] ; + memcpy(fn, newc, repolen + 10) ; + memcpy(fn + repolen + 10, set, setlen + 1) ; + if (!atomic_symlink4(newc + repolen + 10, fn, oldc + repolen + 10, repolen + setlen + 45)) + { + int e = errno ; + rm_rf(newc) ; + errno = e ; + strerr_warnfu4sys("atomically make a ", fn, " symlink pointing to ", newc + repolen + 10) ; + return -1 ; + } + } + return 1 + !!oldc[repolen + 10] ; +} diff --git a/src/libs6rc/s6rc_repo_defcompile.c b/src/libs6rc/s6rc_repo_defcompile.c new file mode 100644 index 0000000..8446ba8 --- /dev/null +++ b/src/libs6rc/s6rc_repo_defcompile.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include + +int s6rc_repo_defcompile (char const *repo, char const *set, char const *bundle, char *oldc, unsigned int verbosity, char const *fdhuser) +{ + static char const *const subs[3] = { "active", "onboot", "bbuild" } ; + if (!s6rc_repo_makebbuild(repo, set)) return -1 ; + if (!s6rc_repo_makedefbundle(repo, set, bundle)) return -1 ; + return s6rc_repo_compile(repo, set, subs, 3, oldc, verbosity, fdhuser) ; +} diff --git a/src/libs6rc/s6rc_repo_listalldeps.c b/src/libs6rc/s6rc_repo_listalldeps.c new file mode 100644 index 0000000..1c5d4fa --- /dev/null +++ b/src/libs6rc/s6rc_repo_listalldeps.c @@ -0,0 +1,8 @@ +/* ISC license. */ + +#include + +int s6rc_repo_listalldeps (char const *repo, char const *const *services, size_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.c b/src/libs6rc/s6rc_repo_listdeps.c new file mode 100644 index 0000000..4dfb495 --- /dev/null +++ b/src/libs6rc/s6rc_repo_listdeps.c @@ -0,0 +1,8 @@ +/* ISC license. */ + +#include + +int s6rc_repo_listdeps (char const *repo, char const *service, stralloc *storage, genalloc *indices, int up) +{ + return s6rc_repo_listdeps_internal(repo, &service, 1, storage, indices, !!up) ; +} diff --git a/src/libs6rc/s6rc_repo_listdeps_internal.c b/src/libs6rc/s6rc_repo_listdeps_internal.c new file mode 100644 index 0000000..b424e2a --- /dev/null +++ b/src/libs6rc/s6rc_repo_listdeps_internal.c @@ -0,0 +1,77 @@ +/* ISC license. */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +int s6rc_repo_listdeps_internal (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, uint32_t options) +{ + int swasnull = !storage->s ; + int gwasnull = !indices->s ; + size_t sstart = storage->len ; + + { + size_t m = 0 ; + size_t repolen = strlen(repo) ; + pid_t pid ; + int fd ; + int wstat ; + char const *argv[8 + n] ; + char refdb[repolen + 22] ; + memcpy(refdb, repo, repolen) ; + memcpy(refdb + repolen, "/compiled/.everything", 22) ; + argv[m++] = S6RC_BINPREFIX "s6-rc-db" ; + argv[m++] = "-c"; + argv[m++] = refdb ; + argv[m++] = "-b" ; + 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] ; + 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 ; } + fd_close(fd) ; + if (wait_pid(pid, &wstat) == -1) + { + strerr_warnfu2sys("wait for ", argv[0]) ; + return -1 ; + } + 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 ; + } + } + + if (!s6rc_nlto0(storage->s + sstart, sstart, storage->len, indices)) goto err ; + return 1 ; + + err: + if (gwasnull) genalloc_free(size_t, indices) ; + if (swasnull) stralloc_free(storage) ; + return -1 ; +} diff --git a/src/libs6rc/s6rc_repo_listsub.c b/src/libs6rc/s6rc_repo_listsub.c new file mode 100644 index 0000000..eef0a7c --- /dev/null +++ b/src/libs6rc/s6rc_repo_listsub.c @@ -0,0 +1,59 @@ +/* ISC license. */ + +#include +#include + +#include +#include +#include +#include + +#include + +int s6rc_repo_listsub (char const *repo, char const *set, char const *sub, stralloc *sa, genalloc *ga) +{ + size_t sabase = sa->len ; + size_t gabase = genalloc_len(size_t, ga) ; + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + size_t sublen = strlen(sub) ; + int sawasnull = !sa->s ; + int gawasnull = !genalloc_s(size_t, ga) ; + int n = 0 ; + char fn[repolen + setlen + 10 + sublen] ; + memcpy(fn, repo, repolen) ; + memcpy(fn + repolen, "/sources/", 9) ; + memcpy(fn + repolen + 9, set, setlen) ; + memcpy(fn + repolen + 9 + setlen, sub, sublen) ; + + DIR *dir = opendir(fn) ; + if (!dir) + { + strerr_warnfu2sys("opendir ", fn) ; + return -1 ; + } + for (;;) + { + direntry *d ; + size_t len ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + len = strlen(d->d_name) ; + if (!genalloc_catb(size_t, ga, &sa->len, 1)) goto err ; + if (!stralloc_catb(sa, d->d_name, len+1)) goto err ; + n++ ; + } + if (errno) goto err ; + dir_close(dir) ; + return n ; + + 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 ; + return -1 ; +} diff --git a/src/libs6rc/s6rc_repo_makebbuild.c b/src/libs6rc/s6rc_repo_makebbuild.c new file mode 100644 index 0000000..942b055 --- /dev/null +++ b/src/libs6rc/s6rc_repo_makebbuild.c @@ -0,0 +1,87 @@ +/* ISC license. */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +static int str_ref_cmp (void const *a, void const *b) +{ + return strcmp(*(char const *const *)a, *(char const *const *)b) ; +} + + +int s6rc_repo_makebbuild (char const *repo, char const *set) +{ + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + int n ; + char src[repolen + 17 + setlen] ; + char dst[repolen + 17 + setlen] ; + memcpy(dst, repo, repolen) ; + memcpy(dst + repolen, "/sources/", 9) ; + memcpy(dst + repolen + 9, set, setlen) ; + memcpy(dst + repolen + 9 + setlen, "/bbuild", 8) ; + memcpy(src, dst, repolen + 10 + setlen) ; + memcpy(src + repolen + 10 + setlen, "bundle") ; + rmstar_tmp(dst, &sa) ; + + n = s6rc_repo_listsub(repo, set, "masked", &sa, &ga) ; + if (n < 0) goto err ; + if (n) + { + DIR *dir ; + char const *masked[n] ; + for (size_t i = 0 ; i < n ; i++) masked[i] = sa.s + genalloc_s(size_t, &ga)[i] ; + genalloc_free(size_t, &ga) ; + qsort(masked, n, sizeof(char const *), &str_ref_cmp) ; + dir = opendir(src) ; + if (!dir) goto err ; + for (;;) + { + direntry *d ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + if (bsearch(&d->d_name, masked, n, sizeof(char const *), &str_ref_cmp)) continue ; + size_t len = strlen(d->d_name) ; + char target[16 + len] ; + char fn[repolen + setlen + 18 + len] ; + memcpy(target, "../.everything/", 15) ; + memcpy(target + 15, d->d_name, len+1) ; + memcpy(fn, dst, repolen + setlen + 17) ; + memcpy(fn + repolen + setlen + 17, d->d_name, len+1) ; + if (symlink(target, fn) == -1) + { + strerr_warnfu4sys("make a symlink named ", fn, " pointing to ", target) ; + goto err0 ; + } + dir_close(dir) ; + if (errno) goto err0 ; + } + else if (!hiercopy_tmp(src, dst, &sa)) goto err ; + + stralloc_free(&sa) ; + return 1 ; + + err0: + { + int e = errno ; + rmstar_tmp(dst, &sa) ; + errno = e ; + } + err: + stralloc_free(&sa) ; + return 0 ; +} diff --git a/src/libs6rc/s6rc_repo_makedefbundle.c b/src/libs6rc/s6rc_repo_makedefbundle.c new file mode 100644 index 0000000..0863abd --- /dev/null +++ b/src/libs6rc/s6rc_repo_makedefbundle.c @@ -0,0 +1,116 @@ +/* ISC license. */ + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +int s6rc_repo_makedefbundle (char const *repo, char const *set, char const *bundle) +{ + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + size_t bundlelen = strlen(bundle) ; + size_t bfnlen = repolen + setlen + bundlelen + 28 ; + DIR *dir ; + char bfn[bfnlen + 1] ; + char subfn[repolen + setlen + 17] ; + + memcpy(bfn, repo, repolen) ; + memcpy(bfn + repolen, "/sources/.everything/", 21) ; + memcpy(bfn + repolen + 21, bundle, bundlelen + 1) ; + if (access(bfn, F_OK) == -1) + { + if (errno != ENOENT) + { + strerr_warnfu2sys("check existence of ", bfn) ; + return 0 ; + } + } + else + { + stralloc sa = STRALLOC_ZERO ; + if (sareadlink(&sa, bfn) == -1) + { + strerr_warnfu2sys("readlink ", bfn) ; + return 0 ; + } + if (!stralloc_0(&sa)) + { + strerr_warnfu1sys("stralloc_catb ") ; + stralloc_free(&sa) ; + return 0 ; + } + strerr_warnf4x("bundle ", bundle, " is already defined at ", sa.s) ; + stralloc_free(&sa) ; + return (errno = EINVAL, 0) ; + } + + memcpy(bfn + repolen + 9, set, setlen) ; + memcpy(bfn + repolen + 9 + setlen, "/bbuild/", 8) ; + memcpy(bfn + repolen + 17 + setlen, bundle, bundlelen + 1) ; + if (mkdir(bfn, 02755) == -1) + { + if (errno != EEXIST) strerr_warnfu2sys("mkdir ", bfn) ; + else strerr_warnf6x("bundle ", bundle, " is already defined in set ", set, " of repository ", repo) ; + return 0 ; + } + memcpy(bfn + repolen + setlen + 17 + bundlelen, "/type", 6) ; + if (!openwritenclose_unsafe(bfn, "bundle\n", 7)) + { + strerr_warnfu2sys("write to ", bfn) ; + return 0 ; + } + memcpy(bfn + repolen + setlen + 18 + bundlelen, "contents.d", 11) ; + if (mkdir(bfn, 02755) == -1) + { + strerr_warnfu2sys("mkdir ", bfn) ; + return 0 ; + } + bfn[bfnlen] = '/' ; + + memcpy(subfn, bfn, repolen + 10 + setlen) ; + memcpy(subfn + repolen + 10 + setlen, "onboot", 7) ; + dir = opendir(subfn) ; + if (!dir) + { + strerr_warnfu2sys("opendir ", subfn) ; + return 0 ; + } + + for (;;) + { + size_t len ; + direntry *d ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + len = strlen(d->d_name) ; + char fn[bfnlen + len + 2] ; + memcpy(fn, bfn, bfnlen + 1) ; + memcpy(fn + bfnlen + 1, d->d_name, len + 1) ; + if (!openwritenclose_unsafe(fn, "", 0)) + { + strerr_warnfu2sys("write to ", fn) ; + dir_close(dir) ; + return 0 ; + } + } + dir_close(dir) ; + if (errno) + { + strerr_warnfu2sys("readdir ", subfn) ; + return 0 ; + } + + return 1 ; +} diff --git a/src/libs6rc/s6rc_repo_moveservices.c b/src/libs6rc/s6rc_repo_moveservices.c new file mode 100644 index 0000000..8177fe7 --- /dev/null +++ b/src/libs6rc/s6rc_repo_moveservices.c @@ -0,0 +1,62 @@ +/* ISC license. */ + +#include +#include +#include +#include + +#include + +#include + +int s6rc_repo_moveservices (char const *repo, char const *set, char const *const *services, size_t n, char const *fromsub, char const *tosub, unsigned int verbosity) +{ + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + size_t fromsublen = strlen(fromsub) ; + size_t tosublen = strlen(tosub) ; + size_t maxserviceslen = 0 ; + size_t i = 0 ; + for (; i < n ; i++) + { + size_t len = strlen(services[i]) ; + if (len > maxserviceslen) maxserviceslen = len ; + } + char from[repolen + setlen + fromsublen + maxserviceslen + 12] ; + char to[repolen + setlen + tosublen + maxserviceslen + 12] ; + memcpy(from, repo, repolen) ; + memcpy(from + repolen, "/sources/", 9) ; + memcpy(from + repolen + 9, set, setlen) ; + from[repolen + 9 + setlen] = '/' ; + memcpy(to, from, repolen + 10 + setlen) ; + memcpy(from + repolen + 10 + setlen, fromsub, fromsublen) ; + from[repolen + 10 + setlen + fromsublen] = '/' ; + memcpy(to + repolen + 10 + setlen, tosub, tosublen) ; + to[repolen + 10 + setlen + tosublen] = '/' ; + for (i = 0 ; i < n ; i++) + { + size_t len = strlen(services[i]) ; + memcpy(from + repolen + setlen + fromsublen + 11, services[i], len + 1) ; + memcpy(to + repolen + setlen + tosublen + 11, services[i], len + 1) ; + if (access(to, F_OK) == 0) + { + if (verbosity >= 2) + strerr_warni8x("service ", services[i], " already existed in subset ", tosub, " of set ", set, " in repository ", repo) ; + } + else if (errno != ENOENT) + { + strerr_warnfu2sys("access ", to) ; + return 0 ; + } + if (rename(from, to) == -1) + { + strerr_warnfu4sys("rename ", from, " to ", to) ; + return 0 ; + } + if (verbosity >= 3) + { + strerr_warnt10x("repository ", repo, ", set ", set, ", from subset ", fromsub, " to subset ", tosub, ": successfully moved service ", services[i]) ; + } + } + return 1 ; +} diff --git a/src/libs6rc/s6rc_repo_set_compile.c b/src/libs6rc/s6rc_repo_set_compile.c deleted file mode 100644 index 1ca5e56..0000000 --- a/src/libs6rc/s6rc_repo_set_compile.c +++ /dev/null @@ -1,112 +0,0 @@ -/* ISC license. */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -int s6rc_repo_set_compile (char const *repo, char const *set, char const *const *subs, size_t nsubs, char *oldc, unsigned int verbosity, char const *fdhuser) -{ - size_t repolen = strlen(repo) ; - size_t setlen = strlen(set) ; - size_t totsublen = 0 ; - char newc[S6RC_REPO_SET_COMPILE_BUFLEN(repolen, setlen)] ; - memcpy(newc, repo, repolen) ; - memcpy(newc + repolen, "/compiled/.", 11) ; - memcpy(newc + repolen + 11, set, setlen) ; - newc[repolen + 11 + setlen] = ':' ; - timestamp_g(newc + repolen + 12 + setlen) ; - 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 ; - - { - pid_t pid ; - size_t m = 0 ; - int wstat ; - char const *argv[9 + nsubs + !nsubs] ; - char fmtv[UINT_FMT] ; - char src[(nsubs + !nsubs) * (repolen + 10 + setlen) + totsublen] ; - char *w = src ; - fmtv[uint_fmt(fmtv, verbosity)] = 0 ; - argv[m++] = S6RC_BINPREFIX "s6-rc-compile" ; - argv[m++] = "-v"; - argv[m++] = fmtv ; - argv[m++] = "-b" ; - if (fdhuser) - { - argv[m++] = "-h" ; - argv[m++] = fdhuser ; - } - argv[m++] = "--" ; - argv[m++] = newc ; - if (nsubs) - { - for (size_t i = 0 ; i < nsubs ; i++) - { - size_t sublen = strlen(subs[i]) ; - argv[m++] = w ; - memcpy(w, repo, repolen) ; w += repolen ; - memcpy(w, "/sources/", 9) ; w += 9 ; - memcpy(w, set, setlen) ; w += setlen ; - *w++ = '/' ; - memcpy(w, subs[i], sublen+1) ; w += sublen + 1 ; - } - } - else - { - argv[m++] = w ; - memcpy(w, repo, repolen) ; w += repolen ; - memcpy(w, "/sources/", 9) ; w += 9 ; - memcpy(w, set, setlen+1) ; w += setlen+1 ; - } - argv[m++] = 0 ; - pid = cspawn(argv[0], argv, (char const *const *)environ, 0, 0, 0) ; - if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return -1 ; } - if (wait_pid(pid, &wstat) == -1) - { - strerr_warnfu2sys("wait for ", argv[0]) ; - return -1 ; - } - 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) == 1) - 1 ; - } - } - { - char fn[repolen + setlen + 11] ; - memcpy(fn, newc, repolen + 10) ; - memcpy(fn + repolen + 10, set, setlen + 1) ; - if (!atomic_symlink4(newc + repolen + 10, fn, oldc + repolen + 10, repolen + setlen + 45)) - { - int e = errno ; - rm_rf(newc) ; - errno = e ; - strerr_warnfu4sys("atomically make a ", fn, " symlink pointing to ", newc + repolen + 10) ; - return -1 ; - } - } - return 1 + !!oldc[repolen + 10] ; -} diff --git a/src/libs6rc/s6rc_repo_set_defcompile.c b/src/libs6rc/s6rc_repo_set_defcompile.c deleted file mode 100644 index ebd8a9d..0000000 --- a/src/libs6rc/s6rc_repo_set_defcompile.c +++ /dev/null @@ -1,10 +0,0 @@ -/* ISC license. */ - -#include - -int s6rc_repo_set_defcompile (char const *repo, char const *set, char const *bundle, char *oldc, unsigned int verbosity, char const *fdhuser) -{ - static char const *const subs[3] = { "active", "onboot", "bundle" } ; - if (!s6rc_repo_set_makebundle(repo, set, "onboot", bundle)) return -1 ; - return s6rc_repo_set_compile(repo, set, subs, 3, oldc, verbosity, fdhuser) ; -} diff --git a/src/libs6rc/s6rc_repo_set_listalldeps.c b/src/libs6rc/s6rc_repo_set_listalldeps.c deleted file mode 100644 index c5b14cc..0000000 --- a/src/libs6rc/s6rc_repo_set_listalldeps.c +++ /dev/null @@ -1,8 +0,0 @@ -/* ISC license. */ - -#include - -int s6rc_repo_set_listalldeps (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, int up) -{ - return s6rc_repo_set_listdeps_internal(repo, services, n, storage, indices, 2 | !!up) ; -} diff --git a/src/libs6rc/s6rc_repo_set_listdeps.c b/src/libs6rc/s6rc_repo_set_listdeps.c deleted file mode 100644 index 8442291..0000000 --- a/src/libs6rc/s6rc_repo_set_listdeps.c +++ /dev/null @@ -1,8 +0,0 @@ -/* ISC license. */ - -#include - -int s6rc_repo_set_listdeps (char const *repo, char const *service, stralloc *storage, genalloc *indices, int up) -{ - return s6rc_repo_set_listdeps_internal(repo, &service, 1, storage, indices, !!up) ; -} diff --git a/src/libs6rc/s6rc_repo_set_listdeps_internal.c b/src/libs6rc/s6rc_repo_set_listdeps_internal.c deleted file mode 100644 index 9ca38e1..0000000 --- a/src/libs6rc/s6rc_repo_set_listdeps_internal.c +++ /dev/null @@ -1,77 +0,0 @@ -/* ISC license. */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -int s6rc_repo_set_listdeps_internal (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, uint32_t options) -{ - int swasnull = !storage->s ; - int gwasnull = !indices->s ; - size_t sstart = storage->len ; - - { - size_t m = 0 ; - size_t repolen = strlen(repo) ; - pid_t pid ; - int fd ; - int wstat ; - char const *argv[8 + n] ; - char refdb[repolen + 22] ; - memcpy(refdb, repo, repolen) ; - memcpy(refdb + repolen, "/compiled/.everything", 22) ; - argv[m++] = S6RC_BINPREFIX "s6-rc-db" ; - argv[m++] = "-c"; - argv[m++] = refdb ; - argv[m++] = "-b" ; - 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] ; - 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 ; } - fd_close(fd) ; - if (wait_pid(pid, &wstat) == -1) - { - strerr_warnfu2sys("wait for ", argv[0]) ; - return -1 ; - } - 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 ; - } - } - - if (!s6rc_nlto0(storage->s + sstart, sstart, storage->len, indices)) goto err ; - return 1 ; - - err: - if (gwasnull) genalloc_free(size_t, indices) ; - if (swasnull) stralloc_free(storage) ; - return -1 ; -} diff --git a/src/libs6rc/s6rc_repo_set_makebundle.c b/src/libs6rc/s6rc_repo_set_makebundle.c deleted file mode 100644 index fa52e40..0000000 --- a/src/libs6rc/s6rc_repo_set_makebundle.c +++ /dev/null @@ -1,92 +0,0 @@ -/* ISC license. */ - -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include - -int s6rc_repo_set_makebundle (char const *repo, char const *set, char const *sub, char const *bundle) -{ - size_t repolen = strlen(repo) ; - size_t setlen = strlen(set) ; - size_t sublen = strlen(sub) ; - size_t bundlelen = strlen(bundle) ; - size_t bfnlen = repolen + setlen + bundlelen + 28 ; - DIR *dir ; - char bfn[bfnlen + 1] ; - char subfn[repolen + setlen + sublen + 11] ; - - memcpy(bfn, repo, repolen) ; - memcpy(bfn + repolen, "/sources/", 9) ; - memcpy(bfn + repolen + 9, set, setlen) ; - memcpy(bfn + repolen + 9 + setlen, "/bundle/", 8) ; - memcpy(bfn + repolen + 17 + setlen, bundle, bundlelen + 1) ; - if (rm_rf(bfn) == -1) - { - strerr_warnfu2sys("delete previous directory at ", bfn) ; - return 0 ; - } - if (mkdir(bfn, 02755) == -1) - { - strerr_warnfu2sys("mkdir ", bfn) ; - return 0 ; - } - memcpy(bfn + repolen + setlen + 17 + bundlelen, "/type", 6) ; - if (!openwritenclose_unsafe(bfn, "bundle\n", 7)) - { - strerr_warnfu2sys("write to ", bfn) ; - return 0 ; - } - memcpy(bfn + repolen + setlen + 18 + bundlelen, "contents.d", 11) ; - if (mkdir(bfn, 02755) == -1) - { - strerr_warnfu2sys("mkdir ", bfn) ; - return 0 ; - } - bfn[bfnlen] = '/' ; - - memcpy(subfn, bfn, repolen + 10 + setlen) ; - memcpy(subfn + repolen + 10 + setlen, sub, sublen + 1) ; - dir = opendir(subfn) ; - if (!dir) - { - strerr_warnfu2sys("opendir ", subfn) ; - return 0 ; - } - - for (;;) - { - size_t len ; - direntry *d ; - errno = 0 ; - d = readdir(dir) ; - if (!d) break ; - if (d->d_name[0] == '.') continue ; - len = strlen(d->d_name) ; - char fn[bfnlen + len + 2] ; - memcpy(fn, bfn, bfnlen + 1) ; - memcpy(fn + bfnlen + 1, d->d_name, len + 1) ; - if (!openwritenclose_unsafe(fn, "", 0)) - { - strerr_warnfu2sys("write to ", fn) ; - dir_close(dir) ; - return 0 ; - } - } - dir_close(dir) ; - if (errno) - { - strerr_warnfu2sys("readdir ", subfn) ; - return 0 ; - } - - return 1 ; -} diff --git a/src/libs6rc/s6rc_repo_set_moveservices.c b/src/libs6rc/s6rc_repo_set_moveservices.c deleted file mode 100644 index bdaba4a..0000000 --- a/src/libs6rc/s6rc_repo_set_moveservices.c +++ /dev/null @@ -1,57 +0,0 @@ -/* ISC license. */ - -#include -#include -#include - -#include - -#include - -int s6rc_repo_set_moveservices (char const *repo, char const *set, char const *const *services, size_t n, char const *fromsub, char const *tosub) -{ - size_t repolen = strlen(repo) ; - size_t setlen = strlen(set) ; - size_t fromsublen = strlen(fromsub) ; - size_t tosublen = strlen(tosub) ; - size_t maxserviceslen = 0 ; - size_t i = 0 ; - for (; i < n ; i++) - { - size_t len = strlen(services[i]) ; - if (len > maxserviceslen) maxserviceslen = len ; - } - char from[repolen + setlen + fromsublen + maxserviceslen + 12] ; - char to[repolen + setlen + tosublen + maxserviceslen + 12] ; - memcpy(from, repo, repolen) ; - memcpy(from + repolen, "/sources/", 9) ; - memcpy(from + repolen + 9, set, setlen) ; - from[repolen + 9 + setlen] = '/' ; - memcpy(to, from, repolen + 10 + setlen) ; - memcpy(from + repolen + 10 + setlen, fromsub, fromsublen) ; - from[repolen + 10 + setlen + fromsublen] = '/' ; - memcpy(to + repolen + 10 + setlen, tosub, tosublen) ; - to[repolen + 10 + setlen + tosublen] = '/' ; - for (i = 0 ; i < n ; i++) - { - size_t len = strlen(services[i]) ; - memcpy(from + repolen + setlen + fromsublen + 11, services[i], len + 1) ; - memcpy(to + repolen + setlen + tosublen + 11, services[i], len + 1) ; - if (rename(from, to) == -1) goto rollback ; - } - return 1 ; - - rollback: - int e = errno ; - strerr_warnfu4sys("rename ", from, " to ", to) ; - while (i--) - { - size_t len = strlen(services[i]) ; - memcpy(from + repolen + setlen + fromsublen + 11, services[i], len + 1) ; - memcpy(to + repolen + setlen + tosublen + 11, services[i], len + 1) ; - if (rename(to, from) == -1) - strerr_warnwu4sys("rollback ", to, " to ", from) ; - } - errno = e ; - return 0 ; -} diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c index 4341bee..a0b6431 100644 --- a/src/libs6rc/s6rc_repo_sync.c +++ b/src/libs6rc/s6rc_repo_sync.c @@ -126,9 +126,9 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources if (!s6rc_repo_cleanup(repo)) return 0 ; { - size_t buflen = S6RC_REPO_SET_COMPILE_BUFLEN(repolen, sizeof(".everything") - 1) ; + size_t buflen = S6RC_REPO_COMPILE_BUFLEN(repolen, sizeof(".everything") - 1) ; char oldc[buflen] ; - int r = s6rc_repo_set_compile(repo, ".everything", 0, 0, oldc, verbosity, fdhuser) ; + int r = s6rc_repo_compile(repo, ".everything", 0, 0, oldc, verbosity, fdhuser) ; if (r <= 0) goto err0 ; if (r == 2) rm_rf(oldc) ; } diff --git a/src/repo/s6-rc-set-new.c b/src/repo/s6-rc-set-new.c index 06b55d0..74bab93 100644 --- a/src/repo/s6-rc-set-new.c +++ b/src/repo/s6-rc-set-new.c @@ -33,14 +33,13 @@ static void cleanup (char const *fn) static inline void newset (char const *repo, char const *setname) { - static char const sublist[4][7] = { "masked", "onboot", "bundle", "active" } ; + static char const sublist[5][7] = { "masked", "active", "onboot", "bundle", "bbuild" } ; size_t repolen = strlen(repo) ; size_t setlen = strlen(setname) ; char everything[repolen + 21] ; char fn[repolen + 10 + setlen] ; char tmp[repolen + 18 + setlen] ; - char act[repolen + 25 + setlen] ; - char onb[repolen + 25 + setlen] ; + char sub[repolen + 25 + setlen] ; memcpy(everything, repo, repolen) ; memcpy(everything + repolen, "/sources/.everything", 21) ; memcpy(fn, everything, repolen + 9) ; @@ -56,29 +55,29 @@ static inline void newset (char const *repo, char const *setname) memcpy(tmp + repolen + 10 + setlen, ":XXXXXX", 8) ; if (!mkdtemp(tmp)) strerr_diefu2sys(111, "mkdtemp ", tmp) ; - memcpy(act, tmp, repolen + 17 + setlen) ; - memcpy(act + repolen + 17 + setlen, "/lock", 6) ; - if (!openwritenclose_unsafe(act, "", 0)) + memcpy(sub, tmp, repolen + 17 + setlen) ; + memcpy(sub + repolen + 17 + setlen, "/lock", 6) ; + if (!openwritenclose_unsafe(sub, "", 0)) { cleanup(tmp) ; - strerr_diefu2sys(111, "create ", act) ; + strerr_diefu2sys(111, "create ", sub) ; } for (size_t i = 0 ; i < 4 ; i++) { - memcpy(act + repolen + 18 + setlen, sublist[i], 7) ; - if (mkdir(act, 02755) == -1) + memcpy(sub + repolen + 18 + setlen, sublist[i], 7) ; + if (mkdir(sub, 02755) == -1) { cleanup(tmp) ; - strerr_diefu2sys(111, "mkdir ", act) ; + strerr_diefu2sys(111, "mkdir ", sub) ; } } DIR *dir = opendir(everything) ; for (;;) { - char *cur = act ; size_t len ; + unsigned int subi = 1 ; direntry *d ; errno = 0 ; d = readdir(dir) ; @@ -89,21 +88,32 @@ static inline void newset (char const *repo, char const *setname) char src[len + 33] ; char dst[repolen + 26 + setlen + len] ; memcpy(src, "../.everything/", 15) ; - memcpy(src + 15, d->d_name, len) ; - memcpy(src + 15 + len, "/flag-essential", 16) ; - if (access(src, F_OK) == -1) + memcpy(src + 15, d->d_name, len+1) ; + switch (s6rc_type_check(-1, src)) { - if (errno != ENOENT) strerr_diefu2sys(111, "access ", src) ; + case -1 : strerr_diefu3sys(111, "check ", src, "/type") ; + case 0 : strerr_dief3x(102, "invalid ", src, "/type") ; + case 3 : subi = 3 ; break ; + default : + { + memcpy(src + 15 + len, "/flag-essential", 16) ; + if (access(src, F_OK) == -1) + { + if (errno != ENOENT) strerr_diefu2sys(111, "access ", src) ; + } + else subi = 2 ; + memcpy(src + 21 + len, "recommended", 12) ; + if (access(src, F_OK) == -1) + { + if (errno != ENOENT) strerr_diefu2sys(111, "access ", src) ; + } + else subi = 2 ; + src[15 + len] = 0 ; + break ; + } } - else cur = onb ; - memcpy(src + 21 + len, "recommended", 12) ; - if (access(src, F_OK) == -1) - { - if (errno != ENOENT) strerr_diefu2sys(111, "access ", src) ; - } - else cur = onb ; - src[15 + len] = 0 ; - memcpy(dst, cur, repolen + 24 + setlen) ; + memcpy(dst, sub, repolen + 18 + setlen) ; + memcpy(dst + repolen + 18 + setlen, sublist[subi], 6) ; dst[repolen + 24 + setlen] = '/' ; memcpy(dst + repolen + 25 + setlen, d->d_name, len+1) ; if (symlink(src, dst) == -1) -- cgit v1.3.1