From 8effedb35bb873a1278776721a0d650c665efaa7 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Wed, 1 Oct 2025 01:02:29 +0000 Subject: Add stores, edit init and sync --- src/libs6rc/deps-lib/s6rc | 1 + src/libs6rc/s6rc_repo_makestores.c | 68 ++++++++++++++++++++++++++++++++++++++ src/libs6rc/s6rc_repo_sync.c | 18 +++++----- 3 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 src/libs6rc/s6rc_repo_makestores.c (limited to 'src/libs6rc') diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index 87feaee..d847297 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -30,6 +30,7 @@ s6rc_repo_listsub.o s6rc_repo_lock.o s6rc_repo_makedefbundle.o s6rc_repo_makesetbundles.o +s6rc_repo_makestores.o s6rc_repo_makesvlist.o s6rc_repo_makesvlist_byname.o s6rc_repo_moveservices.o diff --git a/src/libs6rc/s6rc_repo_makestores.c b/src/libs6rc/s6rc_repo_makestores.c new file mode 100644 index 0000000..5568ec5 --- /dev/null +++ b/src/libs6rc/s6rc_repo_makestores.c @@ -0,0 +1,68 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +int s6rc_repo_makestores (char const *repo, char const *const *stores, uint16_t n) +{ + size_t repolen = strlen(repo) ; + mode_t m = umask(0) ; + char slink[repolen + 8] ; + char sdir[repolen + 21] ; + char sold[repolen + 16] ; + + memcpy(slink, repo, repolen) ; + memcpy(slink + repolen, "/stores", 8) ; + memcpy(sdir, slink, repolen + 1) ; + memcpy(sdir + repolen + 1, ".stores:XXXXXX", 15) ; + memcpy(sold, slink, repolen + 1) ; + + if (!mkdtemp(sdir)) + { + umask(m) ; + strerr_warnfu2sys("mkdtemp ", sdir) ; + return 0 ; + } + umask(m) ; + sdir[repolen + 15] = '/' ; + sdir[repolen + 20] = 0 ; + for (uint16_t i = 0 ; i < n ; i++) + { + uint160_xfmt(sdir + repolen + 16, i, 4) ; + if (symlink(stores[i], sdir) == -1) + { + strerr_warnfu4sys("symlink ", stores[i], " to ", sdir) ; + sdir[repolen + 15] = 0 ; + goto err ; + } + } + sdir[repolen + 15] = 0 ; + if (chmod(sdir, 02755) == -1) + { + strerr_warnfu2sys("chmod ", sdir) ; + goto err ; + } + if (!atomic_symlink4(sdir + repolen + 1, slink, sold + repolen + 1, 15)) + { + strerr_warnfu4sys("atomically symlink ", sdir + repolen + 1, " to ", slink) ; + goto err ; + } + rm_rf(sold) ; + return 1 ; + + err: + rm_rf(sdir) ; + return 0 ; +} diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c index 8e5956b..df462ad 100644 --- a/src/libs6rc/s6rc_repo_sync.c +++ b/src/libs6rc/s6rc_repo_sync.c @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include #include @@ -31,13 +31,13 @@ static inline void cleanup (char const *ato, char const *bun) int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuser) { size_t repolen = strlen(repo) ; - char store[repolen + 17] ; + char store[repolen + 13] ; char ato[repolen + 26] ; char bun[repolen + 26] ; memcpy(store, repo, repolen) ; memcpy(store + repolen, "/stores/", 8) ; - store[repolen + 16] = 0 ; + store[repolen + 12] = 0 ; /* Fill new .atomics/ and .bundles/ with symlinks to real stores */ @@ -69,10 +69,10 @@ int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuse return 0 ; } - for (uint32_t istore = 0 ;; istore++) + for (uint16_t istore = 0 ;; istore++) { DIR *dir ; - uint320_xfmt(store + repolen + 8, istore, 8) ; + uint160_xfmt(store + repolen + 8, istore, 4) ; dir = opendir(store) ; if (!dir) { @@ -92,11 +92,11 @@ int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuse { char const *x ; char dst[repolen + 28 + len] ; - char src[26 + len] ; + char src[22 + len] ; memcpy(src, "../../../stores/", 16) ; - memcpy(src + 16, store + repolen + 8, 8) ; - src[24] = '/' ; - memcpy(src + 25, d->d_name, len+1) ; + memcpy(src + 16, store + repolen + 8, 4) ; + src[20] = '/' ; + memcpy(src + 21, d->d_name, len+1) ; switch (s6rc_type_check(-1, src)) { case 1 : -- cgit v1.3.1