diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-10-22 22:05:56 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-10-22 22:05:56 +0000 |
| commit | e0bcc0ef3466b7b5fc776d2e78d7e7ec027810c0 (patch) | |
| tree | d9686a3c25525760ef9ce5ed5594ec382b3fb6e7 /src/repo/s6rc_repo_makestores.c | |
| parent | 3b9836248ed7f5164140d63e96ece21973fc43f7 (diff) | |
| download | s6-rc-e0bcc0ef3466b7b5fc776d2e78d7e7ec027810c0.tar.gz | |
Separate libs6rcrepo
Diffstat (limited to 'src/repo/s6rc_repo_makestores.c')
| -rw-r--r-- | src/repo/s6rc_repo_makestores.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/repo/s6rc_repo_makestores.c b/src/repo/s6rc_repo_makestores.c new file mode 100644 index 0000000..f61f94c --- /dev/null +++ b/src/repo/s6rc_repo_makestores.c @@ -0,0 +1,65 @@ +/* ISC license. */ + +#include <string.h> +#include <stdint.h> +#include <unistd.h> +#include <stdlib.h> +#include <errno.h> + +#include <skalibs/uint16.h> +#include <skalibs/posixplz.h> +#include <skalibs/stat.h> +#include <skalibs/strerr.h> +#include <skalibs/djbunix.h> +#include <skalibs/unix-transactional.h> + +#include <s6-rc/repo.h> + +int s6rc_repo_makestores (char const *repo, char const *const *stores, uint16_t n, char *sold) +{ + size_t repolen = strlen(repo) ; + mode_t m = umask(0) ; + char slink[repolen + 8] ; + char sdir[repolen + 21] ; + + memcpy(slink, repo, repolen) ; + memcpy(slink + repolen, "/stores", 8) ; + memcpy(sdir, slink, repolen + 1) ; + memcpy(sdir + repolen + 1, ".stores:XXXXXX", 15) ; + + 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, 15)) + { + strerr_warnfu4sys("atomically symlink ", sdir + repolen + 1, " to ", slink) ; + goto err ; + } + return 1 ; + + err: + rm_rf(sdir) ; + return 0 ; +} |
