aboutsummaryrefslogtreecommitdiffstats
path: root/src
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 /src
parent4fca7a92b9eeaba9c327ca8b257b224c5c03e79b (diff)
downloads6-rc-85554b3c1103c226fb16d20402ccea1dbc08f8c2.tar.gz
Add s6-rc-repo-init, s6-rc-repo-populate
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src')
-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
5 files changed, 181 insertions, 0 deletions
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 ;
+}