aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2026-01-24 04:31:44 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2026-01-24 04:31:44 +0000
commit38e8fd341f427a1395c1d5869d69eb67a3c24698 (patch)
treee8b60d5c9229b411fcad30f41e5f2402b5359652
parent2197af3f9a21e9d042b34241d05489c7bfa2e0a6 (diff)
downloads6-rc-38e8fd341f427a1395c1d5869d69eb67a3c24698.tar.gz
Fix bugs in repo_syncset and repo_makesetbundles, refactor a bit
Also add an extra bundle in the demo store in order to test. Imports of store bundles didn't work properly; now they do. Sets were not properly synced on store change; now they are.
-rw-r--r--examples/demo/1/bundle-n10-n11/contents.d/N10-pipeline0
-rw-r--r--examples/demo/1/bundle-n10-n11/contents.d/N11-pipeline0
-rw-r--r--examples/demo/1/bundle-n10-n11/type1
-rw-r--r--src/repo/s6rc_repo_makesetbundles.c116
-rw-r--r--src/repo/s6rc_repo_syncset_tmp.c22
5 files changed, 68 insertions, 71 deletions
diff --git a/examples/demo/1/bundle-n10-n11/contents.d/N10-pipeline b/examples/demo/1/bundle-n10-n11/contents.d/N10-pipeline
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/examples/demo/1/bundle-n10-n11/contents.d/N10-pipeline
diff --git a/examples/demo/1/bundle-n10-n11/contents.d/N11-pipeline b/examples/demo/1/bundle-n10-n11/contents.d/N11-pipeline
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/examples/demo/1/bundle-n10-n11/contents.d/N11-pipeline
diff --git a/examples/demo/1/bundle-n10-n11/type b/examples/demo/1/bundle-n10-n11/type
new file mode 100644
index 0000000..757b422
--- /dev/null
+++ b/examples/demo/1/bundle-n10-n11/type
@@ -0,0 +1 @@
+bundle
diff --git a/src/repo/s6rc_repo_makesetbundles.c b/src/repo/s6rc_repo_makesetbundles.c
index 64e269c..5053ac5 100644
--- a/src/repo/s6rc_repo_makesetbundles.c
+++ b/src/repo/s6rc_repo_makesetbundles.c
@@ -17,6 +17,24 @@
#include <s6-rc/repo.h>
+static int dosymlink (char const *dst, size_t dstlen, char const *name)
+{
+ size_t len = strlen(name) ;
+ char target[16 + len] ;
+ char fn[dstlen + len + 2] ;
+ memcpy(target, "../../.bundles/", 15) ;
+ memcpy(target + 15, name, len+1) ;
+ memcpy(fn, dst, dstlen) ;
+ fn[dstlen] = '/' ;
+ memcpy(fn + dstlen + 1, name, len+1) ;
+ if (symlink(target, fn) == -1)
+ {
+ strerr_warnfu4sys("symlink ", target, " to ", fn) ;
+ return 0 ;
+ }
+ return 1 ;
+}
+
int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int verbosity)
{
size_t repolen = strlen(repo) ;
@@ -32,17 +50,29 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
memcpy(dst + repolen + 9 + setlen, "/bundle", 8) ;
memcpy(src, dst, repolen + 9) ;
memcpy(src + repolen + 9, ".bundles", 9) ;
- rm_rf_tmp(dst, &sa) ;
+ rm_rf(dst) ;
+ if (mkdir(dst, 02755) == -1)
+ {
+ strerr_warnfu2sys("mkdir ", dst) ;
+ return 0 ;
+ }
n = s6rc_repo_listsub(repo, set, s6rc_repo_subnames[0], &sa, &ga) ;
if (n < 0)
{
- strerr_warnfu6sys("list sub ", s6rc_repo_subnames[0], " of set ", set, " in repository ", repo) ;
+ strerr_warnfu6sys("list sub ", s6rc_repo_subnames[0], " of set ", set, " in repository ", repo) ;
+ goto err ;
+ }
+
+ DIR *dir = opendir(src) ;
+ if (!dir)
+ {
+ strerr_warnfu2sys("opendir ", src) ;
goto err ;
}
+
if (n)
{
- DIR *dir ;
char const *masked[n] ;
char maskedstorage[sa.len] ;
memcpy(maskedstorage, sa.s, sa.len) ;
@@ -51,20 +81,10 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
genalloc_setlen(size_t, &ga, 0) ;
qsort(masked, n, sizeof(char const *), &str_cmp) ;
- if (mkdir(dst, 02755) == -1)
- {
- strerr_warnfu2sys("mkdir ", dst) ;
- goto errga ;
- }
- dir = opendir(src) ;
- if (!dir)
- {
- strerr_warnfu2sys("opendir ", src) ;
- goto err0 ;
- }
for (;;)
{
- int e, i = 0 ;
+ int e ;
+ unsigned int i = 0 ;
direntry *d ;
errno = 0 ;
d = readdir(dir) ;
@@ -74,11 +94,7 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
sa.len = 0 ;
genalloc_setlen(size_t, &ga, 0) ;
e = s6rc_repo_listcontents(repo, d->d_name, &sa, &ga) ;
- if (e)
- {
- dir_close(dir) ;
- goto err0 ;
- }
+ if (e) goto err0 ;
for (; i < genalloc_len(size_t, &ga) ; i++)
{
@@ -91,64 +107,42 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
}
}
if (i < genalloc_len(size_t, &ga)) continue ;
-
- size_t len = strlen(d->d_name) ;
- char target[16 + len] ;
- char fn[repolen + setlen + 18 + len] ;
- memcpy(target, "../../.bundles/", 15) ;
- memcpy(target + 15, d->d_name, len+1) ;
- memcpy(fn, dst, repolen + setlen + 16) ;
- fn[repolen + setlen + 16] = '/' ;
- memcpy(fn + repolen + setlen + 17, d->d_name, len+1) ;
- if (symlink(target, fn) == -1)
- {
- strerr_warnfu4sys("symlink ", target, " to ", fn) ;
- dir_close(dir) ;
- goto err0 ;
- }
- }
- dir_close(dir) ;
- if (errno)
- {
- strerr_warnfu2sys("readdir ", src) ;
- goto err0 ;
+ if (!dosymlink(dst, repolen + setlen + 16, d->d_name)) goto err0 ;
}
}
else
{
- int r ;
- char realsrc[repolen + 28] ;
- memcpy(realsrc, src, repolen + 9) ;
- r = readlink(src, realsrc + repolen + 9, 17) ;
- if (r == -1)
- {
- strerr_warnfu2sys("readlink ", src) ;
- goto err0 ;
- }
- if (r != 16)
- {
- strerr_warnf2x("invalid symlink for ", src) ;
- goto err0 ;
- }
- if (!hiercopy_tmp(realsrc, dst, &sa))
+ for (;;)
{
- strerr_warnfu4sys("recursively copy ", realsrc, " to ", dst) ;
- goto err0 ;
+ direntry *d ;
+ errno = 0 ;
+ d = readdir(dir) ;
+ if (!d) break ;
+ if (d->d_name[0] == '.') continue ;
+ if (!dosymlink(dst, repolen + setlen + 16, d->d_name)) goto err0 ;
}
}
+ if (errno)
+ {
+ strerr_warnfu2sys("readdir ", src) ;
+ goto err0 ;
+ }
+
+ dir_close(dir) ;
+ genalloc_free(size_t, &ga) ;
stralloc_free(&sa) ;
return 1 ;
err0:
+ dir_close(dir) ;
+ err:
{
int e = errno ;
- rm_rf_tmp(dst, &sa) ;
+ rm_rf(dst) ;
errno = e ;
}
- errga:
genalloc_free(size_t, &ga) ;
- err:
stralloc_free(&sa) ;
return 0 ;
}
diff --git a/src/repo/s6rc_repo_syncset_tmp.c b/src/repo/s6rc_repo_syncset_tmp.c
index 0437939..963a87a 100644
--- a/src/repo/s6rc_repo_syncset_tmp.c
+++ b/src/repo/s6rc_repo_syncset_tmp.c
@@ -3,8 +3,10 @@
#include <string.h>
#include <stdint.h>
#include <unistd.h>
+#include <unistd.h>
#include <errno.h>
+#include <skalibs/bytestr.h>
#include <skalibs/direntry.h>
#include <skalibs/posixplz.h>
#include <skalibs/strerr.h>
@@ -13,17 +15,16 @@
#include <s6-rc/repo.h>
-static int unlink_stales_in_sub (char const *repo, size_t repolen, char const *set, char const *sub, uint32_t where, stralloc *sa, genalloc *ga, unsigned int verbosity)
+static int unlink_stales_in_sub (char const *repo, size_t repolen, char const *set, uint8_t sub, stralloc *sa, genalloc *ga, unsigned int verbosity)
{
size_t setlen = strlen(set) ;
- size_t sublen = strlen(sub) ;
- size_t subfnlen = repolen + setlen + sublen + 10 ;
+ size_t subfnlen = repolen + setlen + 16 ;
char subfn[subfnlen + 1] ;
memcpy(subfn, repo, repolen) ;
memcpy(subfn + repolen, "/sources/", 9) ;
memcpy(subfn + repolen + 9, set, setlen) ;
subfn[repolen + 9 + setlen] = '/' ;
- memcpy(subfn + repolen + 10 + setlen, sub, sublen + 1) ;
+ memcpy(subfn + repolen + 10 + setlen, s6rc_repo_subnames[sub], 7) ;
DIR *dir = opendir(subfn) ;
if (!dir)
{
@@ -40,9 +41,9 @@ static int unlink_stales_in_sub (char const *repo, size_t repolen, char const *s
if (d->d_name[0] == '.') continue ;
len = strlen(d->d_name) ;
char fn[subfnlen + len + 2] ;
- memcpy(fn, subfn, sublen) ;
- fn[sublen] = '/' ;
- memcpy(fn + sublen + 1, d->d_name, len+1) ;
+ memcpy(fn, subfn, subfnlen) ;
+ fn[subfnlen] = '/' ;
+ memcpy(fn + subfnlen + 1, d->d_name, len+1) ;
if (access(fn, F_OK) == -1)
{
if (errno != ENOENT)
@@ -52,7 +53,7 @@ static int unlink_stales_in_sub (char const *repo, size_t repolen, char const *s
}
unlink_void(fn) ;
if (verbosity >= 3)
- strerr_warni6x("service ", d->d_name, " does not exist anymore, removed from sub ", sub, " of set ", set) ;
+ strerr_warni6x("service ", d->d_name, " does not exist anymore, removed from sub ", s6rc_repo_subnames[sub], " of set ", set) ;
}
else
{
@@ -80,13 +81,14 @@ int s6rc_repo_syncset_tmp (char const *repo, char const *set, stralloc *sa, gena
size_t sabase = sa->len ;
size_t gabase = genalloc_len(size_t, ga) ;
- for (unsigned int i = 0 ; i < 4 ; i++)
- if (!unlink_stales_in_sub(repo, repolen, set, s6rc_repo_subnames[i], i, sa, ga, verbosity)) goto err ;
+ for (uint8_t sub = 0 ; sub < 4 ; sub++)
+ if (!unlink_stales_in_sub(repo, repolen, set, sub, sa, ga, verbosity)) goto err ;
{
uint32_t n = genalloc_len(size_t, ga) ;
char const *stillhere[n + !n] ;
for (uint32_t i = 0 ; i < n ; i++) stillhere[i] = sa->s + genalloc_s(size_t, ga)[i] ;
+ qsort(stillhere, n, sizeof(char const *), &str_cmp) ;
if (!s6rc_repo_fillset(repo, set, stillhere, n)) goto err ;
}