aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-08-05 19:54:42 +0000
committerLaurent Bercot <ska@appnovation.com>2025-08-05 19:54:42 +0000
commitf513ab225005661e9b4674a1b333abea0c6670f0 (patch)
treeb15bdaf249ebef53e8df9eabd54a8eebfceff068 /src
parent3ac4d03e5ea8f24b913025b71a48e4d03929cde6 (diff)
downloads6-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.h18
-rw-r--r--src/libs6rc/deps-lib/s6rc15
-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.c11
-rw-r--r--src/libs6rc/s6rc_repo_listalldeps.c8
-rw-r--r--src/libs6rc/s6rc_repo_listdeps.c8
-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.c59
-rw-r--r--src/libs6rc/s6rc_repo_makebbuild.c87
-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.c10
-rw-r--r--src/libs6rc/s6rc_repo_set_listalldeps.c8
-rw-r--r--src/libs6rc/s6rc_repo_set_listdeps.c8
-rw-r--r--src/libs6rc/s6rc_repo_sync.c4
-rw-r--r--src/repo/s6-rc-set-new.c58
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)