diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-08-08 00:28:58 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-08-08 00:28:58 +0000 |
| commit | a92aa0997e0d367e396b02dc2d55d0c0a3cbbc38 (patch) | |
| tree | e6f21d97cfa6cfea8bab222d1b99510ea5c8ee35 | |
| parent | f513ab225005661e9b4674a1b333abea0c6670f0 (diff) | |
| download | s6-rc-a92aa0997e0d367e396b02dc2d55d0c0a3cbbc38.tar.gz | |
Major refactors, add makesetbundle, refcompile/setcompile, etc.
Signed-off-by: Laurent Bercot <ska@appnovation.com>
| -rw-r--r-- | package/deps.mak | 16 | ||||
| -rw-r--r-- | src/include/s6-rc/repo.h | 10 | ||||
| -rw-r--r-- | src/libs6rc/deps-lib/s6rc | 11 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_cleanup.c | 79 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_compile.c | 28 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_defcompile.c | 11 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_fillset.c | 85 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_listcontents.c | 68 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_listdeps_internal.c | 11 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makebbuild.c | 87 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makedefbundle.c | 55 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makesetbundles.c | 137 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_refcompile.c | 9 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_setcompile.c | 11 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sublist.c | 5 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sync.c | 225 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-delete.c | 45 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-new.c | 83 |
18 files changed, 688 insertions, 288 deletions
diff --git a/package/deps.mak b/package/deps.mak index 9b1f7fd..beb76b4 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -22,15 +22,19 @@ src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_nlto0.lo: src/libs6rc/s6rc_nlto0.c src 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_fillset.o src/libs6rc/s6rc_repo_fillset.lo: src/libs6rc/s6rc_repo_fillset.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_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_lock.o src/libs6rc/s6rc_repo_lock.lo: src/libs6rc/s6rc_repo_lock.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_makesetbundles.o src/libs6rc/s6rc_repo_makesetbundles.lo: src/libs6rc/s6rc_repo_makesetbundles.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_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_sublist.o src/libs6rc/s6rc_repo_sublist.lo: src/libs6rc/s6rc_repo_sublist.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 @@ -58,15 +62,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_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 +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_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_moveservices.o src/libs6rc/s6rc_repo_refcompile.o src/libs6rc/s6rc_repo_setcompile.o src/libs6rc/s6rc_repo_sublist.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_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.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_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_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_sublist.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_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.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_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_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_sublist.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_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: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_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_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_sublist.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 ba55b9d..6aa4618 100644 --- a/src/include/s6-rc/repo.h +++ b/src/include/s6-rc/repo.h @@ -9,17 +9,23 @@ #include <skalibs/stralloc.h> #include <skalibs/genalloc.h> +extern char const s6rc_repo_sublist[3][7] ; +extern int s6rc_repo_fillset (char const *, char const *) ; + 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) ; -extern int s6rc_repo_makebbuild (char const *, char const *) ; +extern int s6rc_repo_makesetbundles (char const *, char const *, unsigned int) ; extern int s6rc_repo_makedefbundle (char const *, char const *, char const *) ; #define S6RC_REPO_COMPILE_BUFLEN(repolen, setlen) ((repolen) + (setlen) + 45) extern int s6rc_repo_compile (char const *, char const *, char const *const *, size_t, char *, unsigned int, char const *) ; -extern int s6rc_repo_defcompile (char const *, char const *, char const *, char *, unsigned int, char const *) ; +extern int s6rc_repo_refcompile (char const *, char *, unsigned int, char const *) ; +extern int s6rc_repo_setcompile (char const *, char const *, char const *, char *, unsigned int, char const *) ; +extern int s6rc_repo_listsub (char const *, char const *, char const *, stralloc *, genalloc *) ; +extern int s6rc_repo_listcontents (char const *, char const *, stralloc *, genalloc *) ; extern int s6rc_repo_listdeps (char const *, char const *, stralloc *, genalloc *, int) ; extern int s6rc_repo_listalldeps (char const *, char const *const *, size_t, stralloc *, genalloc *, int) ; extern int s6rc_repo_listdeps_internal (char const *, char const *const *, size_t, stralloc *, genalloc *, uint32_t) ; diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index b1ce2e8..6107d4b 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -15,15 +15,20 @@ s6rc_lock.o s6rc_nlto0.o s6rc_read_uint.o s6rc_repo_cleanup.o -s6rc_repo_listsub.o -s6rc_repo_lock.o s6rc_repo_compile.o -s6rc_repo_defcompile.o +s6rc_repo_fillset.o s6rc_repo_listalldeps.o +s6rc_repo_listcontents.o s6rc_repo_listdeps.o s6rc_repo_listdeps_internal.o +s6rc_repo_listsub.o +s6rc_repo_lock.o s6rc_repo_makedefbundle.o +s6rc_repo_makesetbundles.o s6rc_repo_moveservices.o +s6rc_repo_refcompile.o +s6rc_repo_setcompile.o +s6rc_repo_sublist.o s6rc_repo_sync.o s6rc_sanitize_dir.o s6rc_servicedir_internal.o diff --git a/src/libs6rc/s6rc_repo_cleanup.c b/src/libs6rc/s6rc_repo_cleanup.c index d64fe83..05881cd 100644 --- a/src/libs6rc/s6rc_repo_cleanup.c +++ b/src/libs6rc/s6rc_repo_cleanup.c @@ -9,14 +9,15 @@ #include <skalibs/stat.h> #include <skalibs/direntry.h> #include <skalibs/posixplz.h> +#include <skalibs/strerr.h> #include <skalibs/djbunix.h> #include <s6-rc/repo.h> -static inline int sub_cleanup (char const *subdir) +static inline int sub_cleanup (char const *sub) { - size_t dirlen = strlen(subdir) ; - DIR *dir = opendir(subdir) ; + size_t sublen = strlen(sub) ; + DIR *dir = opendir(sub) ; if (!dir) return 0 ; for (;;) { @@ -28,35 +29,70 @@ static inline int sub_cleanup (char const *subdir) if (d->d_name[0] == '.') continue ; len = strlen(d->d_name) ; { - char fn[dirlen + len + 2] ; - memcpy(fn, dir, dirlen) ; - fn[dirlen] = '/' ; - memcpy(fn + dirlen + 1, d->d_name, len + 1) ; - if (access(fn, F_OK) == -1) - { - if (errno == ENOENT) unlink_void(fn) ; - else break ; - } - else + char fn[sublen + len + 2] ; + memcpy(fn, sub, sublen) ; + fn[sublen] = '/' ; + memcpy(fn + sublen + 1, d->d_name, len + 1) ; + if (access(fn, F_OK) == 0) { struct stat st ; if (lstat(fn, &st) == -1) break ; if (!S_ISLNK(st.st_mode)) rm_rf(fn) ; } + else if (errno != ENOENT) + { + strerr_warnfu2sys("access ", fn) ; + break ; + } + else unlink_void(fn) ; + } + } + dir_close(dir) ; + return !errno ; +} + +static inline int set_cleanup (char const *set) +{ + size_t setlen = strlen(set) ; + DIR *dir ; + { + char bundle[setlen + 8] ; + memcpy(bundle, set, setlen) ; + memcpy(bundle + setlen, "/bundle", 8) ; + rm_rf(bundle) ; + } + dir = opendir(set) ; + if (!dir) 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[setlen + len + 2] ; + memcpy(fn, set, setlen) ; + fn[setlen] = '/' ; + memcpy(fn + setlen + 1, d->d_name, len + 1) ; + if (!sub_cleanup(fn)) break ; } } dir_close(dir) ; return !errno ; } -int s6rc_repo_cleanup (char const *repo) +int s6rc_repo_sources_cleanup (char const *repo) { DIR *dir ; size_t repolen = strlen(repo) ; - char sources[repolen + 9] ; - memcpy(sources, repo, repolen) ; - memcpy(sources + repolen, "/sources", 9) ; - dir = opendir(sources) ; + unsigned int nsets = 0 ; + char sets[repolen + 9] ; + memcpy(sets, repo, repolen) ; + memcpy(sets + repolen, "/sources", 9) ; + dir = opendir(sets) ; if (!dir) return 0 ; for (;;) { @@ -69,12 +105,13 @@ int s6rc_repo_cleanup (char const *repo) len = strlen(d->d_name) ; { char fn[repolen + len + 10] ; - memcpy(fn, sources, repolen + 8) ; + memcpy(fn, sets, repolen + 8) ; fn[repolen + 8] = '/' ; memcpy(fn + repolen + 9, d->d_name, len + 1) ; - if (!sub_cleanup(fn)) break ; + if (!set_cleanup(fn)) break ; + nsets++ ; } } dir_close(dir) ; - return !errno ; + return errno ? -1 : nsets ; } diff --git a/src/libs6rc/s6rc_repo_compile.c b/src/libs6rc/s6rc_repo_compile.c index db41f89..390219a 100644 --- a/src/libs6rc/s6rc_repo_compile.c +++ b/src/libs6rc/s6rc_repo_compile.c @@ -21,7 +21,8 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *sub size_t repolen = strlen(repo) ; size_t setlen = strlen(set) ; size_t totsublen = 0 ; - char newc[S6RC_REPO_COMPILE_BUFLEN(repolen, setlen)] ; + int needprefix = strcmp(set, ".ref") ; + char newc[repolen + setlen + 45] ; memcpy(newc, repo, repolen) ; memcpy(newc + repolen, "/compiled/.", 11) ; memcpy(newc + repolen + 11, set, setlen) ; @@ -36,9 +37,9 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *sub pid_t pid ; size_t m = 0 ; int wstat ; - char const *argv[9 + nsubs + !nsubs] ; + char const *argv[9 + nsubs] ; char fmtv[UINT_FMT] ; - char src[(nsubs + !nsubs) * (repolen + 10 + setlen) + totsublen] ; + char src[nsubs * (repolen + 10 + (needprefix ? setlen + 1 : 0)) + totsublen] ; char *w = src ; fmtv[uint_fmt(fmtv, verbosity)] = 0 ; argv[m++] = S6RC_BINPREFIX "s6-rc-compile" ; @@ -52,25 +53,18 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *sub } argv[m++] = "--" ; argv[m++] = newc ; - if (nsubs) + for (size_t i = 0 ; i < nsubs ; i++) { - 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 ; + if (needprefix) { - 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 ; + memcpy(w, subs[i], sublen+1) ; w += sublen + 1 ; } argv[m++] = 0 ; pid = cspawn(argv[0], argv, (char const *const *)environ, 0, 0, 0) ; diff --git a/src/libs6rc/s6rc_repo_defcompile.c b/src/libs6rc/s6rc_repo_defcompile.c deleted file mode 100644 index 8446ba8..0000000 --- a/src/libs6rc/s6rc_repo_defcompile.c +++ /dev/null @@ -1,11 +0,0 @@ -/* ISC license. */ - -#include <s6-rc/repo.h> - -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_fillset.c b/src/libs6rc/s6rc_repo_fillset.c new file mode 100644 index 0000000..9548c19 --- /dev/null +++ b/src/libs6rc/s6rc_repo_fillset.c @@ -0,0 +1,85 @@ +/* ISC license. */ + +#include <string.h> +#include <unistd.h> +#include <errno.h> + +#include <skalibs/direntry.h> +#include <skalibs/strerr.h> + +#include <s6-rc/repo.h> + +int s6rc_repo_fillset (char const *repo, char const *set) +{ + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + DIR *dir ; + char atomics[repolen + 18] ; + char setfn[repolen + 10 + setlen] ; + memcpy(atomics, repo, repolen) ; + memcpy(atomics + repolen, "/sources/.atomics", 18) ; + memcpy(setfn, repo, repolen) ; + memcpy(setfn + repolen, "/sources/", 9) ; + memcpy(setfn + repolen + 9, set, setlen+1) ; + + dir = opendir(atomics) ; + if (!dir) + { + strerr_warnfu2sys("opendir ", atomics) ; + return 0 ; + } + for (;;) + { + size_t len ; + unsigned int subi = 1 ; + direntry *d ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + + len = strlen(d->d_name) ; + char src[len + 30] ; + char dst[repolen + 18 + setlen + len] ; + memcpy(src, "../.atomics/", 12) ; + memcpy(src + 12, d->d_name, len) ; + memcpy(src + 12 + len, "/flag-essential", 16) ; + if (access(src, F_OK) == -1) + { + if (errno != ENOENT) + { + strerr_warnfu2sys("access ", src) ; + break ; + } + } + else subi = 2 ; + memcpy(src + 18 + len, "recommended", 12) ; + if (access(src, F_OK) == -1) + { + if (errno != ENOENT) + { + strerr_warnfu2sys("access ", src) ; + break ; + } + } + else subi = 2 ; + src[12 + len] = 0 ; + memcpy(dst, setfn, repolen + 10 + setlen) ; + memcpy(dst + repolen + 10 + setlen, s6rc_repo_sublist[subi], 6) ; + dst[repolen + setlen + 16] = '/' ; + memcpy(dst + repolen + setlen + 17, d->d_name, len+1) ; + if (symlink(src, dst) == -1) + { + strerr_warnfu4sys("make a symlink named ", dst, " pointing to ", src) ; + return 0 ; + } + } + dir_close(dir) ; + if (errno) + { + strerr_warnfu2sys("readdir ", atomics) ; + return 0 ; + } + + return 1 ; +} diff --git a/src/libs6rc/s6rc_repo_listcontents.c b/src/libs6rc/s6rc_repo_listcontents.c new file mode 100644 index 0000000..0e493c6 --- /dev/null +++ b/src/libs6rc/s6rc_repo_listcontents.c @@ -0,0 +1,68 @@ +/* ISC license. */ + +#include <sys/wait.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> + +#include <skalibs/posixplz.h> +#include <skalibs/types.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> +#include <skalibs/cspawn.h> +#include <skalibs/djbunix.h> + +#include <s6-rc/config.h> +#include <s6-rc/s6rc-utils.h> +#include <s6-rc/repo.h> + +int s6rc_repo_listcontents (char const *repo, char const *bundle, stralloc *storage, genalloc *indices) +{ + int swasnull = !storage->s ; + int gwasnull = !indices->s ; + size_t sabase = storage->len ; + size_t gabase = genalloc_len(size_t, indices) ; + size_t repolen = strlen(repo) ; + pid_t pid ; + int fd ; + int wstat ; + char refdb[repolen + 15] ; + char const *argv[8] = { S6RC_BINPREFIX "s6-rc-db", "-c", refdb, "-b", "--", "contents", bundle, 0 } ; + + memcpy(refdb, repo, repolen) ; + memcpy(refdb + repolen, "/compiled/.ref", 15) ; + pid = child_spawn1_pipe(argv[0], argv, (char const *const *)environ, &fd, 1) ; + if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return -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 + sabase, sabase, storage->len, indices)) goto err ; + return 1 ; + + err: + if (gwasnull) genalloc_free(size_t, indices) ; + else genalloc_setlen(size_t, indices, gabase) ; + if (swasnull) stralloc_free(storage) ; + else storage->len = sabase ; + return -1 ; +} diff --git a/src/libs6rc/s6rc_repo_listdeps_internal.c b/src/libs6rc/s6rc_repo_listdeps_internal.c index b424e2a..033d3c2 100644 --- a/src/libs6rc/s6rc_repo_listdeps_internal.c +++ b/src/libs6rc/s6rc_repo_listdeps_internal.c @@ -21,7 +21,8 @@ int s6rc_repo_listdeps_internal (char const *repo, char const *const *services, { int swasnull = !storage->s ; int gwasnull = !indices->s ; - size_t sstart = storage->len ; + size_t sabase = storage->len ; + size_t gabase = genalloc_len(size_t, indices) ; { size_t m = 0 ; @@ -30,9 +31,9 @@ int s6rc_repo_listdeps_internal (char const *repo, char const *const *services, int fd ; int wstat ; char const *argv[8 + n] ; - char refdb[repolen + 22] ; + char refdb[repolen + 15] ; memcpy(refdb, repo, repolen) ; - memcpy(refdb + repolen, "/compiled/.everything", 22) ; + memcpy(refdb + repolen, "/compiled/.ref", 15) ; argv[m++] = S6RC_BINPREFIX "s6-rc-db" ; argv[m++] = "-c"; argv[m++] = refdb ; @@ -67,11 +68,13 @@ int s6rc_repo_listdeps_internal (char const *repo, char const *const *services, } } - if (!s6rc_nlto0(storage->s + sstart, sstart, storage->len, indices)) goto err ; + if (!s6rc_nlto0(storage->s + sabase, sabase, storage->len, indices)) goto err ; return 1 ; err: if (gwasnull) genalloc_free(size_t, indices) ; + else genalloc_setlen(size_t, indices, gabase) ; if (swasnull) stralloc_free(storage) ; + else storage->len = sabase ; return -1 ; } diff --git a/src/libs6rc/s6rc_repo_makebbuild.c b/src/libs6rc/s6rc_repo_makebbuild.c deleted file mode 100644 index 942b055..0000000 --- a/src/libs6rc/s6rc_repo_makebbuild.c +++ /dev/null @@ -1,87 +0,0 @@ -/* ISC license. */ - -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> - -#include <skalibs/direntry.h> -#include <skalibs/strerr.h> -#include <skalibs/stralloc.h> -#include <skalibs/genalloc.h> -#include <skalibs/djbunix.h> - -#include <s6-rc/repo.h> - -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 index 0863abd..5c67917 100644 --- a/src/libs6rc/s6rc_repo_makedefbundle.c +++ b/src/libs6rc/s6rc_repo_makedefbundle.c @@ -11,6 +11,7 @@ #include <skalibs/strerr.h> #include <skalibs/stralloc.h> #include <skalibs/djbunix.h> +#include <skalibs/skamisc.h> #include <s6-rc/repo.h> @@ -25,37 +26,25 @@ int s6rc_repo_makedefbundle (char const *repo, char const *set, char const *bund 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) + memcpy(bfn + repolen, "/sources/.atomics/", 18) ; + memcpy(bfn + repolen + 18, bundle, bundlelen + 1) ; + + if (access(bfn, F_OK) == 0) goto errexists ; + if (errno != ENOENT) { - if (errno != ENOENT) - { - strerr_warnfu2sys("check existence of ", bfn) ; - return 0 ; - } + strerr_warnfu2sys("check existence of ", bfn) ; + return 0 ; } - else + memcpy(bfn + repolen + 10, "bundle", 6) ; + if (access(bfn, F_OK) == 0) goto errexists ; + if (errno != ENOENT) { - 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) ; + strerr_warnfu2sys("check existence of ", bfn) ; + return 0 ; } memcpy(bfn + repolen + 9, set, setlen) ; - memcpy(bfn + repolen + 9 + setlen, "/bbuild/", 8) ; + memcpy(bfn + repolen + 9 + setlen, "/bundle/", 8) ; memcpy(bfn + repolen + 17 + setlen, bundle, bundlelen + 1) ; if (mkdir(bfn, 02755) == -1) { @@ -113,4 +102,20 @@ int s6rc_repo_makedefbundle (char const *repo, char const *set, char const *bund } return 1 ; + + errexists: + if (sareadlink(&satmp, bfn) == -1) + { + strerr_warnfu2sys("readlink ", bfn) ; + return 0 ; + } + if (!stralloc_0(&satmp)) + { + strerr_warnfu1sys("stralloc_catb ") ; + satmp.len = 0 ; + return 0 ; + } + strerr_warnf4x("bundle ", bundle, " is already defined at ", satmp.s) ; + satmp.len = 0 ; + return (errno = EINVAL, 0) ; } diff --git a/src/libs6rc/s6rc_repo_makesetbundles.c b/src/libs6rc/s6rc_repo_makesetbundles.c new file mode 100644 index 0000000..30ff29e --- /dev/null +++ b/src/libs6rc/s6rc_repo_makesetbundles.c @@ -0,0 +1,137 @@ +/* ISC license. */ + +#include <skalibs/bsdsnowflake.h> + +#include <string.h> +#include <unistd.h> +#include <stdlib.h> +#include <errno.h> + +#include <skalibs/stat.h> +#include <skalibs/direntry.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> +#include <skalibs/djbunix.h> + +#include <s6-rc/repo.h> + +static int str_ref_cmp (void const *a, void const *b) +{ + return strcmp(*(char const *const *)a, *(char const *const *)b) ; +} + +int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int verbosity) +{ + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + int n ; + char src[repolen + 19] ; + 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, "/bundle", 8) ; + memcpy(src, dst, repolen + 10) ; + 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 ; + if (n) + { + DIR *dir ; + char const *masked[n] ; + char maskedstorage[sa.len] ; + memcpy(maskedstorage, sa.s, sa.len) ; + for (size_t i = 0 ; i < n ; i++) masked[i] = maskedstorage + genalloc_s(size_t, &ga)[i] ; + sa.len = 0 ; + genalloc_setlen(size_t, &ga, 0) ; + qsort(masked, n, sizeof(char const *), &str_ref_cmp) ; + + if (mkdir(dst, 02755) == -1) + { + strerr_warnfu2sys("mkdir ", dst) ; + goto errga ; + } + dir = opendir(src) ; + if (!dir) + { + strerr_warnfu2sys("opendir ", src) ; + goto err0 ; + } + for (;;) + { + int m, i = 0 ; + direntry *d ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + + sa.len = 0 ; + genalloc_setlen(size_t, &ga, 0) ; + m = s6rc_repo_listcontents(repo, d->d_name, &sa, &ga) ; + if (m < 0) + { + dir_close(dir) ; + goto err0 ; + } + + for (; i < m ; i++) + { + char const *x = sa.s + genalloc_s(size_t, &ga)[i] ; + if (bsearch(x, masked, n, sizeof(char const *), &str_ref_cmp)) + { + if (verbosity >= 3) + strerr_warni4x("skipping bundle ", d->d_name, " containing e.g. masked service ", x) ; + break ; + } + } + if (i < m) continue ; + + size_t len = strlen(d->d_name) ; + char target[16 + len] ; + char fn[repolen + setlen + 18 + len] ; + memcpy(target, "../../.bundles/", 15) ; + memcpy(target + 15, d->d_name, len+1) ; + memcpy(fn, dst, repolen + setlen + 16) ; + fn[repolen + setlen + 16] = '/' ; + 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) ; + dir_close(dir) ; + goto err0 ; + } + } + dir_close(dir) ; + if (errno) + { + strerr_warnfu2sys("readdir ", src) ; + goto err0 ; + } + } + else if (!hiercopy_tmp(src, dst, &sa)) + { + strerr_warnfu4sys("recursively copy ", src, " to ", dst) ; + goto err0 ; + } + + stralloc_free(&sa) ; + return 1 ; + + err0: + { + int e = errno ; + rm_rf_tmp(dst, &sa) ; + errno = e ; + } + errga: + genalloc_free(size_t, &ga) ; + err: + stralloc_free(&sa) ; + return 0 ; +} diff --git a/src/libs6rc/s6rc_repo_refcompile.c b/src/libs6rc/s6rc_repo_refcompile.c new file mode 100644 index 0000000..5cc4d18 --- /dev/null +++ b/src/libs6rc/s6rc_repo_refcompile.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include <s6-rc/repo.h> + +int s6rc_repo_refcompile (char const *repo, char *oldc, unsigned int verbosity, char const *fdhuser) +{ + static char const *const subs[2] = { ".atomics", ".bundles" } ; + return s6rc_repo_compile(repo, ".ref", subs, 3, oldc, verbosity, fdhuser) ; +} diff --git a/src/libs6rc/s6rc_repo_setcompile.c b/src/libs6rc/s6rc_repo_setcompile.c new file mode 100644 index 0000000..88af42b --- /dev/null +++ b/src/libs6rc/s6rc_repo_setcompile.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include <s6-rc/repo.h> + +int s6rc_repo_setcompile (char const *repo, char const *set, char const *defbundle, char *oldc, unsigned int verbosity, char const *fdhuser) +{ + static char const *const subs[3] = { "active", "onboot", "bundle" } ; + if (!s6rc_repo_makesetbundles(repo, set, verbosity)) return -1 ; + if (!s6rc_repo_makedefbundle(repo, set, defbundle)) return -1 ; + return s6rc_repo_compile(repo, set, subs, 3, oldc, verbosity, fdhuser) ; +} diff --git a/src/libs6rc/s6rc_repo_sublist.c b/src/libs6rc/s6rc_repo_sublist.c new file mode 100644 index 0000000..ad6ce0e --- /dev/null +++ b/src/libs6rc/s6rc_repo_sublist.c @@ -0,0 +1,5 @@ +/* ISC license. */ + +#include <s6-rc/repo.h> + +char const s6rc_repo_sublist[3][7] = { "masked", "active", "onboot" } ; diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c index a0b6431..8ff1137 100644 --- a/src/libs6rc/s6rc_repo_sync.c +++ b/src/libs6rc/s6rc_repo_sync.c @@ -3,6 +3,7 @@ #include <skalibs/nonposix.h> /* mkdtemp */ #include <string.h> +#include <stdint.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> @@ -12,28 +13,137 @@ #include <skalibs/strerr.h> #include <skalibs/stralloc.h> #include <skalibs/djbunix.h> +#include <skalibs/skamisc.h> #include <skalibs/unix-transactional.h> #include <s6-rc/s6rc-utils.h> #include <s6-rc/repo.h> -static inline void cleanup (char const *fn) +static inline void cleanup (char const *ato, char const *bun) { int e = errno ; - rm_rf(fn) ; + rm_rf(ato) ; + rm_rf(bun) ; errno = e ; } +static int s6rc_repo_syncsub (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) +{ + static char const subs[3][7] = { "masked", "active", "onboot" } ; + for (unsigned int i = 0 ; i < 3 ; i++) + if (s6rc_repo_syncsub(repo, set, subs[i], i, sa, ga, verbosity)) goto err ; + + size_t n = genalloc_len(size_t, ga) ; + if (!n) + { + if (!s6rc_repo_fillset(repo, set)) 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) { - stralloc sa = STRALLOC_ZERO ; size_t repolen = strlen(repo) ; - char newdir[repolen + 29] ; - memcpy(newdir, repo, repolen) ; - memcpy(newdir + repolen, "/sources/..everything:XXXXXX", 29) ; - if (!mkdtemp(newdir)) + char ato[repolen + 26] ; + char bun[repolen + 26] ; + + + /* Fill new .atomics/ and .bundles/ with symlinks to real sources */ + + memcpy(ato, repo, repolen) ; + memcpy(ato + repolen, "/sources/..atomics:XXXXXX", 26) ; + memcpy(bun, ato, repolen + 26) ; + memcpy(bun + repolen + 11, "bundle", 6) ; + if (!mkdtemp(ato)) + { + strerr_warnfu2sys("mkdtemp ", ato) ; + return 0 ; + } + if (chmod(ato, 02755) == -1) + { + strerr_warnfu2sys("chmod ", ato) ; + return 0 ; + } + + if (!mkdtemp(bun)) { - strerr_warnfu2sys("mkdtemp ", newdir) ; + strerr_warnfu2sys("mkdtemp ", bun) ; + rmdir(ato) ; + return 0 ; + } + if (chmod(bun, 02755) == -1) + { + strerr_warnfu2sys("chmod ", bun) ; return 0 ; } @@ -56,19 +166,17 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources if (d->d_name[0] == '.') continue ; len = strlen(d->d_name) ; { - char dst[repolen + 30 + len] ; + char const *x ; + char dst[repolen + 28 + len] ; char src[srclen + len + 2] ; - memcpy(dst, newdir, repolen + 28) ; - dst[repolen + 28] = '/' ; - memcpy(dst + repolen + 29, d->d_name, len+1) ; memcpy(src, sources[i], srclen) ; src[srclen] = '/' ; memcpy(src + srclen + 1, d->d_name, len+1) ; switch (s6rc_type_check(-1, src)) { case 1 : - case 2 : - case 3 : break ; + case 2 : x = ato ; break ; + case 3 : x = bun ; break ; case 0 : strerr_warnf2x("invalid service type for ", src) ; dir_close(dir) ; @@ -78,6 +186,9 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources dir_close(dir) ; goto err ; } + memcpy(dst, x, repolen + 26) ; + dst[repolen + 26] = '/' ; + memcpy(dst + repolen + 27, d->d_name, len+1) ; if (symlink(src, dst) == -1) { if (errno != EEXIST) @@ -88,15 +199,15 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources } if (verbosity) { - sa.len = 0 ; - if (!sareadlink(&sa, dst) || !stralloc_0(&sa)) + if (!sareadlink(&satmp, dst) || !stralloc_0(&satmp)) { strerr_warnwu2sys("readlink ", dst) ; errno = EEXIST ; strerr_warnwu4sys("symlink ", src, " to ", dst) ; } else - strerr_warnwu6x("symlink ", src, " to ", dst, ": service is already provided by ", sa.s) ; + strerr_warnwu6x("symlink ", src, " to ", dst, ": already provided by ", satmp.s) ; + satmp.len = 0 ; } } } @@ -109,35 +220,79 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources } } - if (chmod(newdir, 02755) == -1) + + /* Compile the reference db - also checks new sources consistency */ + { - strerr_warnfu2sys("chmod ", newdir) ; - goto err ; + char const *subs[2] = { ato + repolen + 9, bun + repolen + 9 } ; + char oldc[repolen + 49] ; + int r = s6rc_repo_compile(repo, ".ref", subs, 2, oldc, verbosity, fdhuser) ; + if (r <= 0) goto err ; + if (r == 2) rm_rf(oldc) ; } + + /* Switch to the new sources, delete the old ones */ + { - char curdir[repolen + 21] ; - memcpy(curdir, repo, repolen) ; - memcpy(curdir + repolen, "/sources/.everything", 21) ; - if (!atomic_symlink4(newdir + repolen + 1, curdir, 0, 0)) goto err ; + char fn[repolen + 18] ; + char oldato[17] ; + char oldbun[17] ; + memcpy(fn, repo, repolen) ; + memcpy(fn + repolen, "/sources/.atomics", 18) ; + if (!atomic_symlink4(ato + repolen + 9, fn, oldato, 17)) goto err ; + memcpy(fn + repolen + 10, "bundle", 6) ; + if (!atomic_symlink4(bun + repolen + 9, fn, oldbun, 17)) + { + strerr_warnfu4sys("symlink ", bun + repolen + 9, " to ", fn) ; + memcpy(fn + repolen + 10, "atomic", 6) ; + if (!atomic_symlink4(oldato, fn, 0, 0)) + { + strerr_warnfu6sys("symlink ", oldato, " back to ", fn, " - weird race, manually check ", repo) ; + goto err ; + } + goto err ; + } + memcpy(ato + repolen + 9, oldato, 16) ; + memcpy(bun + repolen + 9, oldbun, 16) ; + cleanup(ato, bun) ; } - stralloc_free(&sa) ; - if (!s6rc_repo_cleanup(repo)) return 0 ; + /* Update the existing sets */ + + ato[repolen + 8] = 0 ; { - size_t buflen = S6RC_REPO_COMPILE_BUFLEN(repolen, sizeof(".everything") - 1) ; - char oldc[buflen] ; - int r = s6rc_repo_compile(repo, ".everything", 0, 0, oldc, verbosity, fdhuser) ; - if (r <= 0) goto err0 ; - if (r == 2) rm_rf(oldc) ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; /* size_t */ + DIR *dir = opendir(ato) ; + if (!dir) + { + strerr_warnfu2sys("opendir ", ato) ; + return 0 ; + } + for (;;) + { + direntry *d ; + errno = 0 ; + 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 ; + } + dir_close(dir) ; + genalloc_free(size_t, &ga) ; + stralloc_free(&sa) ; + if (errno) + { + strerr_warnfu2sys("readdir ", ato) ; + return 0 ; + } } - + return 1 ; err: - stralloc_free(&sa) ; - err0: - cleanup(newdir) ; + cleanup(ato, bun) ; return 0 ; } diff --git a/src/repo/s6-rc-set-delete.c b/src/repo/s6-rc-set-delete.c index 8885e0c..2750abb 100644 --- a/src/repo/s6-rc-set-delete.c +++ b/src/repo/s6-rc-set-delete.c @@ -9,6 +9,7 @@ #include <skalibs/strerr.h> #include <skalibs/gol.h> #include <skalibs/tai.h> +#include <skalibs/direntry.h> #include <skalibs/djbunix.h> #include <s6-rc/config.h> @@ -17,18 +18,17 @@ #define USAGE "s6-rc-set-delete [ -v verbosity ] [ -r repo ] setname..." #define dieusage() strerr_dieusage(100, USAGE) -static inline void dodelete (char const *repo, char const *setname) +static inline void dodelete (char const *repo, char const *set) { size_t repolen = strlen(repo) ; - size_t setlen = strlen(setname) ; - char fn[repolen + setlen + 10] ; + size_t setlen = strlen(set) ; + char fn[repolen + setlen + 11] ; memcpy(fn, repo, repolen) ; memcpy(fn + repolen, "/sources/", 9) ; - memcpy(fn + repolen + 9, setname, setlen + 1) ; + memcpy(fn + repolen + 9, set, setlen + 1) ; if (access(fn, W_OK) == -1) { if (errno != ENOENT) strerr_diefu2sys(111, "access ", fn) ; - else strerr_warnwu2sys("delete set ", setname) ; } else { @@ -40,9 +40,34 @@ static inline void dodelete (char const *repo, char const *setname) if (r == -1) strerr_diefu2sys(111, "readlink ", fn) ; else if (r != 8) strerr_dief3x(102, "symlink ", fn, " points to an invalid name") ; real[repolen + setlen + 17] = 0 ; - if (unlink(fn) == -1) strerr_diefu2sys(111, "unlink ", fn) ; + unlink_void(fn) ; rm_rf(real) ; } + + memcpy(fn + repolen + 1, "compiled/", 9) ; + memcpy(fn + repolen + 10, set, setlen + 1) ; + unlink_void(fn) ; + fn[repolen + 9] = 0 ; + DIR *dir = opendir(fn) ; + if (!dir) strerr_diefu2sys(111, "opendir ", fn) ; + for (;;) + { + direntry *d ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.' && !strncmp(d->d_name + 1, set, setlen) && d->d_name[1 + setlen] == ':' && strlen(d->d_name + 2 + setlen) == 6) + { + size_t len = strlen(d->d_name) ; + char tmp[repolen + 11 + len] ; + memcpy(tmp, fn, repolen + 9) ; + tmp[repolen + 9] = '/' ; + memcpy(tmp + repolen + 10, d->d_name, len + 1) ; + rm_rf(tmp) ; + } + } + if (errno) strerr_diefu2sys(111, "readdir ", fn) ; + dir_close(dir) ; } enum gola_e @@ -74,8 +99,14 @@ int main (int argc, char const *const *argv) if (wgola[GOLA_REPODIR]) repo = wgola[GOLA_REPODIR] ; if (!argc) dieusage() ; for (unsigned int i = 0 ; i < argc ; i++) + { + if (!argv[i][0]) + strerr_dief2x(100, "set names cannot ", "be empty") ; + if (argv[i][0] == '.') + strerr_dief2x(100, "set names cannot ", "start with a dot") ; if (strchr(argv[i], '/') || strchr(argv[i], '\n')) - strerr_dief1x(100, "set names cannot contain / or newlines") ; + strerr_dief2x(100, "set names cannot ", "contain / or newlines") ; + } fdlock = s6rc_repo_lock(repo, 1) ; if (fdlock == -1) strerr_diefu2sys(111, "lock ", repo) ; diff --git a/src/repo/s6-rc-set-new.c b/src/repo/s6-rc-set-new.c index 74bab93..dc693b6 100644 --- a/src/repo/s6-rc-set-new.c +++ b/src/repo/s6-rc-set-new.c @@ -33,16 +33,16 @@ static void cleanup (char const *fn) static inline void newset (char const *repo, char const *setname) { - static char const sublist[5][7] = { "masked", "active", "onboot", "bundle", "bbuild" } ; + static char const sublist[3][7] = { "masked", "active", "onboot" } ; size_t repolen = strlen(repo) ; size_t setlen = strlen(setname) ; - char everything[repolen + 21] ; + char atomics[repolen + 18] ; char fn[repolen + 10 + setlen] ; char tmp[repolen + 18 + setlen] ; char sub[repolen + 25 + setlen] ; - memcpy(everything, repo, repolen) ; - memcpy(everything + repolen, "/sources/.everything", 21) ; - memcpy(fn, everything, repolen + 9) ; + memcpy(atomics, repo, repolen) ; + memcpy(atomics + repolen, "/sources/.atomics", 18) ; + memcpy(fn, atomics, repolen + 9) ; memcpy(fn + repolen + 9, setname, setlen + 1) ; if (access(fn, F_OK) == -1) { @@ -55,15 +55,7 @@ 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(sub, tmp, repolen + 17 + setlen) ; - memcpy(sub + repolen + 17 + setlen, "/lock", 6) ; - if (!openwritenclose_unsafe(sub, "", 0)) - { - cleanup(tmp) ; - strerr_diefu2sys(111, "create ", sub) ; - } - - for (size_t i = 0 ; i < 4 ; i++) + for (size_t i = 0 ; i < 3 ; i++) { memcpy(sub + repolen + 18 + setlen, sublist[i], 7) ; if (mkdir(sub, 02755) == -1) @@ -73,60 +65,10 @@ static inline void newset (char const *repo, char const *setname) } } - DIR *dir = opendir(everything) ; - for (;;) - { - size_t len ; - unsigned int subi = 1 ; - direntry *d ; - errno = 0 ; - d = readdir(dir) ; - if (!d) break ; - if (d->d_name[0] == '.') continue ; - - len = strlen(d->d_name) ; - char src[len + 33] ; - char dst[repolen + 26 + setlen + len] ; - memcpy(src, "../.everything/", 15) ; - memcpy(src + 15, d->d_name, len+1) ; - switch (s6rc_type_check(-1, 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 ; - } - } - 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) - { - cleanup(tmp) ; - strerr_diefu4sys(111, "symlink ", src, " to ", dst) ; - } - } - dir_close(dir) ; - if (errno) + if (s6rc_repo_fillset(repo, tmp + repolen + 9)) { cleanup(tmp) ; - strerr_diefu2sys(111, "readdir ", tmp) ; + _exit(111) ; } if (chmod(tmp, 02755) == -1) @@ -171,12 +113,13 @@ int main (int argc, char const *const *argv) if (!argc) dieusage() ; for (unsigned int i = 0 ; i < argc ; i++) { - if (!argv[i][0]) strerr_dief1x(100, "set names cannot be empty") ; - if (argv[i][0] == '.') strerr_dief1x(100, "set names cannot start with a dot") ; + if (!argv[i][0]) + strerr_dief2x(100, "set names cannot ", "be empty") ; + if (argv[i][0] == '.') + strerr_dief2x(100, "set names cannot ", "start with a dot") ; if (strchr(argv[i], '/') || strchr(argv[i], '\n')) - strerr_dief1x(100, "set names cannot contain / or newlines") ; + strerr_dief2x(100, "set names cannot ", "contain / or newlines") ; } - fdlock = s6rc_repo_lock(repo, 1) ; if (fdlock == -1) strerr_diefu2sys(111, "lock ", repo) ; tain_now_g() ; |
