diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-15 23:15:06 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-15 23:15:06 +0000 |
| commit | d6d77527fa55d59e47b8e8fa301ab004894bc467 (patch) | |
| tree | 505eb5ffd60fb9136fdddfa14e92a8f6f81375e2 | |
| parent | 094f6e3d0284f0ee97615e4433a100208668698a (diff) | |
| download | s6-rc-d6d77527fa55d59e47b8e8fa301ab004894bc467.tar.gz | |
Add s6-rc-set-changestate. FINALLY.
| -rw-r--r-- | package/deps.mak | 23 | ||||
| -rw-r--r-- | package/modes | 1 | ||||
| -rw-r--r-- | package/targets.mak | 1 | ||||
| -rwxr-xr-x | s6-rc-set-changestate | bin | 0 -> 42248 bytes | |||
| -rw-r--r-- | src/include/s6-rc/repo.h | 7 | ||||
| -rw-r--r-- | src/libs6rc/deps-lib/s6rc | 3 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_badsub.c | 22 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makesvlist.c | 12 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_moveservices.c | 25 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sv_bcmpr.c | 13 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sv_cmp.c | 11 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sv_cmpr.c | 11 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-repo-init | 1 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-set-changestate | 3 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-set-copy | 1 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-set-delete | 1 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-set-new | 1 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-changestate.c | 204 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-enable.c | 132 |
19 files changed, 282 insertions, 190 deletions
diff --git a/package/deps.mak b/package/deps.mak index 932f400..eaee1b0 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -37,7 +37,8 @@ src/libs6rc/s6rc_repo_moveservices.o src/libs6rc/s6rc_repo_moveservices.lo: src/ src/libs6rc/s6rc_repo_refcompile.o src/libs6rc/s6rc_repo_refcompile.lo: src/libs6rc/s6rc_repo_refcompile.c src/include/s6-rc/repo.h src/libs6rc/s6rc_repo_setcompile.o src/libs6rc/s6rc_repo_setcompile.lo: src/libs6rc/s6rc_repo_setcompile.c src/include/s6-rc/repo.h src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_subnames.lo: src/libs6rc/s6rc_repo_subnames.c src/include/s6-rc/repo.h -src/libs6rc/s6rc_repo_sv_cmp.o src/libs6rc/s6rc_repo_sv_cmp.lo: src/libs6rc/s6rc_repo_sv_cmp.c src/include/s6-rc/repo.h +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_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 @@ -50,9 +51,9 @@ 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-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-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 src/repo/s6-rc-set-delete.o src/repo/s6-rc-set-delete.lo: src/repo/s6-rc-set-delete.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h -src/repo/s6-rc-set-enable.o src/repo/s6-rc-set-enable.lo: src/repo/s6-rc-set-enable.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/repo/s6-rc-set-new.o src/repo/s6-rc-set-new.lo: src/repo/s6-rc-set-new.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/s6-rc/s6-rc-bundle.o src/s6-rc/s6-rc-bundle.lo: src/s6-rc/s6-rc-bundle.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/s6-rc/s6-rc-compile.o src/s6-rc/s6-rc-compile.lo: src/s6-rc/s6-rc-compile.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h @@ -66,22 +67,24 @@ src/s6-rc/s6-rc-update.o src/s6-rc/s6-rc-update.lo: src/s6-rc/s6-rc-update.c src src/s6-rc/s6-rc.o src/s6-rc/s6-rc.lo: src/s6-rc/s6-rc.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),) -libs6rc.a.xyzzy: src/libs6rc/s6rc_db_check_depcycles.o src/libs6rc/s6rc_db_check_pipelines.o src/libs6rc/s6rc_db_check_revdeps.o src/libs6rc/s6rc_db_read.o src/libs6rc/s6rc_db_read_sizes.o src/libs6rc/s6rc_db_read_uint32.o src/libs6rc/s6rc_graph_closure.o src/libs6rc/s6rc_live_state_size.o src/libs6rc/s6rc_live_state_read.o src/libs6rc/s6rc_livedir_canon.o src/libs6rc/s6rc_livedir_create.o src/libs6rc/s6rc_livedir_prefix.o src/libs6rc/s6rc_livedir_prefixsize.o src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_read_uint.o src/libs6rc/s6rc_repo_badsub.o src/libs6rc/s6rc_repo_cleanup.o src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_fillset.o src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listcontents.o src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_makesetbundles.o src/libs6rc/s6rc_repo_makesvlist.o src/libs6rc/s6rc_repo_moveservices.o src/libs6rc/s6rc_repo_refcompile.o src/libs6rc/s6rc_repo_setcompile.o src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_sv_cmp.o src/libs6rc/s6rc_repo_sync.o src/libs6rc/s6rc_sanitize_dir.o src/libs6rc/s6rc_servicedir_internal.o src/libs6rc/s6rc_servicedir_block.o src/libs6rc/s6rc_servicedir_unblock.o src/libs6rc/s6rc_servicedir_copy_offline.o src/libs6rc/s6rc_servicedir_copy_online.o src/libs6rc/s6rc_servicedir_manage.o src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_strrefcmp.o src/libs6rc/s6rc_type_check.o +libs6rc.a.xyzzy: src/libs6rc/s6rc_db_check_depcycles.o src/libs6rc/s6rc_db_check_pipelines.o src/libs6rc/s6rc_db_check_revdeps.o src/libs6rc/s6rc_db_read.o src/libs6rc/s6rc_db_read_sizes.o src/libs6rc/s6rc_db_read_uint32.o src/libs6rc/s6rc_graph_closure.o src/libs6rc/s6rc_live_state_size.o src/libs6rc/s6rc_live_state_read.o src/libs6rc/s6rc_livedir_canon.o src/libs6rc/s6rc_livedir_create.o src/libs6rc/s6rc_livedir_prefix.o src/libs6rc/s6rc_livedir_prefixsize.o src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_read_uint.o src/libs6rc/s6rc_repo_badsub.o src/libs6rc/s6rc_repo_cleanup.o src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_fillset.o src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listcontents.o src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_makesetbundles.o src/libs6rc/s6rc_repo_makesvlist.o src/libs6rc/s6rc_repo_moveservices.o src/libs6rc/s6rc_repo_refcompile.o src/libs6rc/s6rc_repo_setcompile.o src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_sv_bcmpr.o src/libs6rc/s6rc_repo_sv_cmpr.o src/libs6rc/s6rc_repo_sync.o src/libs6rc/s6rc_sanitize_dir.o src/libs6rc/s6rc_servicedir_internal.o src/libs6rc/s6rc_servicedir_block.o src/libs6rc/s6rc_servicedir_unblock.o src/libs6rc/s6rc_servicedir_copy_offline.o src/libs6rc/s6rc_servicedir_copy_online.o src/libs6rc/s6rc_servicedir_manage.o src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_strrefcmp.o src/libs6rc/s6rc_type_check.o else -libs6rc.a.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_cmp.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo +libs6rc.a.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo endif libs6rc.pc: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB} libs6rc.so.xyzzy: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB} -libs6rc.so.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_cmp.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo +libs6rc.so.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo libs6rc.dylib.xyzzy: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB} -libs6rc.dylib.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_cmp.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo -s6-rc-repo-init: EXTRA_LIBS := +libs6rc.dylib.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo +s6-rc-repo-init: EXTRA_LIBS := ${SYSCLOCK_LIB} s6-rc-repo-init: src/repo/s6-rc-repo-init.o ${LIBS6RC} -lskarnet -s6-rc-set-copy: EXTRA_LIBS := +s6-rc-set-changestate: EXTRA_LIBS := ${SYSCLOCK_LIB} +s6-rc-set-changestate: src/repo/s6-rc-set-changestate.o ${LIBS6RC} -lskarnet +s6-rc-set-copy: EXTRA_LIBS := ${SYSCLOCK_LIB} s6-rc-set-copy: src/repo/s6-rc-set-copy.o ${LIBS6RC} -lskarnet -s6-rc-set-delete: EXTRA_LIBS := +s6-rc-set-delete: EXTRA_LIBS := ${SYSCLOCK_LIB} s6-rc-set-delete: src/repo/s6-rc-set-delete.o ${LIBS6RC} -lskarnet -s6-rc-set-new: EXTRA_LIBS := +s6-rc-set-new: EXTRA_LIBS := ${SYSCLOCK_LIB} s6-rc-set-new: src/repo/s6-rc-set-new.o ${LIBS6RC} -lskarnet s6-rc: EXTRA_LIBS := ${SYSCLOCK_LIB} ${SPAWN_LIB} s6-rc: src/s6-rc/s6-rc.o ${LIBS6RC} -ls6 -lskarnet diff --git a/package/modes b/package/modes index 9e0d85e..c4a936f 100644 --- a/package/modes +++ b/package/modes @@ -12,3 +12,4 @@ s6-rc-repo-init 0755 s6-rc-set-new 0755 s6-rc-set-copy 0755 s6-rc-set-delete 0755 +s6-rc-set-changestate 0755 diff --git a/package/targets.mak b/package/targets.mak index df32529..072c69c 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -11,6 +11,7 @@ s6-rc-repo-init \ s6-rc-set-new \ s6-rc-set-copy \ s6-rc-set-delete \ +s6-rc-set-changestate \ LIBEXEC_TARGETS := \ s6-rc-fdholder-filler \ diff --git a/s6-rc-set-changestate b/s6-rc-set-changestate Binary files differnew file mode 100755 index 0000000..e282a84 --- /dev/null +++ b/s6-rc-set-changestate diff --git a/src/include/s6-rc/repo.h b/src/include/s6-rc/repo.h index c179971..640e57f 100644 --- a/src/include/s6-rc/repo.h +++ b/src/include/s6-rc/repo.h @@ -16,7 +16,8 @@ struct s6rc_repo_sv_s uint8_t sub ; } ; -extern int s6rc_repo_sv_cmp (void const *, void const *, void *) ; +extern int s6rc_repo_sv_cmpr (void const *, void const *, void *) ; +extern int s6rc_repo_sv_bcmpr (void const *a, void const *b, void *aux) ; extern char const s6rc_repo_subnames[4][7] ; @@ -41,7 +42,7 @@ extern int s6rc_repo_listalldeps (char const *, char const *const *, size_t, str extern int s6rc_repo_listdeps_internal (char const *, char const *const *, size_t, stralloc *, genalloc *, uint32_t) ; extern int s6rc_repo_makesvlist (char const *, char const *, stralloc *, genalloc *) ; -extern int s6rc_repo_badsub (char const *, char const *, char const **, size_t, uint8_t, s6rc_repo_sv const *, size_t, stralloc *, genalloc *) ; -extern int s6rc_repo_moveservices (char const *, char const *, char const *const *, size_t, uint8_t, uint8_t, unsigned int) ; +extern int s6rc_repo_badsub (char const *, char const *, char const **, uint32_t, uint8_t, s6rc_repo_sv const *, uint32_t, stralloc *, genalloc *) ; +extern int s6rc_repo_moveservices (char const *, char const *, s6rc_repo_sv const *, uint32_t, uint8_t, char const *, unsigned int) ; #endif diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index 79ccc20..a155e34 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -31,7 +31,8 @@ s6rc_repo_moveservices.o s6rc_repo_refcompile.o s6rc_repo_setcompile.o s6rc_repo_subnames.o -s6rc_repo_sv_cmp.o +s6rc_repo_sv_bcmpr.o +s6rc_repo_sv_cmpr.o s6rc_repo_sync.o s6rc_sanitize_dir.o s6rc_servicedir_internal.o diff --git a/src/libs6rc/s6rc_repo_badsub.c b/src/libs6rc/s6rc_repo_badsub.c index cba02b8..1848870 100644 --- a/src/libs6rc/s6rc_repo_badsub.c +++ b/src/libs6rc/s6rc_repo_badsub.c @@ -13,22 +13,12 @@ #include <s6-rc/repo.h> -static int s6rc_repo_sv_bcmpr (void const *a, void const *b, void *aux) -{ - char const *key = a ; - s6rc_repo_sv const *elem = b ; - stralloc *sa = aux ; - return strcmp(key, sa->s + elem->pos) ; -} - static int strqcmp (void const *a, void const *b) { - char const *const *aa = a ; - char const *const *bb = b ; - return strcmp(*aa, *bb) ; + return strcmp(*(char const *const *)a, *(char const *const *)b) ; } -int s6rc_repo_badsub (char const *repo, char const *set, char const **services, size_t n, uint8_t newsub, s6rc_repo_sv const *svlist, size_t nlist, stralloc *sa, genalloc *badga) +int s6rc_repo_badsub (char const *repo, char const *set, char const **services, uint32_t n, uint8_t newsub, s6rc_repo_sv const *svlist, uint32_t ntot, stralloc *sa, genalloc *badga) { int sawasnull = !!sa->s ; size_t sabase = sa->len ; @@ -43,12 +33,12 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services, fulln = genalloc_len(size_t, &fulldeps) ; ind = genalloc_s(size_t, &fulldeps) ; - for (size_t i = 0 ; i < fulln ; i++) + for (uint32_t i = 0 ; i < fulln ; i++) { s6rc_repo_sv *p ; char const *cur = sa->s + ind[i] ; if (bsearch(&cur, services, n, sizeof(char const *), &strqcmp)) continue ; - p = bsearchr(cur, svlist, nlist, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, sa) ; + p = bsearchr(cur, svlist, ntot, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, sa->s) ; if (!p) { strerr_warnfu6x("find service ", cur, " in set ", set, " of repository ", repo) ; @@ -56,8 +46,8 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services, } if (newsub >= 2 ? p->sub < newsub : p->sub > newsub) { - uint32_t n = p - svlist ; - if (!genalloc_append(uint32_t, badga, &n)) + uint32_t k = p - svlist ; + if (!genalloc_append(uint32_t, badga, &k)) { strerr_warnfu1sys("make bad sub list") ; goto err ; diff --git a/src/libs6rc/s6rc_repo_makesvlist.c b/src/libs6rc/s6rc_repo_makesvlist.c index 9cf0faa..3567bf7 100644 --- a/src/libs6rc/s6rc_repo_makesvlist.c +++ b/src/libs6rc/s6rc_repo_makesvlist.c @@ -12,8 +12,6 @@ #include <s6-rc/repo.h> -#define dienomem() strerr_diefu1sys(111, "stralloc_catb") - static inline int s6rc_repo_addsub (char const *sub, uint8_t i, stralloc *sa, genalloc *ga) { DIR *dir = opendir(sub) ; @@ -27,12 +25,16 @@ static inline int s6rc_repo_addsub (char const *sub, uint8_t i, stralloc *sa, ge if (!d) break ; if (d->d_name[0] == '.') continue ; - if (!stralloc_cats(sa, d->d_name) || !stralloc_0(sa)) dienomem() ; - if (!genalloc_append(s6rc_repo_sv, ga, &sv)) dienomem() ; + if (!stralloc_cats(sa, d->d_name) || !stralloc_0(sa) + || !genalloc_append(s6rc_repo_sv, ga, &sv)) goto nomem ; } dir_close(dir) ; if (errno) { strerr_warnfu2sys("readdir ", sub) ; return 0 ; } return 1 ; + + nomem: + strerr_warnfu1sys("stralloc_catb") ; + return 0 ; } int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genalloc *ga) @@ -54,7 +56,7 @@ int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genal memcpy(subfn + repolen + setlen + 10, s6rc_repo_subnames[i], 7) ; if (!s6rc_repo_addsub(subfn, i, sa, ga)) goto err ; } - qsortr(genalloc_s(s6rc_repo_sv, ga), genalloc_len(s6rc_repo_sv, ga), sizeof(s6rc_repo_sv), &s6rc_repo_sv_cmp, sa) ; + qsortr(genalloc_s(s6rc_repo_sv, ga), genalloc_len(s6rc_repo_sv, ga), sizeof(s6rc_repo_sv), &s6rc_repo_sv_cmpr, sa->s) ; return 1 ; err: diff --git a/src/libs6rc/s6rc_repo_moveservices.c b/src/libs6rc/s6rc_repo_moveservices.c index fb4bf9f..3cc3b92 100644 --- a/src/libs6rc/s6rc_repo_moveservices.c +++ b/src/libs6rc/s6rc_repo_moveservices.c @@ -9,14 +9,14 @@ #include <s6-rc/repo.h> -int s6rc_repo_moveservices (char const *repo, char const *set, char const *const *services, size_t n, uint8_t oldsub, uint8_t newsub, unsigned int verbosity) +int s6rc_repo_moveservices (char const *repo, char const *set, s6rc_repo_sv const *services, uint32_t n, uint8_t newsub, char const *storage, unsigned int verbosity) { size_t repolen = strlen(repo) ; size_t setlen = strlen(set) ; size_t maxserviceslen = 0 ; - for (size_t i = 0 ; i < n ; i++) + for (uint32_t i = 0 ; i < n ; i++) { - size_t len = strlen(services[i]) ; + size_t len = strlen(storage + services[i].pos) ; if (len > maxserviceslen) maxserviceslen = len ; } char oldfn[repolen + setlen + maxserviceslen + 18] ; @@ -25,20 +25,21 @@ int s6rc_repo_moveservices (char const *repo, char const *set, char const *const memcpy(oldfn + repolen, "/sources/", 9) ; memcpy(oldfn + repolen + 9, set, setlen) ; oldfn[repolen + 9 + setlen] = '/' ; - memcpy(oldfn + repolen + 10 + setlen, s6rc_repo_subnames[oldsub], 6) ; oldfn[repolen + 16 + setlen] = '/' ; - memcpy(newfn, oldfn, repolen + 17 + setlen) ; + memcpy(newfn, oldfn, repolen + 10 + setlen) ; memcpy(newfn + repolen + 10 + setlen, s6rc_repo_subnames[newsub], 6) ; + newfn[repolen + 16 + setlen] = '/' ; - for (size_t i = 0 ; i < n ; i++) + for (uint32_t i = 0 ; i < n ; i++) { - size_t len = strlen(services[i]) ; - memcpy(oldfn + repolen + setlen + 17, services[i], len + 1) ; - memcpy(newfn + repolen + setlen + 17, services[i], len + 1) ; + size_t len = strlen(storage + services[i].pos) ; + memcpy(oldfn + repolen + 10, s6rc_repo_subnames[services[i].sub], 6) ; + memcpy(oldfn + repolen + setlen + 17, storage + services[i].pos, len + 1) ; + memcpy(newfn + repolen + setlen + 17, storage + services[i].pos, len + 1) ; if (access(newfn, F_OK) == 0) { if (verbosity >= 2) - strerr_warni8x("service ", services[i], " already existed in subset ", s6rc_repo_subnames[newsub], " of set ", set, " in repository ", repo) ; + strerr_warni8x("service ", storage + services[i].pos, " already existed in subset ", s6rc_repo_subnames[newsub], " of set ", set, " in repository ", repo) ; } else if (errno != ENOENT) { @@ -50,9 +51,9 @@ int s6rc_repo_moveservices (char const *repo, char const *set, char const *const strerr_warnfu4sys("rename ", oldfn, " to ", newfn) ; return 0 ; } - if (verbosity >= 3) + if (verbosity >= 4) { - strerr_warnt10x("repository ", repo, ", set ", set, ", from subset ", s6rc_repo_subnames[oldsub], " to subset ", s6rc_repo_subnames[newsub], ": successfully moved service ", services[i]) ; + strerr_warnt10x("repository ", repo, ", set ", set, ", from subset ", s6rc_repo_subnames[services[i].sub], " to subset ", s6rc_repo_subnames[newsub], ": successfully moved service ", storage + services[i].pos) ; } } return 1 ; diff --git a/src/libs6rc/s6rc_repo_sv_bcmpr.c b/src/libs6rc/s6rc_repo_sv_bcmpr.c new file mode 100644 index 0000000..bcc4d80 --- /dev/null +++ b/src/libs6rc/s6rc_repo_sv_bcmpr.c @@ -0,0 +1,13 @@ +/* ISC license. */ + +#include <string.h> + +#include <s6-rc/repo.h> + +int s6rc_repo_sv_bcmpr (void const *a, void const *b, void *aux) +{ + char const *key = a ; + s6rc_repo_sv const *elem = b ; + char const *s = aux ; + return strcmp(key, s + elem->pos) ; +} diff --git a/src/libs6rc/s6rc_repo_sv_cmp.c b/src/libs6rc/s6rc_repo_sv_cmp.c deleted file mode 100644 index 472e472..0000000 --- a/src/libs6rc/s6rc_repo_sv_cmp.c +++ /dev/null @@ -1,11 +0,0 @@ -/* ISC license. */ - -#include <s6-rc/repo.h> - -int s6rc_repo_sv_cmp (void const *a, void const *b, void *aux) -{ - s6rc_repo_sv const *aa = a ; - s6rc_repo_sv const *bb = b ; - stralloc *sa = aux ; - return strcmp(sa->s + aa->pos, sa->s + bb->pos) ; -} diff --git a/src/libs6rc/s6rc_repo_sv_cmpr.c b/src/libs6rc/s6rc_repo_sv_cmpr.c new file mode 100644 index 0000000..80b07c9 --- /dev/null +++ b/src/libs6rc/s6rc_repo_sv_cmpr.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include <s6-rc/repo.h> + +int s6rc_repo_sv_cmpr (void const *a, void const *b, void *aux) +{ + s6rc_repo_sv const *aa = a ; + s6rc_repo_sv const *bb = b ; + char const *s = aux ; + return strcmp(s + aa->pos, s + bb->pos) ; +} diff --git a/src/repo/deps-exe/s6-rc-repo-init b/src/repo/deps-exe/s6-rc-repo-init index 152b051..6dd7af7 100644 --- a/src/repo/deps-exe/s6-rc-repo-init +++ b/src/repo/deps-exe/s6-rc-repo-init @@ -1,2 +1,3 @@ ${LIBS6RC} -lskarnet +${SYSCLOCK_LIB} diff --git a/src/repo/deps-exe/s6-rc-set-changestate b/src/repo/deps-exe/s6-rc-set-changestate new file mode 100644 index 0000000..6dd7af7 --- /dev/null +++ b/src/repo/deps-exe/s6-rc-set-changestate @@ -0,0 +1,3 @@ +${LIBS6RC} +-lskarnet +${SYSCLOCK_LIB} diff --git a/src/repo/deps-exe/s6-rc-set-copy b/src/repo/deps-exe/s6-rc-set-copy index 152b051..6dd7af7 100644 --- a/src/repo/deps-exe/s6-rc-set-copy +++ b/src/repo/deps-exe/s6-rc-set-copy @@ -1,2 +1,3 @@ ${LIBS6RC} -lskarnet +${SYSCLOCK_LIB} diff --git a/src/repo/deps-exe/s6-rc-set-delete b/src/repo/deps-exe/s6-rc-set-delete index 152b051..6dd7af7 100644 --- a/src/repo/deps-exe/s6-rc-set-delete +++ b/src/repo/deps-exe/s6-rc-set-delete @@ -1,2 +1,3 @@ ${LIBS6RC} -lskarnet +${SYSCLOCK_LIB} diff --git a/src/repo/deps-exe/s6-rc-set-new b/src/repo/deps-exe/s6-rc-set-new index 152b051..6dd7af7 100644 --- a/src/repo/deps-exe/s6-rc-set-new +++ b/src/repo/deps-exe/s6-rc-set-new @@ -1,2 +1,3 @@ ${LIBS6RC} -lskarnet +${SYSCLOCK_LIB} diff --git a/src/repo/s6-rc-set-changestate.c b/src/repo/s6-rc-set-changestate.c new file mode 100644 index 0000000..89cdea8 --- /dev/null +++ b/src/repo/s6-rc-set-changestate.c @@ -0,0 +1,204 @@ +/* ISC license. */ + +#include <string.h> +#include <unistd.h> +#include <stdlib.h> +#include <errno.h> + +#include <skalibs/uint64.h> +#include <skalibs/posixplz.h> +#include <skalibs/prog.h> +#include <skalibs/strerr.h> +#include <skalibs/gol.h> +#include <skalibs/tai.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> +#include <skalibs/djbunix.h> + +#include <s6-rc/config.h> +#include <s6-rc/s6rc.h> + +#define USAGE "s6-rc-set-changestate [ -v verbosity ] [ -F forcelevel ] [ -r repo ] [ -3 ] set newstate services..." +#define dieusage() strerr_dieusage(100, USAGE) + +enum golb_e +{ + GOLB_FORCE_ESSENTIAL = 0x01, + GOLB_IGNORE_DEPENDENCIES = 0x02, + GOLB_DRYRUN = 0x04 +} ; + +enum gola_e +{ + GOLA_VERBOSITY, + GOLA_REPODIR, + GOLA_FORCELEVEL, + GOLA_N +} ; + +struct subname_s +{ + char const *name ; + uint8_t sub ; +} ; + +static gol_bool const rgolb[] = +{ + { .so = '3', .lo = "force-essential", .clear = 0, .set = GOLB_FORCE_ESSENTIAL }, + { .so = 'f', .lo = "ignore-dependencies", .clear = 0, .set = GOLB_IGNORE_DEPENDENCIES }, + { .so = 'n', .lo = "dry-run", .clear = 0, .set = GOLB_DRYRUN } +} ; + +static gol_arg const rgola[] = +{ + { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY }, + { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR }, + { .so = 'I', .lo = "if-dependencies-found", .i = GOLA_FORCELEVEL } +} ; + +static struct subname_s const accepted_forcelevels[] = +{ + { .name = "fail", .sub = 0 }, + { .name = "pull", .sub = 2 }, + { .name = "warn", .sub = 1 } +} ; + +static uint64_t wgolb = 0 ; + +static struct subname_s const accepted_subs[] = +{ + { .name = "active", .sub = 1 }, + { .name = "always", .sub = 3 }, + { .name = "disable", .sub = 1 }, + { .name = "disabled", .sub = 1 }, + { .name = "enable", .sub = 2 }, + { .name = "enabled", .sub = 2 }, + { .name = "essential", .sub = 3 }, + { .name = "mask", .sub = 0 }, + { .name = "masked", .sub = 0 }, + { .name = "onboot", .sub = 2 }, + { .name = "unmask", .sub = 1 }, + { .name = "unmasked", .sub = 1 } +} ; + +static int subname_cmp (void const *a, void const *b) +{ + return strcmp((char const *)a, ((struct subname_s const *)b)->name) ; +} + +int main (int argc, char const *const *argv) +{ + stralloc storage = STRALLOC_ZERO ; + genalloc svlist = GENALLOC_ZERO ; /* s6rc_repo_sv */ + char const *repo = S6RC_REPO_BASE ; + int fdlock ; + unsigned int verbosity = 1 ; + unsigned int forcelevel = 1 ; + char const *wgola[3] = { 0 } ; + unsigned int golc ; + struct subname_s *newsub ; + size_t max = 0, m = 0 ; + s6rc_repo_sv *list ; + uint32_t listn ; + + PROG = "s6-rc-set-changestate" ; + golc = gol_main(argc, argv, rgolb, 1, rgola, 2, &wgolb, 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") ; + if (wgola[GOLA_FORCELEVEL]) + { + struct subname_s *p = bsearch(wgola[GOLA_FORCELEVEL], accepted_forcelevels, sizeof(accepted_forcelevels)/sizeof(struct subname_s), sizeof(struct subname_s), &subname_cmp) ; + if (!p) strerr_dief1x(100, "if-dependencies-found needs to be fail, warn or pull") ; + forcelevel = p->sub ; + } + if (wgola[GOLA_REPODIR]) repo = wgola[GOLA_REPODIR] ; + if (argc < 3) dieusage() ; + if (strchr(argv[0], '/') || strchr(argv[0], '\n')) + strerr_dief1x(100, "set names cannot contain / or newlines") ; + + newsub = bsearch(argv[1], accepted_subs, sizeof(accepted_subs)/sizeof(struct subname_s), sizeof(struct subname_s), &subname_cmp) ; + if (!newsub) strerr_dief2x(100, "unrecognized state change directive:", argv[1]) ; + if (newsub->sub == 3 && !(wgolb & GOLB_FORCE_ESSENTIAL)) + strerr_dief1x(100, " artificially mark a service as essential without --force-essential") ; + + fdlock = s6rc_repo_lock(repo, 1) ; + if (fdlock == -1) strerr_diefu2sys(111, "lock ", repo) ; + tain_now_g() ; + + if (!s6rc_repo_makesvlist(repo, argv[0], &storage, &svlist)) _exit(111) ; + list = genalloc_s(s6rc_repo_sv, &svlist) ; + listn = genalloc_len(s6rc_repo_sv, &svlist) ; + + s6rc_repo_sv starting[argc - 2] ; + uint32_t ind[argc - 2] ; + + for (unsigned int i = 0 ; i < argc - 2 ; i++) + { + s6rc_repo_sv *p = bsearchr(argv[2+i], list, listn, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, storage.s) ; + if (!p) strerr_dief6x(100, "unknown service ", argv[2+i], " in set ", argv[0], " of repository ", repo) ; + starting[i] = *p ; + ind[i] = p - list ; + max += strlen(argv[2+i]) + 1 ; + } + + if (!(wgolb & GOLB_IGNORE_DEPENDENCIES)) + { + genalloc badga = GENALLOC_ZERO ; /* uint32_t */ + char const *tmpstart[argc - 2] ; + char tmpstore[max] ; + + for (unsigned int i = 0 ; i < argc - 2 ; i++) + { + size_t len ; + list[ind[i]].sub = newsub->sub ; + tmpstart[i] = tmpstore + m ; + len = strlen(storage.s + list[ind[i]].pos) + 1 ; + memcpy(tmpstore + m, storage.s + list[ind[i]].pos, len) ; + m += len ; + } + + if (!s6rc_repo_badsub(repo, argv[0], tmpstart, argc - 2, newsub->sub, list, listn, &storage, &badga)) _exit(111) ; + if (genalloc_len(uint32_t, &badga)) + { + uint32_t const *bads = genalloc_s(uint32_t, &badga) ; + unsigned int badn = genalloc_len(uint32_t, &badga) ; + if (verbosity) + { + char const *arg[10 + (badn << 1)] ; + arg[0] = PROG ; + arg[1] = ": " ; + arg[2] = !forcelevel ? "fatal" : "warning" ; + arg[3] = ": the following services (" ; + arg[4] = newsub->sub >= 2 ? "dependencies of" : "depending on" ; + arg[5] = " the ones given as arguments) " ; + arg[6] = forcelevel == 2 ? "are also being" : "also need to be" ; + arg[7] = " changed to \"" ; + arg[8] = s6rc_repo_subnames[newsub->sub] ; + arg[9] = "\": " ; + for (unsigned int i = 0 ; i < badn ; i++) + { + arg[10 + (i << 1)] = storage.s + list[bads[i]].pos ; + arg[11 + (i << 1)] = i < badn ? " " : "" ; + } + strerr_warnv(arg, 10 + (badn << 1)) ; + } + if (!forcelevel) _exit(1) ; + if (wgolb & GOLB_DRYRUN) _exit(0) ; + if (forcelevel == 2) + { + s6rc_repo_sv full[argc - 2 + badn] ; + for (unsigned int i = 0 ; i < argc - 2 ; i++) full[i] = starting[i] ; + for (unsigned int i = 0 ; i < badn ; i++) full[argc - 2 + i] = list[bads[i]] ; + if (!s6rc_repo_moveservices(repo, argv[0], full, argc - 2 + badn, newsub->sub, storage.s, verbosity)) _exit(111) ; + _exit(0) ; + } + } + } + + if (!(wgolb & GOLB_DRYRUN)) + { + if (!s6rc_repo_moveservices(repo, argv[0], starting, argc - 2, newsub->sub, storage.s, verbosity)) _exit(111) ; + } + _exit(0) ; +} diff --git a/src/repo/s6-rc-set-enable.c b/src/repo/s6-rc-set-enable.c deleted file mode 100644 index 202ac9e..0000000 --- a/src/repo/s6-rc-set-enable.c +++ /dev/null @@ -1,132 +0,0 @@ -/* ISC license. */ - -#include <string.h> -#include <unistd.h> -#include <errno.h> - -#include <skalibs/uint64.h> -#include <skalibs/posixplz.h> -#include <skalibs/prog.h> -#include <skalibs/strerr.h> -#include <skalibs/gol.h> -#include <skalibs/tai.h> -#include <skalibs/djbunix.h> -#include <skalibs/unix-transactional.h> - -#include <s6-rc/config.h> -#include <s6-rc/s6rc.h> - -#define USAGE "s6-rc-set-copy [ -v verbosity ] [ -r repo ] [ -f ] srcset dstset" -#define dieusage() strerr_dieusage(100, USAGE) - -enum golb_e -{ - GOLB_FORCE, - GOLB_N -} ; - -enum gola_e -{ - GOLA_VERBOSITY, - GOLA_REPODIR, - GOLA_N -} ; - -static gol_bool const rgolb[1] = -{ - { .so = 'f', .lo = "force", .clear = 0, .set = 1 << GOLB_FORCE } -} ; - -static gol_arg const rgola[2] = -{ - { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY }, - { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR } -} ; - - -static uint64_t wgolb = 0 ; - -static void cleanup (char const *fn) -{ - int e = errno ; - rm_rf(fn) ; - errno = e ; -} - -static inline void docopy (char const *repo, char const *srcname, char const *dstname) -{ - size_t repolen = strlen(repo) ; - size_t srclen = strlen(srcname) ; - size_t dstlen = strlen(dstname) ; - size_t r ; - char src[repolen + srclen + 10] ; - char dst[repolen + dstlen + 10] ; - char realsrc[repolen + srclen + 18] ; - char realdst[repolen + dstlen + 18] ; - char olddst[repolen + dstlen + 18] ; - memcpy(src, repo, repolen) ; - memcpy(src + repolen, "/sources/", 9) ; - memcpy(src + repolen + 9, srcname, srclen + 1) ; - memcpy(dst, src, repolen + 9) ; - memcpy(dst + repolen + 9, dstname, dstlen + 1) ; - olddst[0] = 0 ; - if (access(dst, F_OK) == -1) - { - if (errno != ENOENT) strerr_diefu2sys(111, "access ", dst) ; - } - else if (wgolb & (1 << GOLB_FORCE)) - { - memcpy(olddst, dst, repolen + 9) ; - r = readlink(dst, olddst + repolen + 9, dstlen + 9) ; - if (r == -1) strerr_diefu2sys(111, "readlink ", dst) ; - if (r != dstlen + 8) strerr_dief3x(102, "symlink ", dst, "doesn't point to a valid name") ; - } - else strerr_dief4x(100, "set ", dstname, " already exists in repository ", repo) ; - - memcpy(realsrc, src, repolen + 9) ; - r = readlink(src, realsrc + repolen + 9, srclen + 9) ; - if (r == -1) strerr_diefu2sys(111, "readlink ", src) ; - if (r != srclen + 8) strerr_dief3x(102, "symlink ", src, "doesn't point to a valid name") ; - realsrc[repolen + srclen + 17] = 0 ; - memcpy(realdst, dst, repolen + 9) ; - dst[repolen + 9] = '.' ; - memcpy(realdst + repolen + 10, dstname, dstlen) ; - memcpy(realdst + repolen + 10 + dstlen, realsrc + repolen + 10 + srclen, 8) ; - if (!hiercopy(realsrc, realdst)) - { - cleanup(realdst) ; - strerr_diefu4sys(111, "copy ", realsrc, " to ", realdst) ; - } - if (!atomic_symlink4(realdst + repolen + 9, dst, 0, 0)) - { - cleanup(realdst) ; - strerr_diefu4sys(111, "symlink ", realdst + repolen + 9, " to ", dst) ; - } - if (olddst[0]) cleanup(olddst) ; -} - -int main (int argc, char const *const *argv) -{ - char const *repo = S6RC_REPO_BASE ; - int fdlock ; - unsigned int verbosity = 1 ; - char const *wgola[2] = { 0 } ; - unsigned int golc ; - - PROG = "s6-rc-set-copy" ; - golc = gol_main(argc, argv, rgolb, 1, rgola, 2, &wgolb, 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") ; - if (wgola[GOLA_REPODIR]) repo = wgola[GOLA_REPODIR] ; - if (argc < 2) dieusage() ; - for (unsigned int i = 0 ; i < 2 ; i++) - if (strchr(argv[i], '/') || strchr(argv[i], '\n')) - strerr_dief1x(100, "set names cannot contain / or newlines") ; - - fdlock = s6rc_repo_lock(repo, 1) ; - if (fdlock == -1) strerr_diefu2sys(111, "lock ", repo) ; - tain_now_g() ; - docopy(repo, argv[0], argv[1]) ; - return 0 ; -} |
