diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-08-05 19:54:42 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-08-05 19:54:42 +0000 |
| commit | f513ab225005661e9b4674a1b333abea0c6670f0 (patch) | |
| tree | b15bdaf249ebef53e8df9eabd54a8eebfceff068 /src | |
| parent | 3ac4d03e5ea8f24b913025b71a48e4d03929cde6 (diff) | |
| download | s6-rc-f513ab225005661e9b4674a1b333abea0c6670f0.tar.gz | |
Next additions: better bundle management and autobuild
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/s6-rc/repo.h | 18 | ||||
| -rw-r--r-- | src/libs6rc/deps-lib/s6rc | 15 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_compile.c (renamed from src/libs6rc/s6rc_repo_set_compile.c) | 4 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_defcompile.c | 11 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_listalldeps.c | 8 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_listdeps.c | 8 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_listdeps_internal.c (renamed from src/libs6rc/s6rc_repo_set_listdeps_internal.c) | 2 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_listsub.c | 59 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makebbuild.c | 87 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makedefbundle.c (renamed from src/libs6rc/s6rc_repo_set_makebundle.c) | 50 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_moveservices.c (renamed from src/libs6rc/s6rc_repo_set_moveservices.c) | 37 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_set_defcompile.c | 10 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_set_listalldeps.c | 8 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_set_listdeps.c | 8 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sync.c | 4 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-new.c | 58 |
16 files changed, 288 insertions, 99 deletions
diff --git a/src/include/s6-rc/repo.h b/src/include/s6-rc/repo.h index 958a135..ba55b9d 100644 --- a/src/include/s6-rc/repo.h +++ b/src/include/s6-rc/repo.h @@ -13,15 +13,17 @@ extern int s6rc_repo_cleanup (char const *) ; extern int s6rc_repo_sync (char const *, char const *const *, size_t, unsigned int, char const *) ; extern int s6rc_repo_lock (char const *, int) ; -#define S6RC_REPO_SET_COMPILE_BUFLEN(repolen, setlen) ((repolen) + (setlen) + 45) -extern int s6rc_repo_set_makebundle (char const *, char const *, char const *, char const *) ; -extern int s6rc_repo_set_compile (char const *, char const *, char const *const *, size_t, char *, unsigned int, char const *) ; -extern int s6rc_repo_set_defcompile (char const *, char const *, char const *, char *, unsigned int, char const *) ; +extern int s6rc_repo_makebbuild (char const *, char const *) ; +extern int s6rc_repo_makedefbundle (char const *, char const *, char const *) ; -extern int s6rc_repo_set_listdeps (char const *, char const *, stralloc *, genalloc *, int) ; -extern int s6rc_repo_set_listalldeps (char const *, char const *const *, size_t, stralloc *, genalloc *, int) ; -extern int s6rc_repo_set_listdeps_internal (char const *, char const *const *, size_t, stralloc *, genalloc *, uint32_t) ; +#define S6RC_REPO_COMPILE_BUFLEN(repolen, setlen) ((repolen) + (setlen) + 45) +extern int s6rc_repo_compile (char const *, char const *, char const *const *, size_t, char *, unsigned int, char const *) ; +extern int s6rc_repo_defcompile (char const *, char const *, char const *, char *, unsigned int, char const *) ; -extern int s6rc_repo_set_moveservices (char const *, char const *, char const *const *, size_t, char const *, char const *) ; +extern int s6rc_repo_listdeps (char const *, char const *, stralloc *, genalloc *, int) ; +extern int s6rc_repo_listalldeps (char const *, char const *const *, size_t, stralloc *, genalloc *, int) ; +extern int s6rc_repo_listdeps_internal (char const *, char const *const *, size_t, stralloc *, genalloc *, uint32_t) ; + +extern int s6rc_repo_moveservices (char const *, char const *, char const *const *, size_t, char const *, char const *, unsigned int) ; #endif diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc index 81e7385..b1ce2e8 100644 --- a/src/libs6rc/deps-lib/s6rc +++ b/src/libs6rc/deps-lib/s6rc @@ -15,14 +15,15 @@ s6rc_lock.o s6rc_nlto0.o s6rc_read_uint.o s6rc_repo_cleanup.o +s6rc_repo_listsub.o s6rc_repo_lock.o -s6rc_repo_set_compile.o -s6rc_repo_set_defcompile.o -s6rc_repo_set_listalldeps.o -s6rc_repo_set_listdeps.o -s6rc_repo_set_listdeps_internal.o -s6rc_repo_set_makebundle.o -s6rc_repo_set_moveservices.o +s6rc_repo_compile.o +s6rc_repo_defcompile.o +s6rc_repo_listalldeps.o +s6rc_repo_listdeps.o +s6rc_repo_listdeps_internal.o +s6rc_repo_makedefbundle.o +s6rc_repo_moveservices.o s6rc_repo_sync.o s6rc_sanitize_dir.o s6rc_servicedir_internal.o diff --git a/src/libs6rc/s6rc_repo_set_compile.c b/src/libs6rc/s6rc_repo_compile.c index 1ca5e56..db41f89 100644 --- a/src/libs6rc/s6rc_repo_set_compile.c +++ b/src/libs6rc/s6rc_repo_compile.c @@ -16,12 +16,12 @@ #include <s6-rc/config.h> #include <s6-rc/repo.h> -int s6rc_repo_set_compile (char const *repo, char const *set, char const *const *subs, size_t nsubs, char *oldc, unsigned int verbosity, char const *fdhuser) +int s6rc_repo_compile (char const *repo, char const *set, char const *const *subs, size_t nsubs, char *oldc, unsigned int verbosity, char const *fdhuser) { size_t repolen = strlen(repo) ; size_t setlen = strlen(set) ; size_t totsublen = 0 ; - char newc[S6RC_REPO_SET_COMPILE_BUFLEN(repolen, setlen)] ; + char newc[S6RC_REPO_COMPILE_BUFLEN(repolen, setlen)] ; memcpy(newc, repo, repolen) ; memcpy(newc + repolen, "/compiled/.", 11) ; memcpy(newc + repolen + 11, set, setlen) ; diff --git a/src/libs6rc/s6rc_repo_defcompile.c b/src/libs6rc/s6rc_repo_defcompile.c new file mode 100644 index 0000000..8446ba8 --- /dev/null +++ b/src/libs6rc/s6rc_repo_defcompile.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include <s6-rc/repo.h> + +int s6rc_repo_defcompile (char const *repo, char const *set, char const *bundle, char *oldc, unsigned int verbosity, char const *fdhuser) +{ + static char const *const subs[3] = { "active", "onboot", "bbuild" } ; + if (!s6rc_repo_makebbuild(repo, set)) return -1 ; + if (!s6rc_repo_makedefbundle(repo, set, bundle)) return -1 ; + return s6rc_repo_compile(repo, set, subs, 3, oldc, verbosity, fdhuser) ; +} diff --git a/src/libs6rc/s6rc_repo_listalldeps.c b/src/libs6rc/s6rc_repo_listalldeps.c new file mode 100644 index 0000000..1c5d4fa --- /dev/null +++ b/src/libs6rc/s6rc_repo_listalldeps.c @@ -0,0 +1,8 @@ +/* ISC license. */ + +#include <s6-rc/repo.h> + +int s6rc_repo_listalldeps (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, int up) +{ + return s6rc_repo_listdeps_internal(repo, services, n, storage, indices, 2 | !!up) ; +} diff --git a/src/libs6rc/s6rc_repo_listdeps.c b/src/libs6rc/s6rc_repo_listdeps.c new file mode 100644 index 0000000..4dfb495 --- /dev/null +++ b/src/libs6rc/s6rc_repo_listdeps.c @@ -0,0 +1,8 @@ +/* ISC license. */ + +#include <s6-rc/repo.h> + +int s6rc_repo_listdeps (char const *repo, char const *service, stralloc *storage, genalloc *indices, int up) +{ + return s6rc_repo_listdeps_internal(repo, &service, 1, storage, indices, !!up) ; +} diff --git a/src/libs6rc/s6rc_repo_set_listdeps_internal.c b/src/libs6rc/s6rc_repo_listdeps_internal.c index 9ca38e1..b424e2a 100644 --- a/src/libs6rc/s6rc_repo_set_listdeps_internal.c +++ b/src/libs6rc/s6rc_repo_listdeps_internal.c @@ -17,7 +17,7 @@ #include <s6-rc/s6rc-utils.h> #include <s6-rc/repo.h> -int s6rc_repo_set_listdeps_internal (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, uint32_t options) +int s6rc_repo_listdeps_internal (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, uint32_t options) { int swasnull = !storage->s ; int gwasnull = !indices->s ; diff --git a/src/libs6rc/s6rc_repo_listsub.c b/src/libs6rc/s6rc_repo_listsub.c new file mode 100644 index 0000000..eef0a7c --- /dev/null +++ b/src/libs6rc/s6rc_repo_listsub.c @@ -0,0 +1,59 @@ +/* ISC license. */ + +#include <string.h> +#include <errno.h> + +#include <skalibs/direntry.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> + +#include <s6-rc/repo.h> + +int s6rc_repo_listsub (char const *repo, char const *set, char const *sub, stralloc *sa, genalloc *ga) +{ + size_t sabase = sa->len ; + size_t gabase = genalloc_len(size_t, ga) ; + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + size_t sublen = strlen(sub) ; + int sawasnull = !sa->s ; + int gawasnull = !genalloc_s(size_t, ga) ; + int n = 0 ; + char fn[repolen + setlen + 10 + sublen] ; + memcpy(fn, repo, repolen) ; + memcpy(fn + repolen, "/sources/", 9) ; + memcpy(fn + repolen + 9, set, setlen) ; + memcpy(fn + repolen + 9 + setlen, sub, sublen) ; + + DIR *dir = opendir(fn) ; + if (!dir) + { + strerr_warnfu2sys("opendir ", fn) ; + return -1 ; + } + for (;;) + { + direntry *d ; + size_t len ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + len = strlen(d->d_name) ; + if (!genalloc_catb(size_t, ga, &sa->len, 1)) goto err ; + if (!stralloc_catb(sa, d->d_name, len+1)) goto err ; + n++ ; + } + if (errno) goto err ; + dir_close(dir) ; + return n ; + + err: + dir_close(dir) ; + if (gawasnull) genalloc_free(size_t, ga) ; + else genalloc_setlen(size_t, ga, gabase) ; + if (sawasnull) stralloc_free(sa) ; + else sa->len = sabase ; + return -1 ; +} diff --git a/src/libs6rc/s6rc_repo_makebbuild.c b/src/libs6rc/s6rc_repo_makebbuild.c new file mode 100644 index 0000000..942b055 --- /dev/null +++ b/src/libs6rc/s6rc_repo_makebbuild.c @@ -0,0 +1,87 @@ +/* ISC license. */ + +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> + +#include <skalibs/direntry.h> +#include <skalibs/strerr.h> +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> +#include <skalibs/djbunix.h> + +#include <s6-rc/repo.h> + +static int str_ref_cmp (void const *a, void const *b) +{ + return strcmp(*(char const *const *)a, *(char const *const *)b) ; +} + + +int s6rc_repo_makebbuild (char const *repo, char const *set) +{ + size_t repolen = strlen(repo) ; + size_t setlen = strlen(set) ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + int n ; + char src[repolen + 17 + setlen] ; + char dst[repolen + 17 + setlen] ; + memcpy(dst, repo, repolen) ; + memcpy(dst + repolen, "/sources/", 9) ; + memcpy(dst + repolen + 9, set, setlen) ; + memcpy(dst + repolen + 9 + setlen, "/bbuild", 8) ; + memcpy(src, dst, repolen + 10 + setlen) ; + memcpy(src + repolen + 10 + setlen, "bundle") ; + rmstar_tmp(dst, &sa) ; + + n = s6rc_repo_listsub(repo, set, "masked", &sa, &ga) ; + if (n < 0) goto err ; + if (n) + { + DIR *dir ; + char const *masked[n] ; + for (size_t i = 0 ; i < n ; i++) masked[i] = sa.s + genalloc_s(size_t, &ga)[i] ; + genalloc_free(size_t, &ga) ; + qsort(masked, n, sizeof(char const *), &str_ref_cmp) ; + dir = opendir(src) ; + if (!dir) goto err ; + for (;;) + { + direntry *d ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + if (bsearch(&d->d_name, masked, n, sizeof(char const *), &str_ref_cmp)) continue ; + size_t len = strlen(d->d_name) ; + char target[16 + len] ; + char fn[repolen + setlen + 18 + len] ; + memcpy(target, "../.everything/", 15) ; + memcpy(target + 15, d->d_name, len+1) ; + memcpy(fn, dst, repolen + setlen + 17) ; + memcpy(fn + repolen + setlen + 17, d->d_name, len+1) ; + if (symlink(target, fn) == -1) + { + strerr_warnfu4sys("make a symlink named ", fn, " pointing to ", target) ; + goto err0 ; + } + dir_close(dir) ; + if (errno) goto err0 ; + } + else if (!hiercopy_tmp(src, dst, &sa)) goto err ; + + stralloc_free(&sa) ; + return 1 ; + + err0: + { + int e = errno ; + rmstar_tmp(dst, &sa) ; + errno = e ; + } + err: + stralloc_free(&sa) ; + return 0 ; +} diff --git a/src/libs6rc/s6rc_repo_set_makebundle.c b/src/libs6rc/s6rc_repo_makedefbundle.c index fa52e40..0863abd 100644 --- a/src/libs6rc/s6rc_repo_set_makebundle.c +++ b/src/libs6rc/s6rc_repo_makedefbundle.c @@ -1,42 +1,66 @@ /* ISC license. */ #include <skalibs/bsdsnowflake.h> -#include <skalibs/nonposix.h> #include <string.h> +#include <unistd.h> #include <errno.h> #include <skalibs/stat.h> #include <skalibs/direntry.h> #include <skalibs/strerr.h> +#include <skalibs/stralloc.h> #include <skalibs/djbunix.h> #include <s6-rc/repo.h> -int s6rc_repo_set_makebundle (char const *repo, char const *set, char const *sub, char const *bundle) +int s6rc_repo_makedefbundle (char const *repo, char const *set, char const *bundle) { size_t repolen = strlen(repo) ; size_t setlen = strlen(set) ; - size_t sublen = strlen(sub) ; size_t bundlelen = strlen(bundle) ; size_t bfnlen = repolen + setlen + bundlelen + 28 ; DIR *dir ; char bfn[bfnlen + 1] ; - char subfn[repolen + setlen + sublen + 11] ; + char subfn[repolen + setlen + 17] ; memcpy(bfn, repo, repolen) ; - memcpy(bfn + repolen, "/sources/", 9) ; - memcpy(bfn + repolen + 9, set, setlen) ; - memcpy(bfn + repolen + 9 + setlen, "/bundle/", 8) ; - memcpy(bfn + repolen + 17 + setlen, bundle, bundlelen + 1) ; - if (rm_rf(bfn) == -1) + memcpy(bfn + repolen, "/sources/.everything/", 21) ; + memcpy(bfn + repolen + 21, bundle, bundlelen + 1) ; + if (access(bfn, F_OK) == -1) { - strerr_warnfu2sys("delete previous directory at ", bfn) ; - return 0 ; + if (errno != ENOENT) + { + strerr_warnfu2sys("check existence of ", bfn) ; + return 0 ; + } + } + else + { + stralloc sa = STRALLOC_ZERO ; + if (sareadlink(&sa, bfn) == -1) + { + strerr_warnfu2sys("readlink ", bfn) ; + return 0 ; + } + if (!stralloc_0(&sa)) + { + strerr_warnfu1sys("stralloc_catb ") ; + stralloc_free(&sa) ; + return 0 ; + } + strerr_warnf4x("bundle ", bundle, " is already defined at ", sa.s) ; + stralloc_free(&sa) ; + return (errno = EINVAL, 0) ; } + + memcpy(bfn + repolen + 9, set, setlen) ; + memcpy(bfn + repolen + 9 + setlen, "/bbuild/", 8) ; + memcpy(bfn + repolen + 17 + setlen, bundle, bundlelen + 1) ; if (mkdir(bfn, 02755) == -1) { - strerr_warnfu2sys("mkdir ", bfn) ; + if (errno != EEXIST) strerr_warnfu2sys("mkdir ", bfn) ; + else strerr_warnf6x("bundle ", bundle, " is already defined in set ", set, " of repository ", repo) ; return 0 ; } memcpy(bfn + repolen + setlen + 17 + bundlelen, "/type", 6) ; @@ -54,7 +78,7 @@ int s6rc_repo_set_makebundle (char const *repo, char const *set, char const *sub bfn[bfnlen] = '/' ; memcpy(subfn, bfn, repolen + 10 + setlen) ; - memcpy(subfn + repolen + 10 + setlen, sub, sublen + 1) ; + memcpy(subfn + repolen + 10 + setlen, "onboot", 7) ; dir = opendir(subfn) ; if (!dir) { diff --git a/src/libs6rc/s6rc_repo_set_moveservices.c b/src/libs6rc/s6rc_repo_moveservices.c index bdaba4a..8177fe7 100644 --- a/src/libs6rc/s6rc_repo_set_moveservices.c +++ b/src/libs6rc/s6rc_repo_moveservices.c @@ -1,6 +1,7 @@ /* ISC license. */ #include <string.h> +#include <unistd.h> #include <errno.h> #include <stdio.h> @@ -8,7 +9,7 @@ #include <s6-rc/repo.h> -int s6rc_repo_set_moveservices (char const *repo, char const *set, char const *const *services, size_t n, char const *fromsub, char const *tosub) +int s6rc_repo_moveservices (char const *repo, char const *set, char const *const *services, size_t n, char const *fromsub, char const *tosub, unsigned int verbosity) { size_t repolen = strlen(repo) ; size_t setlen = strlen(set) ; @@ -37,21 +38,25 @@ int s6rc_repo_set_moveservices (char const *repo, char const *set, char const *c size_t len = strlen(services[i]) ; memcpy(from + repolen + setlen + fromsublen + 11, services[i], len + 1) ; memcpy(to + repolen + setlen + tosublen + 11, services[i], len + 1) ; - if (rename(from, to) == -1) goto rollback ; + if (access(to, F_OK) == 0) + { + if (verbosity >= 2) + strerr_warni8x("service ", services[i], " already existed in subset ", tosub, " of set ", set, " in repository ", repo) ; + } + else if (errno != ENOENT) + { + strerr_warnfu2sys("access ", to) ; + return 0 ; + } + if (rename(from, to) == -1) + { + strerr_warnfu4sys("rename ", from, " to ", to) ; + return 0 ; + } + if (verbosity >= 3) + { + strerr_warnt10x("repository ", repo, ", set ", set, ", from subset ", fromsub, " to subset ", tosub, ": successfully moved service ", services[i]) ; + } } return 1 ; - - rollback: - int e = errno ; - strerr_warnfu4sys("rename ", from, " to ", to) ; - while (i--) - { - size_t len = strlen(services[i]) ; - memcpy(from + repolen + setlen + fromsublen + 11, services[i], len + 1) ; - memcpy(to + repolen + setlen + tosublen + 11, services[i], len + 1) ; - if (rename(to, from) == -1) - strerr_warnwu4sys("rollback ", to, " to ", from) ; - } - errno = e ; - return 0 ; } diff --git a/src/libs6rc/s6rc_repo_set_defcompile.c b/src/libs6rc/s6rc_repo_set_defcompile.c deleted file mode 100644 index ebd8a9d..0000000 --- a/src/libs6rc/s6rc_repo_set_defcompile.c +++ /dev/null @@ -1,10 +0,0 @@ -/* ISC license. */ - -#include <s6-rc/repo.h> - -int s6rc_repo_set_defcompile (char const *repo, char const *set, char const *bundle, char *oldc, unsigned int verbosity, char const *fdhuser) -{ - static char const *const subs[3] = { "active", "onboot", "bundle" } ; - if (!s6rc_repo_set_makebundle(repo, set, "onboot", bundle)) return -1 ; - return s6rc_repo_set_compile(repo, set, subs, 3, oldc, verbosity, fdhuser) ; -} diff --git a/src/libs6rc/s6rc_repo_set_listalldeps.c b/src/libs6rc/s6rc_repo_set_listalldeps.c deleted file mode 100644 index c5b14cc..0000000 --- a/src/libs6rc/s6rc_repo_set_listalldeps.c +++ /dev/null @@ -1,8 +0,0 @@ -/* ISC license. */ - -#include <s6-rc/repo.h> - -int s6rc_repo_set_listalldeps (char const *repo, char const *const *services, size_t n, stralloc *storage, genalloc *indices, int up) -{ - return s6rc_repo_set_listdeps_internal(repo, services, n, storage, indices, 2 | !!up) ; -} diff --git a/src/libs6rc/s6rc_repo_set_listdeps.c b/src/libs6rc/s6rc_repo_set_listdeps.c deleted file mode 100644 index 8442291..0000000 --- a/src/libs6rc/s6rc_repo_set_listdeps.c +++ /dev/null @@ -1,8 +0,0 @@ -/* ISC license. */ - -#include <s6-rc/repo.h> - -int s6rc_repo_set_listdeps (char const *repo, char const *service, stralloc *storage, genalloc *indices, int up) -{ - return s6rc_repo_set_listdeps_internal(repo, &service, 1, storage, indices, !!up) ; -} diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c index 4341bee..a0b6431 100644 --- a/src/libs6rc/s6rc_repo_sync.c +++ b/src/libs6rc/s6rc_repo_sync.c @@ -126,9 +126,9 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources if (!s6rc_repo_cleanup(repo)) return 0 ; { - size_t buflen = S6RC_REPO_SET_COMPILE_BUFLEN(repolen, sizeof(".everything") - 1) ; + size_t buflen = S6RC_REPO_COMPILE_BUFLEN(repolen, sizeof(".everything") - 1) ; char oldc[buflen] ; - int r = s6rc_repo_set_compile(repo, ".everything", 0, 0, oldc, verbosity, fdhuser) ; + int r = s6rc_repo_compile(repo, ".everything", 0, 0, oldc, verbosity, fdhuser) ; if (r <= 0) goto err0 ; if (r == 2) rm_rf(oldc) ; } diff --git a/src/repo/s6-rc-set-new.c b/src/repo/s6-rc-set-new.c index 06b55d0..74bab93 100644 --- a/src/repo/s6-rc-set-new.c +++ b/src/repo/s6-rc-set-new.c @@ -33,14 +33,13 @@ static void cleanup (char const *fn) static inline void newset (char const *repo, char const *setname) { - static char const sublist[4][7] = { "masked", "onboot", "bundle", "active" } ; + static char const sublist[5][7] = { "masked", "active", "onboot", "bundle", "bbuild" } ; size_t repolen = strlen(repo) ; size_t setlen = strlen(setname) ; char everything[repolen + 21] ; char fn[repolen + 10 + setlen] ; char tmp[repolen + 18 + setlen] ; - char act[repolen + 25 + setlen] ; - char onb[repolen + 25 + setlen] ; + char sub[repolen + 25 + setlen] ; memcpy(everything, repo, repolen) ; memcpy(everything + repolen, "/sources/.everything", 21) ; memcpy(fn, everything, repolen + 9) ; @@ -56,29 +55,29 @@ static inline void newset (char const *repo, char const *setname) memcpy(tmp + repolen + 10 + setlen, ":XXXXXX", 8) ; if (!mkdtemp(tmp)) strerr_diefu2sys(111, "mkdtemp ", tmp) ; - memcpy(act, tmp, repolen + 17 + setlen) ; - memcpy(act + repolen + 17 + setlen, "/lock", 6) ; - if (!openwritenclose_unsafe(act, "", 0)) + memcpy(sub, tmp, repolen + 17 + setlen) ; + memcpy(sub + repolen + 17 + setlen, "/lock", 6) ; + if (!openwritenclose_unsafe(sub, "", 0)) { cleanup(tmp) ; - strerr_diefu2sys(111, "create ", act) ; + strerr_diefu2sys(111, "create ", sub) ; } for (size_t i = 0 ; i < 4 ; i++) { - memcpy(act + repolen + 18 + setlen, sublist[i], 7) ; - if (mkdir(act, 02755) == -1) + memcpy(sub + repolen + 18 + setlen, sublist[i], 7) ; + if (mkdir(sub, 02755) == -1) { cleanup(tmp) ; - strerr_diefu2sys(111, "mkdir ", act) ; + strerr_diefu2sys(111, "mkdir ", sub) ; } } DIR *dir = opendir(everything) ; for (;;) { - char *cur = act ; size_t len ; + unsigned int subi = 1 ; direntry *d ; errno = 0 ; d = readdir(dir) ; @@ -89,21 +88,32 @@ static inline void newset (char const *repo, char const *setname) char src[len + 33] ; char dst[repolen + 26 + setlen + len] ; memcpy(src, "../.everything/", 15) ; - memcpy(src + 15, d->d_name, len) ; - memcpy(src + 15 + len, "/flag-essential", 16) ; - if (access(src, F_OK) == -1) + memcpy(src + 15, d->d_name, len+1) ; + switch (s6rc_type_check(-1, src)) { - if (errno != ENOENT) strerr_diefu2sys(111, "access ", src) ; + case -1 : strerr_diefu3sys(111, "check ", src, "/type") ; + case 0 : strerr_dief3x(102, "invalid ", src, "/type") ; + case 3 : subi = 3 ; break ; + default : + { + memcpy(src + 15 + len, "/flag-essential", 16) ; + if (access(src, F_OK) == -1) + { + if (errno != ENOENT) strerr_diefu2sys(111, "access ", src) ; + } + else subi = 2 ; + memcpy(src + 21 + len, "recommended", 12) ; + if (access(src, F_OK) == -1) + { + if (errno != ENOENT) strerr_diefu2sys(111, "access ", src) ; + } + else subi = 2 ; + src[15 + len] = 0 ; + break ; + } } - else cur = onb ; - memcpy(src + 21 + len, "recommended", 12) ; - if (access(src, F_OK) == -1) - { - if (errno != ENOENT) strerr_diefu2sys(111, "access ", src) ; - } - else cur = onb ; - src[15 + len] = 0 ; - memcpy(dst, cur, repolen + 24 + setlen) ; + memcpy(dst, sub, repolen + 18 + setlen) ; + memcpy(dst + repolen + 18 + setlen, sublist[subi], 6) ; dst[repolen + 24 + setlen] = '/' ; memcpy(dst + repolen + 25 + setlen, d->d_name, len+1) ; if (symlink(src, dst) == -1) |
