aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6rc
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-09-15 23:15:06 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-09-15 23:15:06 +0000
commitd6d77527fa55d59e47b8e8fa301ab004894bc467 (patch)
tree505eb5ffd60fb9136fdddfa14e92a8f6f81375e2 /src/libs6rc
parent094f6e3d0284f0ee97615e4433a100208668698a (diff)
downloads6-rc-d6d77527fa55d59e47b8e8fa301ab004894bc467.tar.gz
Add s6-rc-set-changestate. FINALLY.
Diffstat (limited to 'src/libs6rc')
-rw-r--r--src/libs6rc/deps-lib/s6rc3
-rw-r--r--src/libs6rc/s6rc_repo_badsub.c22
-rw-r--r--src/libs6rc/s6rc_repo_makesvlist.c12
-rw-r--r--src/libs6rc/s6rc_repo_moveservices.c25
-rw-r--r--src/libs6rc/s6rc_repo_sv_bcmpr.c13
-rw-r--r--src/libs6rc/s6rc_repo_sv_cmp.c11
-rw-r--r--src/libs6rc/s6rc_repo_sv_cmpr.c11
7 files changed, 52 insertions, 45 deletions
diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc
index 79ccc20..a155e34 100644
--- a/src/libs6rc/deps-lib/s6rc
+++ b/src/libs6rc/deps-lib/s6rc
@@ -31,7 +31,8 @@ s6rc_repo_moveservices.o
s6rc_repo_refcompile.o
s6rc_repo_setcompile.o
s6rc_repo_subnames.o
-s6rc_repo_sv_cmp.o
+s6rc_repo_sv_bcmpr.o
+s6rc_repo_sv_cmpr.o
s6rc_repo_sync.o
s6rc_sanitize_dir.o
s6rc_servicedir_internal.o
diff --git a/src/libs6rc/s6rc_repo_badsub.c b/src/libs6rc/s6rc_repo_badsub.c
index cba02b8..1848870 100644
--- a/src/libs6rc/s6rc_repo_badsub.c
+++ b/src/libs6rc/s6rc_repo_badsub.c
@@ -13,22 +13,12 @@
#include <s6-rc/repo.h>
-static int s6rc_repo_sv_bcmpr (void const *a, void const *b, void *aux)
-{
- char const *key = a ;
- s6rc_repo_sv const *elem = b ;
- stralloc *sa = aux ;
- return strcmp(key, sa->s + elem->pos) ;
-}
-
static int strqcmp (void const *a, void const *b)
{
- char const *const *aa = a ;
- char const *const *bb = b ;
- return strcmp(*aa, *bb) ;
+ return strcmp(*(char const *const *)a, *(char const *const *)b) ;
}
-int s6rc_repo_badsub (char const *repo, char const *set, char const **services, size_t n, uint8_t newsub, s6rc_repo_sv const *svlist, size_t nlist, stralloc *sa, genalloc *badga)
+int s6rc_repo_badsub (char const *repo, char const *set, char const **services, uint32_t n, uint8_t newsub, s6rc_repo_sv const *svlist, uint32_t ntot, stralloc *sa, genalloc *badga)
{
int sawasnull = !!sa->s ;
size_t sabase = sa->len ;
@@ -43,12 +33,12 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services,
fulln = genalloc_len(size_t, &fulldeps) ;
ind = genalloc_s(size_t, &fulldeps) ;
- for (size_t i = 0 ; i < fulln ; i++)
+ for (uint32_t i = 0 ; i < fulln ; i++)
{
s6rc_repo_sv *p ;
char const *cur = sa->s + ind[i] ;
if (bsearch(&cur, services, n, sizeof(char const *), &strqcmp)) continue ;
- p = bsearchr(cur, svlist, nlist, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, sa) ;
+ p = bsearchr(cur, svlist, ntot, sizeof(s6rc_repo_sv), &s6rc_repo_sv_bcmpr, sa->s) ;
if (!p)
{
strerr_warnfu6x("find service ", cur, " in set ", set, " of repository ", repo) ;
@@ -56,8 +46,8 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services,
}
if (newsub >= 2 ? p->sub < newsub : p->sub > newsub)
{
- uint32_t n = p - svlist ;
- if (!genalloc_append(uint32_t, badga, &n))
+ uint32_t k = p - svlist ;
+ if (!genalloc_append(uint32_t, badga, &k))
{
strerr_warnfu1sys("make bad sub list") ;
goto err ;
diff --git a/src/libs6rc/s6rc_repo_makesvlist.c b/src/libs6rc/s6rc_repo_makesvlist.c
index 9cf0faa..3567bf7 100644
--- a/src/libs6rc/s6rc_repo_makesvlist.c
+++ b/src/libs6rc/s6rc_repo_makesvlist.c
@@ -12,8 +12,6 @@
#include <s6-rc/repo.h>
-#define dienomem() strerr_diefu1sys(111, "stralloc_catb")
-
static inline int s6rc_repo_addsub (char const *sub, uint8_t i, stralloc *sa, genalloc *ga)
{
DIR *dir = opendir(sub) ;
@@ -27,12 +25,16 @@ static inline int s6rc_repo_addsub (char const *sub, uint8_t i, stralloc *sa, ge
if (!d) break ;
if (d->d_name[0] == '.') continue ;
- if (!stralloc_cats(sa, d->d_name) || !stralloc_0(sa)) dienomem() ;
- if (!genalloc_append(s6rc_repo_sv, ga, &sv)) dienomem() ;
+ if (!stralloc_cats(sa, d->d_name) || !stralloc_0(sa)
+ || !genalloc_append(s6rc_repo_sv, ga, &sv)) goto nomem ;
}
dir_close(dir) ;
if (errno) { strerr_warnfu2sys("readdir ", sub) ; return 0 ; }
return 1 ;
+
+ nomem:
+ strerr_warnfu1sys("stralloc_catb") ;
+ return 0 ;
}
int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genalloc *ga)
@@ -54,7 +56,7 @@ int s6rc_repo_makesvlist (char const *repo, char const *set, stralloc *sa, genal
memcpy(subfn + repolen + setlen + 10, s6rc_repo_subnames[i], 7) ;
if (!s6rc_repo_addsub(subfn, i, sa, ga)) goto err ;
}
- qsortr(genalloc_s(s6rc_repo_sv, ga), genalloc_len(s6rc_repo_sv, ga), sizeof(s6rc_repo_sv), &s6rc_repo_sv_cmp, sa) ;
+ qsortr(genalloc_s(s6rc_repo_sv, ga), genalloc_len(s6rc_repo_sv, ga), sizeof(s6rc_repo_sv), &s6rc_repo_sv_cmpr, sa->s) ;
return 1 ;
err:
diff --git a/src/libs6rc/s6rc_repo_moveservices.c b/src/libs6rc/s6rc_repo_moveservices.c
index fb4bf9f..3cc3b92 100644
--- a/src/libs6rc/s6rc_repo_moveservices.c
+++ b/src/libs6rc/s6rc_repo_moveservices.c
@@ -9,14 +9,14 @@
#include <s6-rc/repo.h>
-int s6rc_repo_moveservices (char const *repo, char const *set, char const *const *services, size_t n, uint8_t oldsub, uint8_t newsub, unsigned int verbosity)
+int s6rc_repo_moveservices (char const *repo, char const *set, s6rc_repo_sv const *services, uint32_t n, uint8_t newsub, char const *storage, unsigned int verbosity)
{
size_t repolen = strlen(repo) ;
size_t setlen = strlen(set) ;
size_t maxserviceslen = 0 ;
- for (size_t i = 0 ; i < n ; i++)
+ for (uint32_t i = 0 ; i < n ; i++)
{
- size_t len = strlen(services[i]) ;
+ size_t len = strlen(storage + services[i].pos) ;
if (len > maxserviceslen) maxserviceslen = len ;
}
char oldfn[repolen + setlen + maxserviceslen + 18] ;
@@ -25,20 +25,21 @@ int s6rc_repo_moveservices (char const *repo, char const *set, char const *const
memcpy(oldfn + repolen, "/sources/", 9) ;
memcpy(oldfn + repolen + 9, set, setlen) ;
oldfn[repolen + 9 + setlen] = '/' ;
- memcpy(oldfn + repolen + 10 + setlen, s6rc_repo_subnames[oldsub], 6) ;
oldfn[repolen + 16 + setlen] = '/' ;
- memcpy(newfn, oldfn, repolen + 17 + setlen) ;
+ memcpy(newfn, oldfn, repolen + 10 + setlen) ;
memcpy(newfn + repolen + 10 + setlen, s6rc_repo_subnames[newsub], 6) ;
+ newfn[repolen + 16 + setlen] = '/' ;
- for (size_t i = 0 ; i < n ; i++)
+ for (uint32_t i = 0 ; i < n ; i++)
{
- size_t len = strlen(services[i]) ;
- memcpy(oldfn + repolen + setlen + 17, services[i], len + 1) ;
- memcpy(newfn + repolen + setlen + 17, services[i], len + 1) ;
+ size_t len = strlen(storage + services[i].pos) ;
+ memcpy(oldfn + repolen + 10, s6rc_repo_subnames[services[i].sub], 6) ;
+ memcpy(oldfn + repolen + setlen + 17, storage + services[i].pos, len + 1) ;
+ memcpy(newfn + repolen + setlen + 17, storage + services[i].pos, len + 1) ;
if (access(newfn, F_OK) == 0)
{
if (verbosity >= 2)
- strerr_warni8x("service ", services[i], " already existed in subset ", s6rc_repo_subnames[newsub], " of set ", set, " in repository ", repo) ;
+ strerr_warni8x("service ", storage + services[i].pos, " already existed in subset ", s6rc_repo_subnames[newsub], " of set ", set, " in repository ", repo) ;
}
else if (errno != ENOENT)
{
@@ -50,9 +51,9 @@ int s6rc_repo_moveservices (char const *repo, char const *set, char const *const
strerr_warnfu4sys("rename ", oldfn, " to ", newfn) ;
return 0 ;
}
- if (verbosity >= 3)
+ if (verbosity >= 4)
{
- strerr_warnt10x("repository ", repo, ", set ", set, ", from subset ", s6rc_repo_subnames[oldsub], " to subset ", s6rc_repo_subnames[newsub], ": successfully moved service ", services[i]) ;
+ strerr_warnt10x("repository ", repo, ", set ", set, ", from subset ", s6rc_repo_subnames[services[i].sub], " to subset ", s6rc_repo_subnames[newsub], ": successfully moved service ", storage + services[i].pos) ;
}
}
return 1 ;
diff --git a/src/libs6rc/s6rc_repo_sv_bcmpr.c b/src/libs6rc/s6rc_repo_sv_bcmpr.c
new file mode 100644
index 0000000..bcc4d80
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_sv_bcmpr.c
@@ -0,0 +1,13 @@
+/* ISC license. */
+
+#include <string.h>
+
+#include <s6-rc/repo.h>
+
+int s6rc_repo_sv_bcmpr (void const *a, void const *b, void *aux)
+{
+ char const *key = a ;
+ s6rc_repo_sv const *elem = b ;
+ char const *s = aux ;
+ return strcmp(key, s + elem->pos) ;
+}
diff --git a/src/libs6rc/s6rc_repo_sv_cmp.c b/src/libs6rc/s6rc_repo_sv_cmp.c
deleted file mode 100644
index 472e472..0000000
--- a/src/libs6rc/s6rc_repo_sv_cmp.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* ISC license. */
-
-#include <s6-rc/repo.h>
-
-int s6rc_repo_sv_cmp (void const *a, void const *b, void *aux)
-{
- s6rc_repo_sv const *aa = a ;
- s6rc_repo_sv const *bb = b ;
- stralloc *sa = aux ;
- return strcmp(sa->s + aa->pos, sa->s + bb->pos) ;
-}
diff --git a/src/libs6rc/s6rc_repo_sv_cmpr.c b/src/libs6rc/s6rc_repo_sv_cmpr.c
new file mode 100644
index 0000000..80b07c9
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_sv_cmpr.c
@@ -0,0 +1,11 @@
+/* ISC license. */
+
+#include <s6-rc/repo.h>
+
+int s6rc_repo_sv_cmpr (void const *a, void const *b, void *aux)
+{
+ s6rc_repo_sv const *aa = a ;
+ s6rc_repo_sv const *bb = b ;
+ char const *s = aux ;
+ return strcmp(s + aa->pos, s + bb->pos) ;
+}