aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-06-30 22:20:08 +0000
committerLaurent Bercot <ska@appnovation.com>2025-06-30 22:20:08 +0000
commit85554b3c1103c226fb16d20402ccea1dbc08f8c2 (patch)
treedcb64b2e18d52a19fbdd985ca8de79e6d36c16ab
parent4fca7a92b9eeaba9c327ca8b257b224c5c03e79b (diff)
downloads6-rc-85554b3c1103c226fb16d20402ccea1dbc08f8c2.tar.gz
Add s6-rc-repo-init, s6-rc-repo-populate
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--.gitignore2
-rwxr-xr-xconfigure8
-rw-r--r--package/configure-snippets/configure_case_lines2
-rw-r--r--package/configure-snippets/configure_expand_dirs2
-rw-r--r--package/configure-snippets/configure_generate_configh2
-rw-r--r--package/configure-snippets/configure_help_install1
-rw-r--r--package/configure-snippets/configure_init_vars1
-rw-r--r--package/deps.mak6
-rw-r--r--package/modes2
-rw-r--r--package/targets.mak4
-rw-r--r--src/repo/DESIGN.txt11
-rw-r--r--src/repo/deps-exe/s6-rc-repo-init1
-rw-r--r--src/repo/deps-exe/s6-rc-repo-populate1
-rw-r--r--src/repo/s6-rc-repo-init.c96
-rw-r--r--src/repo/s6-rc-repo-populate.c72
15 files changed, 208 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index c763ffa..0394e68 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,5 @@
/s6-rc-fdholder-filler
/s6-rc-oneshot-run
/s6-rc-format-upgrade
+/s6-rc-repo-init
+/s6-rc-repo-populate
diff --git a/configure b/configure
index e27c0b2..c929287 100755
--- a/configure
+++ b/configure
@@ -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 ;
+}