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 /src | |
| 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>
Diffstat (limited to 'src')
| -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 |
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 ; +} |
