diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-06-30 22:20:08 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-06-30 22:20:08 +0000 |
| commit | 85554b3c1103c226fb16d20402ccea1dbc08f8c2 (patch) | |
| tree | dcb64b2e18d52a19fbdd985ca8de79e6d36c16ab | |
| parent | 4fca7a92b9eeaba9c327ca8b257b224c5c03e79b (diff) | |
| download | s6-rc-85554b3c1103c226fb16d20402ccea1dbc08f8c2.tar.gz | |
Add s6-rc-repo-init, s6-rc-repo-populate
Signed-off-by: Laurent Bercot <ska@appnovation.com>
| -rw-r--r-- | .gitignore | 2 | ||||
| -rwxr-xr-x | configure | 8 | ||||
| -rw-r--r-- | package/configure-snippets/configure_case_lines | 2 | ||||
| -rw-r--r-- | package/configure-snippets/configure_expand_dirs | 2 | ||||
| -rw-r--r-- | package/configure-snippets/configure_generate_configh | 2 | ||||
| -rw-r--r-- | package/configure-snippets/configure_help_install | 1 | ||||
| -rw-r--r-- | package/configure-snippets/configure_init_vars | 1 | ||||
| -rw-r--r-- | package/deps.mak | 6 | ||||
| -rw-r--r-- | package/modes | 2 | ||||
| -rw-r--r-- | package/targets.mak | 4 | ||||
| -rw-r--r-- | src/repo/DESIGN.txt | 11 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-repo-init | 1 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-repo-populate | 1 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-init.c | 96 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-populate.c | 72 |
15 files changed, 208 insertions, 3 deletions
@@ -15,3 +15,5 @@ /s6-rc-fdholder-filler /s6-rc-oneshot-run /s6-rc-format-upgrade +/s6-rc-repo-init +/s6-rc-repo-populate @@ -26,6 +26,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR global configuration files [PREFIX/etc] --pkgconfdir=DIR pkg-config .pc files [PREFIX/lib/pkgconfig] --livedir=DIR default live directory [/run/s6-rc] + --repodir=DIR default repo directory [/var/lib/s6-rc/repository] If no --prefix option is given, by default libdir (but not dynlibdir) will be /usr/lib, and includedir will be /usr/include. @@ -170,6 +171,7 @@ vpaths='' vpathd='' build= livedir=/run/s6-rc +repodir=/var/lib/s6-rc/repository for arg ; do case "$arg" in @@ -208,6 +210,8 @@ for arg ; do --enable-absolute-paths|--enable-absolute-paths=yes) abspath=true ;; --disable-absolute-paths|--enable-absolute-paths=no) abspath=false ;; --livedir=*) livedir=${arg#*=} ;; + --repodir=*) repodir=${arg#*=} ;; + --enable-*|--disable-*|--with-*|--without-*|--*dir=*) ;; --enable-*|--disable-*|--with-*|--without-*|--*dir=*) ;; --host=*|--target=*) target=${arg#*=} ;; @@ -236,7 +240,7 @@ fi # Expand installation directories stripdir prefix -for i in exec_prefix dynlibdir libexecdir bindir libdir includedir sysconfdir pkgconfdir sysdeps sproot livedir ; do +for i in exec_prefix dynlibdir libexecdir bindir libdir includedir sysconfdir pkgconfdir sysdeps sproot livedir repodir ; do eval tmp=\${$i} eval $i=$tmp stripdir $i @@ -546,6 +550,8 @@ fi echo "#define ${package_macro_name}_LIBEXECPREFIX \"$libexecdir/\"" echo "#define ${package_macro_name}_SYSCONFPREFIX \"$sysconfdir/\"" echo "#define ${package_macro_name}_LIVE_BASE \"$livedir\"" +echo "#define ${package_macro_name}_REPO_BASE \"$repodir\"" + echo echo "#endif" exec 1>&3 3>&- diff --git a/package/configure-snippets/configure_case_lines b/package/configure-snippets/configure_case_lines index 84ba442..1659cc4 100644 --- a/package/configure-snippets/configure_case_lines +++ b/package/configure-snippets/configure_case_lines @@ -1 +1,3 @@ --livedir=*) livedir=${arg#*=} ;; + --repodir=*) repodir=${arg#*=} ;; + diff --git a/package/configure-snippets/configure_expand_dirs b/package/configure-snippets/configure_expand_dirs index 2b1cf03..d020001 100644 --- a/package/configure-snippets/configure_expand_dirs +++ b/package/configure-snippets/configure_expand_dirs @@ -1 +1 @@ -livedir +livedir repodir diff --git a/package/configure-snippets/configure_generate_configh b/package/configure-snippets/configure_generate_configh index b73ea47..679b6f8 100644 --- a/package/configure-snippets/configure_generate_configh +++ b/package/configure-snippets/configure_generate_configh @@ -1 +1,3 @@ echo "#define ${package_macro_name}_LIVE_BASE \"$livedir\"" +echo "#define ${package_macro_name}_REPO_BASE \"$repodir\"" + diff --git a/package/configure-snippets/configure_help_install b/package/configure-snippets/configure_help_install index 9371964..cb03148 100644 --- a/package/configure-snippets/configure_help_install +++ b/package/configure-snippets/configure_help_install @@ -1,2 +1,3 @@ --livedir=DIR default live directory [/run/s6-rc] + --repodir=DIR default repo directory [/var/lib/s6-rc/repository] diff --git a/package/configure-snippets/configure_init_vars b/package/configure-snippets/configure_init_vars index 5d49114..e3d8701 100644 --- a/package/configure-snippets/configure_init_vars +++ b/package/configure-snippets/configure_init_vars @@ -1 +1,2 @@ livedir=/run/s6-rc +repodir=/var/lib/s6-rc/repository diff --git a/package/deps.mak b/package/deps.mak index 74c853d..6982515 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -27,6 +27,8 @@ src/libs6rc/s6rc_servicedir_internal.o src/libs6rc/s6rc_servicedir_internal.lo: src/libs6rc/s6rc_servicedir_manage.o src/libs6rc/s6rc_servicedir_manage.lo: src/libs6rc/s6rc_servicedir_manage.c src/include/s6-rc/s6rc-servicedir.h src/libs6rc/s6rc_servicedir_unblock.o src/libs6rc/s6rc_servicedir_unblock.lo: src/libs6rc/s6rc_servicedir_unblock.c src/include/s6-rc/s6rc-servicedir.h src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_servicedir_unsupervise.lo: src/libs6rc/s6rc_servicedir_unsupervise.c src/include/s6-rc/s6rc-servicedir.h +src/repo/s6-rc-repo-init.o src/repo/s6-rc-repo-init.lo: src/repo/s6-rc-repo-init.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h +src/repo/s6-rc-repo-populate.o src/repo/s6-rc-repo-populate.lo: src/repo/s6-rc-repo-populate.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 src/s6-rc/s6-rc-db.o src/s6-rc/s6-rc-db.lo: src/s6-rc/s6-rc-db.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h @@ -48,6 +50,10 @@ libs6rc.so.xyzzy: EXTRA_LIBS := -ls6 -lskarnet 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_read_uint.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 libs6rc.dylib.xyzzy: EXTRA_LIBS := -ls6 -lskarnet 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_read_uint.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 +s6-rc-repo-init: EXTRA_LIBS := +s6-rc-repo-init: src/repo/s6-rc-repo-init.o -lskarnet +s6-rc-repo-populate: EXTRA_LIBS := +s6-rc-repo-populate: src/repo/s6-rc-repo-populate.o -lskarnet s6-rc: EXTRA_LIBS := ${SYSCLOCK_LIB} ${SPAWN_LIB} s6-rc: src/s6-rc/s6-rc.o ${LIBS6RC} -ls6 -lskarnet s6-rc-bundle: EXTRA_LIBS := diff --git a/package/modes b/package/modes index e803335..60cdf3e 100644 --- a/package/modes +++ b/package/modes @@ -8,3 +8,5 @@ s6-rc-update 0755 s6-rc-fdholder-filler 0755 s6-rc-oneshot-run 0755 s6-rc-format-upgrade 0755 +s6-rc-repo-init 0755 +s6-rc-repo-populate 0755 diff --git a/package/targets.mak b/package/targets.mak index 522b1e3..b5ef01e 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -6,7 +6,9 @@ s6-rc-bundle \ s6-rc-init \ s6-rc \ s6-rc-update \ -s6-rc-format-upgrade +s6-rc-format-upgrade \ +s6-rc-repo-init \ +s6-rc-repo-populate LIBEXEC_TARGETS := \ s6-rc-fdholder-filler \ diff --git a/src/repo/DESIGN.txt b/src/repo/DESIGN.txt new file mode 100644 index 0000000..9dbe7b2 --- /dev/null +++ b/src/repo/DESIGN.txt @@ -0,0 +1,11 @@ + +/var/lib/s6-rc/repository: base + +compiled/$name-$stamp +compiled/$name-current -> +compiled/$name-previous -> + +source/.everything +source/$name +source/$name/active +source/$name/masked diff --git a/src/repo/deps-exe/s6-rc-repo-init b/src/repo/deps-exe/s6-rc-repo-init new file mode 100644 index 0000000..e7187fe --- /dev/null +++ b/src/repo/deps-exe/s6-rc-repo-init @@ -0,0 +1 @@ +-lskarnet diff --git a/src/repo/deps-exe/s6-rc-repo-populate b/src/repo/deps-exe/s6-rc-repo-populate new file mode 100644 index 0000000..e7187fe --- /dev/null +++ b/src/repo/deps-exe/s6-rc-repo-populate @@ -0,0 +1 @@ +-lskarnet diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c new file mode 100644 index 0000000..befb85b --- /dev/null +++ b/src/repo/s6-rc-repo-init.c @@ -0,0 +1,96 @@ +/* ISC license. */ + +#include <skalibs/bsdsnowflake.h> /* stat */ + +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> /* rename */ +#include <errno.h> + +#include <skalibs/stat.h> +#include <skalibs/posixplz.h> +#include <skalibs/gol.h> +#include <skalibs/prog.h> +#include <skalibs/strerr.h> +#include <skalibs/djbunix.h> + +#include <s6-rc/config.h> +#include <s6-rc/s6rc.h> + +#define USAGE "s6-rc-repo-init [ -r repo ]" +#define dieusage() strerr_dieusage(100, USAGE) + +static void cleanup (char const *fn) +{ + int e = errno ; + rm_rf(fn) ; + errno = e ; +} + +static gol_arg const rgola[1] = +{ + { .so = 'r', .lo = "repodir", .i = 0 } +} ; + +int main (int argc, char const *const *argv) +{ + size_t repolen ; + char const *repo = S6RC_REPO_BASE ; + unsigned int golc ; + + PROG = "s6-rc-repo-init" ; + golc = gol_main(argc, argv, 0, 0, rgola, 1, 0, &repo) ; + argc -= golc ; argv += golc ; + if (repo[0] != '/') + strerr_dief2x(100, repo, " is not an absolute path") ; + + repolen = strlen(repo) ; + char repotmp[repolen + 12] ; + char tmp[repolen + 39] ; + memcpy(repotmp, repo, repolen) ; + memcpy(repotmp + repolen, "-tmp.XXXXXX", 12) ; + umask(0) ; + if (!mkdtemp(repotmp)) + { + size_t i = repolen ; + if (errno != ENOENT) + strerr_diefu2sys(111, "mkdtemp ", repotmp) ; + while (i && repotmp[i] != '/') i-- ; + repotmp[i] = 0 ; + if (mkdirp2(repotmp, 02755) == -1) + strerr_diefu2sys(111, "mkdir ", repotmp) ; + repotmp[i] = '/' ; + memcpy(repotmp + repolen, "-tmp.XXXXXX", 12) ; + if (!mkdtemp(repotmp)) + strerr_diefu2sys(111, "mkdtemp ", repotmp) ; + } + memcpy(tmp, repotmp, repolen + 11) ; + tmp[repolen + 11] = '/' ; + + memcpy(tmp + repolen + 12, "compiled", 9) ; + if (mkdir(tmp, 02755) == -1) + strerr_diefu2sys(111, "mkdir ", tmp) ; + + memcpy(tmp + repolen + 12, "source", 7) ; + if (mkdir(tmp, 02755) == -1) + strerr_diefu2sys(111, "mkdir ", tmp) ; + + memcpy(tmp + repolen + 18, "/.everything-initial", 21) ; + if (mkdir(tmp, 02755) == -1) + strerr_diefu2sys(111, "mkdir ", tmp) ; + + tmp[repolen + 30] = 0 ; + if (symlink(".everything-initial", tmp) == -1) + strerr_diefu4sys(111, "symlink ", ".everything-initial", " to ", tmp) ; + + if (chmod(repotmp, 02755) == -1) + strerr_diefu2sys(111, "chmod ", repotmp) ; + if (rename(repotmp, repo) == -1) + { + cleanup(repotmp) ; + strerr_diefu4sys(111, "rename ", repotmp, " to ", repo) ; + } + + return 0 ; +} diff --git a/src/repo/s6-rc-repo-populate.c b/src/repo/s6-rc-repo-populate.c new file mode 100644 index 0000000..7733a56 --- /dev/null +++ b/src/repo/s6-rc-repo-populate.c @@ -0,0 +1,72 @@ +/* ISC license. */ + +#include <skalibs/bsdsnowflake.h> /* stat */ + +#include <string.h> +#include <stdlib.h> +#include <stdio.h> /* rename */ +#include <errno.h> + +#include <skalibs/stat.h> +#include <skalibs/uint64.h> +#include <skalibs/posixplz.h> +#include <skalibs/gol.h> +#include <skalibs/prog.h> +#include <skalibs/strerr.h> +#include <skalibs/djbunix.h> + +#include <s6-rc/config.h> +#include <s6-rc/s6rc.h> + +#define USAGE "s6-rc-repo-populate [ -r repo ] sourcedirs..." +#define dieusage() strerr_dieusage(100, USAGE) + +static void cleanup (char const *fn) +{ + int e = errno ; + rm_rf(fn) ; + errno = e ; +} + +enum golb_e +{ + GOLB_FORCE, + GOLB_N +} ; + +static gol_bool const rgolb[1] = +{ + { .so = 'f', .lo = "force", .clear = 0, .set = 1 << GOLB_FORCE } +} ; + +static gol_arg const rgola[1] = +{ + { .so = 'r', .lo = "repodir", .i = 0 } +} ; + +int main (int argc, char const *const *argv) +{ + size_t repolen ; + char const *repo = S6RC_REPO_BASE ; + uint64_t wgolb = 0 ; + unsigned int golc ; + + PROG = "s6-rc-repo-populate" ; + golc = gol_main(argc, argv, rgolb, 1, rgola, 1, &wgolb, &repo) ; + argc -= golc ; argv += golc ; + if (!argc) dieusage() ; + if (repo[0] != '/') + strerr_dief2x(100, repo, " is not an absolute path") ; + + repolen = strlen(repo) ; + char sub[repolen + 30] ; + memcpy(sub, repo, repolen) ; + if (!(wgolb & 1 << GOLB_FORCE)) + { + struct stat st ; + + } + memcpy(sub + repolen, "/.everything-tmp.XXXXXX", 12) ; + + return 0 ; +} |
