diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-24 06:59:18 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-24 06:59:18 +0000 |
| commit | 04186b51dfcada174b5372aab0c7e423a4ed3244 (patch) | |
| tree | d99d0b35c8c9c1af6b4e7826cd1d87e509895b9d | |
| parent | a4756f00b3823952580d1fee704675c6f813a248 (diff) | |
| download | s6-rc-04186b51dfcada174b5372aab0c7e423a4ed3244.tar.gz | |
More progress: updated sync, nominal fix
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | package/deps.mak | 18 | ||||
| -rw-r--r-- | package/modes | 1 | ||||
| -rw-r--r-- | package/targets.mak | 1 | ||||
| -rw-r--r-- | src/include/s6-rc/repo.h | 5 | ||||
| -rw-r--r-- | src/include/s6-rc/s6rc-utils.h | 1 | ||||
| -rw-r--r-- | src/libs6rc/deps-lib/s6rc | 4 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_ls.c | 46 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_fix.c | 51 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_fixset.c | 1 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_list_sets.c | 15 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_listsub.c | 45 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makesetbundles.c | 8 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sync.c | 121 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_syncset.c | 16 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_syncset_tmp.c | 104 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-repo-sync | 3 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-init.c | 42 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-sync.c | 49 |
19 files changed, 374 insertions, 158 deletions
@@ -16,6 +16,7 @@ /s6-rc-oneshot-run /s6-rc-format-upgrade /s6-rc-repo-init +/s6-rc-repo-sync /s6-rc-repo-populate /s6-rc-set-new /s6-rc-set-copy diff --git a/package/deps.mak b/package/deps.mak index b8fe912..2f362ea 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -18,19 +18,22 @@ src/libs6rc/s6rc_livedir_create.o src/libs6rc/s6rc_livedir_create.lo: src/libs6r src/libs6rc/s6rc_livedir_prefix.o src/libs6rc/s6rc_livedir_prefix.lo: src/libs6rc/s6rc_livedir_prefix.c src/include/s6-rc/s6rc-utils.h src/libs6rc/s6rc_livedir_prefixsize.o src/libs6rc/s6rc_livedir_prefixsize.lo: src/libs6rc/s6rc_livedir_prefixsize.c src/include/s6-rc/s6rc-utils.h src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_lock.lo: src/libs6rc/s6rc_lock.c src/include/s6-rc/s6rc-utils.h +src/libs6rc/s6rc_ls.o src/libs6rc/s6rc_ls.lo: src/libs6rc/s6rc_ls.c src/include/s6-rc/s6rc-utils.h 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_badsub.o src/libs6rc/s6rc_repo_badsub.lo: src/libs6rc/s6rc_repo_badsub.c src/include/s6-rc/repo.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_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_fix.o src/libs6rc/s6rc_repo_fix.lo: src/libs6rc/s6rc_repo_fix.c src/include/s6-rc/repo.h src/libs6rc/s6rc_repo_fixset.o src/libs6rc/s6rc_repo_fixset.lo: src/libs6rc/s6rc_repo_fixset.c src/include/s6-rc/repo.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_list_sets.o src/libs6rc/s6rc_repo_list_sets.lo: src/libs6rc/s6rc_repo_list_sets.c 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 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_listsub.o src/libs6rc/s6rc_repo_listsub.lo: src/libs6rc/s6rc_repo_listsub.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.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_makedefbundle.o src/libs6rc/s6rc_repo_makedefbundle.lo: src/libs6rc/s6rc_repo_makedefbundle.c src/include/s6-rc/repo.h src/libs6rc/s6rc_repo_makesetbundles.o src/libs6rc/s6rc_repo_makesetbundles.lo: src/libs6rc/s6rc_repo_makesetbundles.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h @@ -43,6 +46,8 @@ src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_subnames.lo: src/libs6rc/ src/libs6rc/s6rc_repo_sv_bcmpr.o src/libs6rc/s6rc_repo_sv_bcmpr.lo: src/libs6rc/s6rc_repo_sv_bcmpr.c src/include/s6-rc/repo.h src/libs6rc/s6rc_repo_sv_cmpr.o src/libs6rc/s6rc_repo_sv_cmpr.lo: src/libs6rc/s6rc_repo_sv_cmpr.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_repo_syncset.o src/libs6rc/s6rc_repo_syncset.lo: src/libs6rc/s6rc_repo_syncset.c src/include/s6-rc/repo.h +src/libs6rc/s6rc_repo_syncset_tmp.o src/libs6rc/s6rc_repo_syncset_tmp.lo: src/libs6rc/s6rc_repo_syncset_tmp.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 src/libs6rc/s6rc_servicedir_copy_offline.o src/libs6rc/s6rc_servicedir_copy_offline.lo: src/libs6rc/s6rc_servicedir_copy_offline.c src/include/s6-rc/s6rc-servicedir.h src/libs6rc/s6rc-servicedir-internal.h @@ -54,6 +59,7 @@ src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_servicedir_unsupervis src/libs6rc/s6rc_strrefcmp.o src/libs6rc/s6rc_strrefcmp.lo: src/libs6rc/s6rc_strrefcmp.c src/include/s6-rc/s6rc-utils.h src/libs6rc/s6rc_type_check.o src/libs6rc/s6rc_type_check.lo: src/libs6rc/s6rc_type_check.c src/include/s6-rc/s6rc-utils.h src/repo/s6-rc-repo-init.o src/repo/s6-rc-repo-init.lo: src/repo/s6-rc-repo-init.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h +src/repo/s6-rc-repo-sync.o src/repo/s6-rc-repo-sync.lo: src/repo/s6-rc-repo-sync.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/repo/s6-rc-set-changestate.o src/repo/s6-rc-set-changestate.lo: src/repo/s6-rc-set-changestate.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/repo/s6-rc-set-commit.o src/repo/s6-rc-set-commit.lo: src/repo/s6-rc-set-commit.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/repo/s6-rc-set-copy.o src/repo/s6-rc-set-copy.lo: src/repo/s6-rc-set-copy.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h @@ -71,17 +77,19 @@ 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_fixset.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_makesvlist_byname.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_ls.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_fixset.o src/libs6rc/s6rc_repo_flattenservices.o src/libs6rc/s6rc_repo_list_sets.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_makesvlist_byname.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_repo_syncset.o src/libs6rc/s6rc_repo_syncset_tmp.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_fixset.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_makesvlist_byname.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_ls.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_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_list_sets.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_makesvlist_byname.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_repo_syncset.lo src/libs6rc/s6rc_repo_syncset_tmp.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_fixset.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_makesvlist_byname.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_ls.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_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_list_sets.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_makesvlist_byname.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_repo_syncset.lo src/libs6rc/s6rc_repo_syncset_tmp.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_fixset.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_makesvlist_byname.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_ls.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_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_list_sets.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_makesvlist_byname.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_repo_syncset.lo src/libs6rc/s6rc_repo_syncset_tmp.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-repo-sync: EXTRA_LIBS := ${SYSCLOCK_LIB} +s6-rc-repo-sync: src/repo/s6-rc-repo-sync.o ${LIBS6RC} -lskarnet s6-rc-set-changestate: EXTRA_LIBS := ${SYSCLOCK_LIB} s6-rc-set-changestate: src/repo/s6-rc-set-changestate.o ${LIBS6RC} -lskarnet s6-rc-set-commit: EXTRA_LIBS := ${SYSCLOCK_LIB} diff --git a/package/modes b/package/modes index 8f37adb..f565295 100644 --- a/package/modes +++ b/package/modes @@ -9,6 +9,7 @@ s6-rc-fdholder-filler 0755 s6-rc-oneshot-run 0755 s6-rc-format-upgrade 0755 s6-rc-repo-init 0755 +s6-rc-repo-sync 0755 s6-rc-set-new 0755 s6-rc-set-copy 0755 s6-rc-set-delete 0755 diff --git a/package/targets.mak b/package/targets.mak index da74098..feffc92 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -8,6 +8,7 @@ s6-rc \ s6-rc-update \ s6-rc-format-upgrade \ s6-rc-repo-init \ +s6-rc-repo-sync \ s6-rc-set-new \ s6-rc-set-copy \ s6-rc-set-delete \ diff --git a/src/include/s6-rc/repo.h b/src/include/s6-rc/repo.h index a50309d..61a479f 100644 --- a/src/include/s6-rc/repo.h +++ b/src/include/s6-rc/repo.h @@ -24,7 +24,9 @@ extern char const s6rc_repo_subnames[4][7] ; 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 *) ; +extern int s6rc_repo_sync (char const *, unsigned int, char const *) ; +extern int s6rc_repo_syncset (char const *, char const *, unsigned int) ; +extern int s6rc_repo_syncset_tmp (char const *, char const *, stralloc *, genalloc *ga, unsigned int) ; extern int s6rc_repo_lock (char const *, int) ; extern int s6rc_repo_makesetbundles (char const *, char const *, unsigned int) ; @@ -35,6 +37,7 @@ extern int s6rc_repo_compile (char const *, char const *, char const *const *, u 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_list_sets (char const *, stralloc *, genalloc *) ; 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) ; diff --git a/src/include/s6-rc/s6rc-utils.h b/src/include/s6-rc/s6rc-utils.h index 636a696..e1533dc 100644 --- a/src/include/s6-rc/s6rc-utils.h +++ b/src/include/s6-rc/s6rc-utils.h @@ -27,6 +27,7 @@ extern int s6rc_livedir_canon (char const **) ; extern int s6rc_live_state_size (char const *, uint32_t *, uint32_t *) ; extern int s6rc_live_state_read (char const *, unsigned char *, uint32_t) ; +extern int s6rc_ls (char const *, stralloc *, genalloc *) ; extern int s6rc_type_check (int, char const *) ; extern int s6rc_nlto0 (char *, size_t, size_t, genalloc *) ; diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index a4bb8bd..87feaee 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -12,6 +12,7 @@ s6rc_livedir_create.o s6rc_livedir_prefix.o s6rc_livedir_prefixsize.o s6rc_lock.o +s6rc_ls.o s6rc_nlto0.o s6rc_read_uint.o s6rc_repo_badsub.o @@ -20,6 +21,7 @@ s6rc_repo_compile.o s6rc_repo_fillset.o s6rc_repo_fixset.o s6rc_repo_flattenservices.o +s6rc_repo_list_sets.o s6rc_repo_listalldeps.o s6rc_repo_listcontents.o s6rc_repo_listdeps.o @@ -37,6 +39,8 @@ s6rc_repo_subnames.o s6rc_repo_sv_bcmpr.o s6rc_repo_sv_cmpr.o s6rc_repo_sync.o +s6rc_repo_syncset.o +s6rc_repo_syncset_tmp.o s6rc_sanitize_dir.o s6rc_servicedir_internal.o s6rc_servicedir_block.o diff --git a/src/libs6rc/s6rc_ls.c b/src/libs6rc/s6rc_ls.c new file mode 100644 index 0000000..75f90f2 --- /dev/null +++ b/src/libs6rc/s6rc_ls.c @@ -0,0 +1,46 @@ +/* ISC license. */ + +#include <string.h> +#include <errno.h> + +#include <skalibs/direntry.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> + +#include <s6-rc/s6rc-utils.h> + +int s6rc_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) ; + if (!dir) 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_fix.c b/src/libs6rc/s6rc_repo_fix.c new file mode 100644 index 0000000..b379d30 --- /dev/null +++ b/src/libs6rc/s6rc_repo_fix.c @@ -0,0 +1,51 @@ +/* ISC license. */ + +#include <string.h> +#include <stdlib.h> +#include <errno.h> + +#include <skalibs/posixplz.h> +#include <skalibs/direntry.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> + +#include <s6-rc/repo.h> + +int s6rc_repo_fix (char const *repo, uint32_t options, unsigned int verbosity) +{ + stralloc sa = STRALLOC_ZERO ; + genalloc svlist = GENALLOC_ZERO ; /* s6rc_repo_sv */ + genalloc badga = GENALLOC_ZERO ; /* uint32_t */ + genalloc setind = GENALLOC_ZERO ; /* size_t */ + int n ; + + if (verbosity >= 3) + strerr_warni2x("checking set consistency in repository ", repo) ; + + n = s6rc_repo_list_sets(repo, &sa, &setind) ; + if (n < 0) + { + strerr_warnfu1sys("list sets") ; + return 0 ; + } + for (uint32_t i = 0 ; i < nsets ; i++) + { + if (verbosity >= 3) + strerr_warni2x("checking set ", sa.s + genalloc_s(size_t, &setind)[i]) ; + if (!s6rc_repo_fixset(repo, sa.s + genalloc_s(size_t, &setind)[i], options, verbosity, &sa, &svlist, &badga)) goto err ; + } + + genalloc_free(s6rc_repo_sv, &svlist) ; + genalloc_free(uint32_t, &badga) ; + genalloc_free(size_t, &setind) ; + stralloc_free(&sa) ; + return 1 ; + + err: + genalloc_free(s6rc_repo_sv, &svlist) ; + genalloc_free(uint32_t, &badga) ; + genalloc_free(size_t, &setind) ; + stralloc_free(&sa) ; + return 0 ; +} diff --git a/src/libs6rc/s6rc_repo_fixset.c b/src/libs6rc/s6rc_repo_fixset.c index efc6320..8ad64bc 100644 --- a/src/libs6rc/s6rc_repo_fixset.c +++ b/src/libs6rc/s6rc_repo_fixset.c @@ -5,7 +5,6 @@ #include <errno.h> #include <skalibs/posixplz.h> -#include <skalibs/direntry.h> #include <skalibs/strerr.h> #include <skalibs/stralloc.h> #include <skalibs/genalloc.h> diff --git a/src/libs6rc/s6rc_repo_list_sets.c b/src/libs6rc/s6rc_repo_list_sets.c new file mode 100644 index 0000000..99f2162 --- /dev/null +++ b/src/libs6rc/s6rc_repo_list_sets.c @@ -0,0 +1,15 @@ +/* ISC license. */ + +#include <string.h> + +#include <s6-rc/s6rc-utils.h> +#include <s6-rc/repo.h> + +int s6rc_repo_list_sets (char const *repo, stralloc *sa, genalloc *ga) +{ + size_t repolen = strlen(repo) ; + char fn[repolen + 9] ; + memcpy(fn, repo, repolen) ; + memcpy(fn + repolen, "/sources", 9) ; + return s6rc_ls(fn, sa, ga) ; +} diff --git a/src/libs6rc/s6rc_repo_listsub.c b/src/libs6rc/s6rc_repo_listsub.c index eef0a7c..eed5cb4 100644 --- a/src/libs6rc/s6rc_repo_listsub.c +++ b/src/libs6rc/s6rc_repo_listsub.c @@ -1,59 +1,20 @@ /* ISC license. */ #include <string.h> -#include <errno.h> - -#include <skalibs/direntry.h> -#include <skalibs/strerr.h> -#include <skalibs/stralloc.h> -#include <skalibs/genalloc.h> +#include <s6-rc/s6rc-utils.h> #include <s6-rc/repo.h> 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 ; + memcpy(fn + repolen + 9 + setlen, sub, sublen + 1) ; - 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 ; + return s6rc_ls(fn, sa, ga) ; } diff --git a/src/libs6rc/s6rc_repo_makesetbundles.c b/src/libs6rc/s6rc_repo_makesetbundles.c index 8fcf979..12d76b8 100644 --- a/src/libs6rc/s6rc_repo_makesetbundles.c +++ b/src/libs6rc/s6rc_repo_makesetbundles.c @@ -34,8 +34,12 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve memcpy(src + repolen + 10, ".bundles", 9) ; rm_rf_tmp(dst, &sa) ; - n = s6rc_repo_listsub(repo, set, "masked", &sa, &ga) ; - if (n < 0) goto err ; + n = s6rc_repo_listsub(repo, set, s6rc_repo_subnames[0], &sa, &ga) ; + if (n < 0) + { + strerr_warnfu6sys("list sub ", s6rc_repo_subnames[0], " of set ", set, " in repository ", repo) ; + goto err ; + } if (n) { DIR *dir ; diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c index cc4db03..8e5956b 100644 --- a/src/libs6rc/s6rc_repo_sync.c +++ b/src/libs6rc/s6rc_repo_sync.c @@ -8,6 +8,7 @@ #include <stdlib.h> #include <errno.h> +#include <skalibs/uint32.h> #include <skalibs/direntry.h> #include <skalibs/posixplz.h> #include <skalibs/strerr.h> @@ -27,98 +28,19 @@ static inline void cleanup (char const *ato, char const *bun) errno = e ; } -static int unlink_stales_in_sub (char const *repo, char const *set, char const *sub, uint32_t where, stralloc *sa, genalloc *ga, unsigned int verbosity) -{ - size_t repolen = strlen(repo) ; - size_t setlen = strlen(set) ; - size_t sublen = strlen(sub) ; - size_t subfnlen = repolen + setlen + sublen + 10 ; - char subfn[subfnlen + 1] ; - memcpy(subfn, repo, repolen) ; - memcpy(subfn + repolen, "/sources/", 9) ; - memcpy(subfn + repolen + 9, set, setlen) ; - subfn[repolen + 9 + setlen] = '/' ; - memcpy(subfn + repolen + 10 + setlen, sub, sublen + 1) ; - DIR *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[subfnlen + len + 2] ; - memcpy(fn, subfn, sublen) ; - fn[sublen] = '/' ; - memcpy(fn + sublen + 1, d->d_name, len+1) ; - if (access(fn, F_OK) == -1) - { - if (errno != ENOENT) - { - strerr_warnfu2sys("access ", fn) ; - goto err ; - } - unlink_void(fn) ; - if (verbosity >= 2) - strerr_warni6x("service ", d->d_name, " does not exist anymore, removed from sub ", sub, " of set ", set) ; - } - else - { - if (!genalloc_append(size_t, ga, &sa->len)) goto err ; - if (!stralloc_catb(sa, d->d_name, len+1)) goto err ; - } - } - if (errno) - { - strerr_warnfu2sys("readdir ", subfn) ; - goto err ; - } - - dir_close(dir) ; - return 1 ; - - err: - dir_close(dir) ; - return 0 ; -} - -static inline int s6rc_repo_syncset (char const *repo, size_t repolen, char const *set, stralloc *sa, genalloc *ga, unsigned int verbosity) -{ - for (unsigned int i = 0 ; i < 4 ; i++) - if (unlink_stales_in_sub(repo, set, s6rc_repo_subnames[i], i, sa, ga, verbosity)) goto err ; - - { - size_t n = genalloc_len(size_t, ga) ; - char const *stillhere[n + !n] ; - for (size_t i = 0 ; i < n ; i++) stillhere[i] = sa->s + genalloc_s(size_t, ga)[i] ; - if (!s6rc_repo_fillset(repo, set, stillhere, n)) goto err ; - } - - sa->len = 0 ; - genalloc_setlen(size_t, ga, 0) ; - return 1 ; - - err: - sa->len = 0 ; - genalloc_setlen(size_t, ga, 0) ; - return 0 ; -} - -int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sourceslen, unsigned int verbosity, char const *fdhuser) +int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuser) { size_t repolen = strlen(repo) ; + char store[repolen + 17] ; char ato[repolen + 26] ; char bun[repolen + 26] ; + memcpy(store, repo, repolen) ; + memcpy(store + repolen, "/stores/", 8) ; + store[repolen + 16] = 0 ; + - /* Fill new .atomics/ and .bundles/ with symlinks to real sources */ + /* Fill new .atomics/ and .bundles/ with symlinks to real stores */ memcpy(ato, repo, repolen) ; memcpy(ato + repolen, "/sources/..atomics:XXXXXX", 26) ; @@ -147,13 +69,15 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources return 0 ; } - for (size_t i = 0 ; i < sourceslen ; i++) + for (uint32_t istore = 0 ;; istore++) { - size_t srclen = strlen(sources[i]) ; - DIR *dir = opendir(sources[i]) ; + DIR *dir ; + uint320_xfmt(store + repolen + 8, istore, 8) ; + dir = opendir(store) ; if (!dir) { - strerr_warnfu2sys("opendir ", sources[i]) ; + if (errno == ENOENT) break ; + strerr_warnfu2sys("opendir ", store) ; goto err ; } for (;;) @@ -168,10 +92,11 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources { char const *x ; char dst[repolen + 28 + len] ; - char src[srclen + len + 2] ; - memcpy(src, sources[i], srclen) ; - src[srclen] = '/' ; - memcpy(src + srclen + 1, d->d_name, len+1) ; + char src[26 + len] ; + memcpy(src, "../../../stores/", 16) ; + memcpy(src + 16, store + repolen + 8, 8) ; + src[24] = '/' ; + memcpy(src + 25, d->d_name, len+1) ; switch (s6rc_type_check(-1, src)) { case 1 : @@ -215,13 +140,13 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources dir_close(dir) ; if (errno) { - strerr_warnfu2sys("readdir ", sources[i]) ; + strerr_warnfu2sys("readdir ", store) ; goto err ; } } - /* Compile the reference db - also checks new sources consistency */ + /* Compile the reference db - also checks consistency of new stores */ { char const *subs[2] = { ato + repolen + 9, bun + repolen + 9 } ; @@ -232,7 +157,7 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources } - /* Switch to the new sources, delete the old ones */ + /* Switch, delete links to old stores */ { char fn[repolen + 18] ; @@ -278,7 +203,7 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources d = readdir(dir) ; if (!d) break ; if (d->d_name[0] == '.') continue ; - if (!s6rc_repo_syncset(repo, repolen, d->d_name, &sa, &ga, verbosity)) break ; + if (!s6rc_repo_syncset_tmp(repo, d->d_name, &sa, &ga, verbosity)) break ; } dir_close(dir) ; genalloc_free(size_t, &ga) ; diff --git a/src/libs6rc/s6rc_repo_syncset.c b/src/libs6rc/s6rc_repo_syncset.c new file mode 100644 index 0000000..929d9c4 --- /dev/null +++ b/src/libs6rc/s6rc_repo_syncset.c @@ -0,0 +1,16 @@ +/* ISC license. */ + +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> + +#include <s6-rc/repo.h> + +int s6rc_repo_syncset (char const *repo, char const *set, unsigned int verbosity) +{ + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; /* size_t */ + int r = s6rc_repo_syncset_tmp(repo, set, &sa, &ga, verbosity) ; + genalloc_free(&size_t, &ga) ; + stralloc_free(&sa) ; + return r ; +} diff --git a/src/libs6rc/s6rc_repo_syncset_tmp.c b/src/libs6rc/s6rc_repo_syncset_tmp.c new file mode 100644 index 0000000..d9bb358 --- /dev/null +++ b/src/libs6rc/s6rc_repo_syncset_tmp.c @@ -0,0 +1,104 @@ +/* ISC license. */ + +#include <skalibs/nonposix.h> /* mkdtemp */ + +#include <string.h> +#include <stdint.h> +#include <unistd.h> +#include <errno.h> + +#include <skalibs/direntry.h> +#include <skalibs/posixplz.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> + +#include <s6-rc/s6rc-utils.h> +#include <s6-rc/repo.h> + +static int unlink_stales_in_sub (char const *repo, size_t repolen, char const *set, char const *sub, uint32_t where, stralloc *sa, genalloc *ga, unsigned int verbosity) +{ + size_t setlen = strlen(set) ; + size_t sublen = strlen(sub) ; + size_t subfnlen = repolen + setlen + sublen + 10 ; + char subfn[subfnlen + 1] ; + memcpy(subfn, repo, repolen) ; + memcpy(subfn + repolen, "/sources/", 9) ; + memcpy(subfn + repolen + 9, set, setlen) ; + subfn[repolen + 9 + setlen] = '/' ; + memcpy(subfn + repolen + 10 + setlen, sub, sublen + 1) ; + DIR *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[subfnlen + len + 2] ; + memcpy(fn, subfn, sublen) ; + fn[sublen] = '/' ; + memcpy(fn + sublen + 1, d->d_name, len+1) ; + if (access(fn, F_OK) == -1) + { + if (errno != ENOENT) + { + strerr_warnfu2sys("access ", fn) ; + goto err ; + } + unlink_void(fn) ; + if (verbosity >= 3) + strerr_warni6x("service ", d->d_name, " does not exist anymore, removed from sub ", sub, " of set ", set) ; + } + else + { + if (!genalloc_append(size_t, ga, &sa->len)) goto err ; + if (!stralloc_catb(sa, d->d_name, len+1)) goto err ; + } + } + if (errno) + { + strerr_warnfu2sys("readdir ", subfn) ; + goto err ; + } + + dir_close(dir) ; + return 1 ; + + err: + dir_close(dir) ; + return 0 ; +} + +int s6rc_repo_syncset_tmp (char const *repo, char const *set, stralloc *sa, genalloc *ga, unsigned int verbosity) +{ + size_t repolen = strlen(repo) ; + size_t sabase = sa->len ; + size_t gabase = genalloc_len(size_t, ga) ; + + for (unsigned int i = 0 ; i < 4 ; i++) + if (unlink_stales_in_sub(repo, repolen, set, s6rc_repo_subnames[i], i, sa, ga, verbosity)) goto err ; + + { + uint32_t n = genalloc_len(size_t, ga) ; + char const *stillhere[n + !n] ; + for (uint32_t i = 0 ; i < n ; i++) stillhere[i] = sa->s + genalloc_s(size_t, ga)[i] ; + if (!s6rc_repo_fillset(repo, set, stillhere, n)) goto err ; + } + + sa->len = sabase ; + genalloc_setlen(size_t, ga, gabase) ; + return 1 ; + + err: + sa->len = sabase ; + genalloc_setlen(size_t, ga, gabase) ; + return 0 ; +} diff --git a/src/repo/deps-exe/s6-rc-repo-sync b/src/repo/deps-exe/s6-rc-repo-sync new file mode 100644 index 0000000..6dd7af7 --- /dev/null +++ b/src/repo/deps-exe/s6-rc-repo-sync @@ -0,0 +1,3 @@ +${LIBS6RC} +-lskarnet +${SYSCLOCK_LIB} diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c index 971a00e..8c65203 100644 --- a/src/repo/s6-rc-repo-init.c +++ b/src/repo/s6-rc-repo-init.c @@ -9,6 +9,7 @@ #include <stdio.h> /* rename */ #include <errno.h> +#include <skalibs/uint32.h> #include <skalibs/stat.h> #include <skalibs/posixplz.h> #include <skalibs/gol.h> @@ -21,7 +22,7 @@ #include <s6-rc/config.h> #include <s6-rc/s6rc.h> -#define USAGE "s6-rc-repo-init [ -v verbosity ] [ -r repo ] [ -h fdhuser ] sources..." +#define USAGE "s6-rc-repo-init [ -v verbosity ] [ -r repo ] [ -h fdhuser ] [ -B ] [ -f ] stores..." #define dieusage() strerr_dieusage(100, USAGE) static void cleanup (char const *fn) @@ -33,12 +34,14 @@ static void cleanup (char const *fn) enum golb_e { - GOLB_FORCE = 0x01 + GOLB_FORCE = 0x01, + GOLB_BARE = 0x02 } ; static gol_bool const rgolb[] = { - { .so = 'f', .lo = "force", .clear = 0, .set = GOLB_FORCE } + { .so = 'f', .lo = "force", .clear = 0, .set = GOLB_FORCE }, + { .so = 'S', .lo = "bare", .clear = 0, .set = GOLB_BARE } } ; enum gola_e @@ -70,18 +73,22 @@ int main (int argc, char const *const *argv) golc = GOL_main(argc, argv, rgolb, rgola, &wgolb, wgola) ; argc -= golc ; argv += golc ; + if (!argc) dieusage() ; if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity)) strerr_dief1x(100, "verbosity needs to be an unsigned integer") ; for (unsigned int i = 0 ; i < argc ; i++) + { if (argv[i][0] != '/') strerr_dief2x(100, argv[i], " is not an absolute path") ; - if (!argc) strerr_warnw1x("no source directories given, creating an empty repository") ; + if (strchr(argv[i], '\n')) + strerr_dief1x(100, "stores cannot contain newlines in their path") ; + } tain_now_g() ; repolen = strlen(wgola[GOLA_REPODIR]) ; char repotmp[repolen + 12] ; - char tmp[repolen + 21] ; + char tmp[repolen + 29] ; memcpy(repotmp, wgola[GOLA_REPODIR], repolen) ; - memcpy(repotmp + repolen, "-tmp.XXXXXX", 12) ; + memcpy(repotmp + repolen, ":new:XXXXXX", 12) ; m = umask(0) ; if (!mkdtemp(repotmp)) { @@ -114,7 +121,24 @@ int main (int argc, char const *const *argv) strerr_diefu2sys(111, "mkdir ", tmp) ; } + memcpy(tmp + repolen + 12, "stores", 7) ; + if (mkdir(tmp, 02755) == -1) + { + cleanup(repotmp) ; + strerr_diefu2sys(111, "mkdir ", tmp) ; + } umask(m) ; + tmp[repolen + 19] = '/' ; + for (unsigned int i = 0 ; i < argc ; i++) + { + uint320_xfmt(tmp + repolen + 20, i, 8) ; + tmp[repolen + 28] = 0 ; + if (symlink(argv[i], tmp) == -1) + { + cleanup(repotmp) ; + strerr_diefu4sys(111, "make a symlink from ", tmp, " to ", argv[i]) ; + } + } memcpy(tmp + repolen + 12, "lock", 5) ; if (!openwritenclose_unsafe5(tmp, "", 0, 0, 0)) @@ -123,10 +147,10 @@ int main (int argc, char const *const *argv) strerr_diefu2sys(111, "create ", tmp) ; } - if (!s6rc_repo_sync(repotmp, argv, argc, verbosity, wgola[GOLA_FDHUSER])) + if (!(wgolb & GOLB_BARE) && !s6rc_repo_sync(repotmp, verbosity, wgola[GOLA_FDHUSER])) { cleanup(repotmp) ; - return 111 ; + _exit(111) ; } if (chmod(repotmp, 02755) == -1) @@ -161,5 +185,5 @@ int main (int argc, char const *const *argv) } } - return 0 ; + _exit(0) ; } diff --git a/src/repo/s6-rc-repo-sync.c b/src/repo/s6-rc-repo-sync.c new file mode 100644 index 0000000..f3768f7 --- /dev/null +++ b/src/repo/s6-rc-repo-sync.c @@ -0,0 +1,49 @@ +/* ISC license. */ + +#include <unistd.h> + +#include <skalibs/gol.h> +#include <skalibs/tai.h> +#include <skalibs/prog.h> +#include <skalibs/strerr.h> + +#include <s6-rc/config.h> +#include <s6-rc/s6rc.h> + +#define USAGE "s6-rc-repo-sync [ -v verbosity ] [ -r repo ] [ -h fdhuser ]" +#define dieusage() strerr_dieusage(100, USAGE) + +enum gola_e +{ + GOLA_VERBOSITY, + GOLA_REPODIR, + GOLA_FDHUSER, + GOLA_N +} ; + +static gol_arg const rgola[] = +{ + { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY }, + { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR }, + { .so = 'h', .lo = "fd-holder-user", .i = GOLA_FDHUSER } +} ; + +int main (int argc, char const *const *argv) +{ + char const *wgola[GOLA_N] = { 0 } ; + unsigned int verbosity = 1 ; + unsigned int golc ; + + PROG = "s6-rc-repo-sync" ; + wgola[GOLA_REPODIR] = S6RC_REPO_BASE ; + + golc = gol_main(argc, argv, 0, 0, rgola, 3, 0, wgola) ; + argc -= golc ; argv += golc ; + if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity)) + strerr_dief1x(100, "verbosity needs to be an unsigned integer") ; + tain_now_g() ; + + if (!s6rc_repo_sync(wgola[GOLA_REPODIR], verbosity, wgola[GOLA_FDHUSER])) _exit(111) ; + + _exit(0) ; +} |
