diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-07-02 02:22:44 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-07-02 02:22:44 +0000 |
| commit | 92051568ad7af0013dfd92b046b4f047ccbc2f04 (patch) | |
| tree | 9181c015e1c654eedb35a4326598560cf014a303 /src/repo | |
| parent | 6fdfa8c61f85639fa386017f2d3974d606c06864 (diff) | |
| download | s6-rc-92051568ad7af0013dfd92b046b4f047ccbc2f04.tar.gz | |
Finish s6-rc-repo-init
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/repo')
| -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 | 80 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-populate.c | 72 |
4 files changed, 72 insertions, 82 deletions
diff --git a/src/repo/deps-exe/s6-rc-repo-init b/src/repo/deps-exe/s6-rc-repo-init index e7187fe..152b051 100644 --- a/src/repo/deps-exe/s6-rc-repo-init +++ b/src/repo/deps-exe/s6-rc-repo-init @@ -1 +1,2 @@ +${LIBS6RC} -lskarnet diff --git a/src/repo/deps-exe/s6-rc-repo-populate b/src/repo/deps-exe/s6-rc-repo-populate deleted file mode 100644 index e7187fe..0000000 --- a/src/repo/deps-exe/s6-rc-repo-populate +++ /dev/null @@ -1 +0,0 @@ --lskarnet diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c index 296216a..660b046 100644 --- a/src/repo/s6-rc-repo-init.c +++ b/src/repo/s6-rc-repo-init.c @@ -15,11 +15,12 @@ #include <skalibs/prog.h> #include <skalibs/strerr.h> #include <skalibs/djbunix.h> +#include <skalibs/random.h> #include <s6-rc/config.h> #include <s6-rc/s6rc.h> -#define USAGE "s6-rc-repo-init [ -r repo ]" +#define USAGE "s6-rc-repo-init [ -r repo ] sources..." #define dieusage() strerr_dieusage(100, USAGE) static void cleanup (char const *fn) @@ -29,6 +30,17 @@ static void cleanup (char const *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 } @@ -38,20 +50,26 @@ int main (int argc, char const *const *argv) { size_t repolen ; char const *repo = S6RC_REPO_BASE ; + uint64_t wgolb = 0 ; unsigned int golc ; + mode_t m ; PROG = "s6-rc-repo-init" ; - golc = gol_main(argc, argv, 0, 0, rgola, 1, 0, &repo) ; + 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") ; + for (unsigned int i = 0 ; i < argc ; i++) + if (argv[i][0] != '/') + strerr_dief2x(100, argv[i], " 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) ; + m = umask(0) ; if (!mkdtemp(repotmp)) { size_t i = repolen ; @@ -62,7 +80,7 @@ int main (int argc, char const *const *argv) if (mkdirp2(repotmp, 02755) == -1) strerr_diefu2sys(111, "mkdir ", repotmp) ; repotmp[i] = '/' ; - memcpy(repotmp + repolen, "-tmp.XXXXXX", 12) ; + memcpy(repotmp + repolen, ":new:XXXXXX", 12) ; if (!mkdtemp(repotmp)) strerr_diefu2sys(111, "mkdtemp ", repotmp) ; } @@ -71,26 +89,70 @@ int main (int argc, char const *const *argv) memcpy(tmp + repolen + 12, "compiled", 9) ; if (mkdir(tmp, 02755) == -1) + { + cleanup(repotmp) ; strerr_diefu2sys(111, "mkdir ", tmp) ; + } memcpy(tmp + repolen + 12, "source", 7) ; if (mkdir(tmp, 02755) == -1) + { + cleanup(repotmp) ; strerr_diefu2sys(111, "mkdir ", tmp) ; + } - memcpy(tmp + repolen + 18, "/.everything-initial", 21) ; + memcpy(tmp + repolen + 18, "/.everything:initial", 21) ; if (mkdir(tmp, 02755) == -1) + { + cleanup(repotmp) ; strerr_diefu2sys(111, "mkdir ", tmp) ; + } tmp[repolen + 30] = 0 ; - if (symlink(".everything-initial", tmp) == -1) - strerr_diefu4sys(111, "symlink ", ".everything-initial", " to ", tmp) ; + if (symlink(".everything:initial", tmp) == -1) + { + cleanup(repotmp) ; + strerr_diefu4sys(111, "symlink ", ".everything:initial", " to ", tmp) ; + } + + umask(m) ; + + if (!s6rc_repo_sync(repotmp, argv, argc)) + { + cleanup(repotmp) ; + strerr_diefu2sys(111, "sync ", repotmp) ; + } if (chmod(repotmp, 02755) == -1) strerr_diefu2sys(111, "chmod ", repotmp) ; if (rename(repotmp, repo) == -1) { - cleanup(repotmp) ; - strerr_diefu4sys(111, "rename ", repotmp, " to ", repo) ; + if (errno != EEXIST || !(wgolb & 1 << GOLB_FORCE)) + { + cleanup(repotmp) ; + strerr_diefu4sys(111, "rename ", repotmp, " to ", repo) ; + } + else + { + char oldrepo[repolen + 22] ; + memcpy(oldrepo, repo, repolen) ; + memcpy(oldrepo + repolen, ":old:", 5) ; + random_name(oldrepo + repolen + 5, 16) ; + if (rename(repo, oldrepo) == -1) + { + cleanup(repotmp) ; + strerr_diefu4sys(111, "rename ", repo, " to ", oldrepo) ; + } + if (rename(repotmp, repo) == -1) + { + int e = errno ; + if (rename(oldrepo, repo) == -1) + strerr_diefu7sys(111, "rename directories to ", repo, ": weird race happened. Old repository is at ", repotmp, " and new repository is at ", oldrepo, " - reported error was") ; + errno = e ; + 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 deleted file mode 100644 index 7733a56..0000000 --- a/src/repo/s6-rc-repo-populate.c +++ /dev/null @@ -1,72 +0,0 @@ -/* 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 ; -} |
