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/s6rc_repo_makestores.c | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/libs6rc/s6rc_repo_makestores.c (limited to 'src/libs6rc/s6rc_repo_makestores.c') 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 ; +} -- cgit v1.3.1