diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-07-05 00:22:45 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-07-05 00:22:45 +0000 |
| commit | 55131f86090252400176f09e047f17b7110854c8 (patch) | |
| tree | 0f36263e00eada8a59d4ae13a8077db17e39ecd2 /src | |
| parent | 39267e28adbb55e3a96d72a6a07887d5af367cf5 (diff) | |
| download | s6-rc-55131f86090252400176f09e047f17b7110854c8.tar.gz | |
bugfixes
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/repo/s6-rc-repo-init.c | 2 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-new.c | 55 |
2 files changed, 34 insertions, 23 deletions
diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c index 584d079..2b607f1 100644 --- a/src/repo/s6-rc-repo-init.c +++ b/src/repo/s6-rc-repo-init.c @@ -124,7 +124,7 @@ int main (int argc, char const *const *argv) if (!s6rc_repo_sync(repotmp, argv, argc, verbosity)) { cleanup(repotmp) ; - strerr_diefu2sys(111, "sync ", repotmp) ; + return 111 ; } if (chmod(repotmp, 02755) == -1) diff --git a/src/repo/s6-rc-set-new.c b/src/repo/s6-rc-set-new.c index 0304db1..b2ce315 100644 --- a/src/repo/s6-rc-set-new.c +++ b/src/repo/s6-rc-set-new.c @@ -30,11 +30,16 @@ static void cleanup (char const *fn) errno = e ; } -static inline void newset (char const *repo, size_t repolen, char const *everything, char const *setname) +static inline void newset (char const *repo, char const *setname) { + size_t repolen = strlen(repo) ; size_t setlen = strlen(setname) ; + char everything[repolen + 13] ; char fn[repolen + 10 + setlen] ; char tmp[repolen + 21 + setlen] ; + char cur[repolen + 28 + setlen] ; + memcpy(everything, repo, repolen) ; + memcpy(everything + repolen, "/.everything", 13) ; memcpy(fn, repo, repolen) ; memcpy(fn + repolen, "/sources/", 9) ; memcpy(fn + repolen + 9, setname, setlen + 1) ; @@ -47,15 +52,26 @@ static inline void newset (char const *repo, size_t repolen, char const *everyth memcpy(tmp + repolen + 9 + setlen, ":tmp:XXXXXX", 12) ; if (!mkdtemp(tmp)) strerr_diefu2sys(111, "mkdtemp ", tmp) ; + memcpy(cur, tmp, repolen + 20 + setlen) ; + memcpy(cur + repolen + 20 + setlen, "/lock", 6) ; + if (!openwritenclose_unsafe(cur, "", 0)) { - char lock[repolen + 28 + setlen] ; - memcpy(lock, tmp, repolen + 21 + setlen) ; - memcpy(lock + repolen + 21 + setlen, "/.lock", 7) ; - if (!openwritenclose_unsafe(lock, "", 0)) - { - cleanup(tmp) ; - strerr_diefu2sys(111, "create ", lock) ; - } + cleanup(tmp) ; + strerr_diefu2sys(111, "create ", cur) ; + } + + memcpy(cur + repolen + 21 + setlen, "masked", 7) ; + if (mkdir(cur, 02755) == -1) + { + cleanup(tmp) ; + strerr_diefu2sys(111, "mkdir ", cur) ; + } + + memcpy(cur + repolen + 21 + setlen, "active", 7) ; + if (mkdir(cur, 02755) == -1) + { + cleanup(tmp) ; + strerr_diefu2sys(111, "mkdir ", cur) ; } DIR *dir = opendir(everything) ; @@ -68,13 +84,13 @@ static inline void newset (char const *repo, size_t repolen, char const *everyth if (!d) break ; if (d->d_name[0] == '.') continue ; len = strlen(d->d_name) ; - char src[16 + len] ; - char dst[repolen + 22 + setlen + len] ; - memcpy(src, "../.everything/", 15) ; - memcpy(src + 15, d->d_name, len+1) ; - memcpy(dst, tmp, repolen + 20 + setlen) ; - dst[repolen + 20 + setlen] = '/' ; - memcpy(dst + repolen + 21 + setlen, d->d_name, len+1) ; + char src[19 + len] ; + char dst[repolen + 29 + setlen + len] ; + memcpy(src, "../../.everything/", 18) ; + memcpy(src + 18, d->d_name, len+1) ; + memcpy(dst, cur, repolen + 27 + setlen) ; + dst[repolen + 27 + setlen] = '/' ; + memcpy(dst + repolen + 28 + setlen, d->d_name, len+1) ; if (symlink(src, dst) == -1) { cleanup(tmp) ; @@ -115,7 +131,6 @@ static gol_arg const rgola[2] = int main (int argc, char const *const *argv) { - size_t repolen ; char const *repo = S6RC_REPO_BASE ; int fdlock ; unsigned int verbosity = 1 ; @@ -136,12 +151,8 @@ int main (int argc, char const *const *argv) fdlock = s6rc_repo_lock(repo, 1) ; if (fdlock == -1) strerr_diefu2sys(111, "lock ", repo) ; - repolen = strlen(repo) ; - char fn[repolen + 13] ; - memcpy(fn, repo, repolen) ; - memcpy(fn + repolen, "/.everything", 13) ; for (unsigned int i = 0 ; i < argc ; i++) - newset(repo, repolen, fn, argv[i]) ; + newset(repo, argv[i]) ; return 0 ; } |
