aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6rc
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-09-18 23:18:13 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-09-18 23:18:13 +0000
commit8671af033b2f5512e9138cbadcfc068b3ae3e135 (patch)
treebd7655e57e01ba283cbf1c17638e13c4714b9984 /src/libs6rc
parent3c4f07c296d743b535d74ebaff7f13919dea1ab9 (diff)
downloads6-rc-8671af033b2f5512e9138cbadcfc068b3ae3e135.tar.gz
Support bundles in changestate, various refactors
Diffstat (limited to 'src/libs6rc')
-rw-r--r--src/libs6rc/deps-lib/s6rc1
-rw-r--r--src/libs6rc/s6rc_repo_badsub.c10
-rw-r--r--src/libs6rc/s6rc_repo_compile.c6
-rw-r--r--src/libs6rc/s6rc_repo_fillset.c2
-rw-r--r--src/libs6rc/s6rc_repo_flattenservices.c73
-rw-r--r--src/libs6rc/s6rc_repo_listalldeps.c2
-rw-r--r--src/libs6rc/s6rc_repo_listdeps_internal.c24
-rw-r--r--src/libs6rc/s6rc_repo_setcompile.c26
8 files changed, 119 insertions, 25 deletions
diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc
index a155e34..62fdd6f 100644
--- a/src/libs6rc/deps-lib/s6rc
+++ b/src/libs6rc/deps-lib/s6rc
@@ -18,6 +18,7 @@ s6rc_repo_badsub.o
s6rc_repo_cleanup.o
s6rc_repo_compile.o
s6rc_repo_fillset.o
+s6rc_repo_flattenservices.o
s6rc_repo_listalldeps.o
s6rc_repo_listcontents.o
s6rc_repo_listdeps.o
diff --git a/src/libs6rc/s6rc_repo_badsub.c b/src/libs6rc/s6rc_repo_badsub.c
index 1848870..fc2a6ba 100644
--- a/src/libs6rc/s6rc_repo_badsub.c
+++ b/src/libs6rc/s6rc_repo_badsub.c
@@ -21,14 +21,18 @@ static int strqcmp (void const *a, void const *b)
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 ;
int gawasnull = !!genalloc_s(uint32_t, badga) ;
+ size_t sabase = sa->len ;
size_t gabase = genalloc_len(uint32_t, badga) ;
genalloc fulldeps = GENALLOC_ZERO ;
size_t fulln ;
size_t const *ind ;
+ uint32_t mid ;
+
+ if (newsub < 3 && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 0)) return 0 ;
+ mid = genalloc_len(size_t, &fulldeps) ;
+ if (newsub > 0 && s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, 1)) goto err ;
- if (s6rc_repo_listalldeps(repo, services, n, sa, &fulldeps, newsub >= 2) <= 0) return 0 ;
qsort(services, n, sizeof(char const *), &strqcmp) ;
fulln = genalloc_len(size_t, &fulldeps) ;
ind = genalloc_s(size_t, &fulldeps) ;
@@ -44,7 +48,7 @@ int s6rc_repo_badsub (char const *repo, char const *set, char const **services,
strerr_warnfu6x("find service ", cur, " in set ", set, " of repository ", repo) ;
goto err ;
}
- if (newsub >= 2 ? p->sub < newsub : p->sub > newsub)
+ if (i >= mid ? p->sub < newsub : p->sub > newsub)
{
uint32_t k = p - svlist ;
if (!genalloc_append(uint32_t, badga, &k))
diff --git a/src/libs6rc/s6rc_repo_compile.c b/src/libs6rc/s6rc_repo_compile.c
index 390219a..b31a981 100644
--- a/src/libs6rc/s6rc_repo_compile.c
+++ b/src/libs6rc/s6rc_repo_compile.c
@@ -16,7 +16,7 @@
#include <s6-rc/config.h>
#include <s6-rc/repo.h>
-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)
+int s6rc_repo_compile (char const *repo, char const *set, char const *const *subs, uint8_t nsubs, char *oldc, unsigned int verbosity, char const *fdhuser)
{
size_t repolen = strlen(repo) ;
size_t setlen = strlen(set) ;
@@ -31,7 +31,7 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *sub
memcpy(newc + repolen + 37 + setlen, ":XXXXXX", 8) ;
memcpy(oldc, newc, repolen + 10) ;
if (mkntemp(newc) == -1) { strerr_warnfu2sys("mkntemp ", newc) ; return -1 ; }
- for (size_t i = 0 ; i < nsubs ; i++) totsublen += strlen(subs[i]) + 1 ;
+ for (uint8_t i = 0 ; i < nsubs ; i++) totsublen += strlen(subs[i]) + 1 ;
{
pid_t pid ;
@@ -53,7 +53,7 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *sub
}
argv[m++] = "--" ;
argv[m++] = newc ;
- for (size_t i = 0 ; i < nsubs ; i++)
+ for (uint8_t i = 0 ; i < nsubs ; i++)
{
size_t sublen = strlen(subs[i]) ;
argv[m++] = w ;
diff --git a/src/libs6rc/s6rc_repo_fillset.c b/src/libs6rc/s6rc_repo_fillset.c
index 549de07..2332e3c 100644
--- a/src/libs6rc/s6rc_repo_fillset.c
+++ b/src/libs6rc/s6rc_repo_fillset.c
@@ -11,7 +11,7 @@
#include <s6-rc/s6rc-utils.h>
#include <s6-rc/repo.h>
-int s6rc_repo_fillset (char const *repo, char const *set, char const *const *existing, size_t n)
+int s6rc_repo_fillset (char const *repo, char const *set, char const *const *existing, uint32_t n)
{
size_t repolen = strlen(repo) ;
size_t setlen = strlen(set) ;
diff --git a/src/libs6rc/s6rc_repo_flattenservices.c b/src/libs6rc/s6rc_repo_flattenservices.c
new file mode 100644
index 0000000..15363ac
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_flattenservices.c
@@ -0,0 +1,73 @@
+/* ISC license. */
+
+#include <sys/wait.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <skalibs/posixplz.h>
+#include <skalibs/types.h>
+#include <skalibs/strerr.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
+#include <skalibs/cspawn.h>
+#include <skalibs/djbunix.h>
+
+#include <s6-rc/config.h>
+#include <s6-rc/s6rc-utils.h>
+#include <s6-rc/repo.h>
+
+int s6rc_repo_flattenservices (char const *repo, char const *const *services, uint32_t n, stralloc *storage, genalloc *indices)
+{
+ int swasnull = !storage->s ;
+ int gwasnull = !indices->s ;
+ size_t sabase = storage->len ;
+ size_t gabase = genalloc_len(size_t, indices) ;
+
+ {
+ size_t m = 0 ;
+ size_t repolen = strlen(repo) ;
+ pid_t pid ;
+ int fd ;
+ int wstat ;
+ char const *argv[7 + n] ;
+ char refdb[repolen + 15] ;
+ memcpy(refdb, repo, repolen) ;
+ memcpy(refdb + repolen, "/compiled/.ref", 15) ;
+ argv[m++] = S6RC_BINPREFIX "s6-rc-db" ;
+ argv[m++] = "-c";
+ argv[m++] = refdb ;
+ argv[m++] = "-b" ;
+ argv[m++] = "--" ;
+ argv[m++] = "atomics" ;
+ for (size_t i = 0 ; i < n ; i++) argv[m++] = services[i] ;
+ argv[m++] = 0 ;
+ pid = child_spawn1_pipe(argv[0], argv, (char const *const *)environ, &fd, 1) ;
+ if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return 111 ; }
+ if (!slurpn(fd, storage, 0)) { strerr_warnfu2sys("read output from ", argv[0]) ; return 111 ; }
+ fd_close(fd) ;
+ if (wait_pid(pid, &wstat) == -1)
+ {
+ strerr_warnfu2sys("wait for ", argv[0]) ;
+ goto err ;
+ }
+ if (WIFSIGNALED(wstat))
+ {
+ char fmt[UINT_FMT] ;
+ fmt[uint_fmt(fmt, WTERMSIG(wstat))] = 0 ;
+ strerr_warnf3x(argv[0], " crashed with signal ", fmt) ;
+ goto err ;
+ }
+ if (WEXITSTATUS(wstat)) return WEXITSTATUS(wstat) ;
+ }
+
+ if (!s6rc_nlto0(storage->s + sabase, sabase, storage->len, indices)) goto err ;
+ return 0 ;
+
+ err:
+ if (gwasnull) genalloc_free(size_t, indices) ;
+ else genalloc_setlen(size_t, indices, gabase) ;
+ if (swasnull) stralloc_free(storage) ;
+ else storage->len = sabase ;
+ return 111 ;
+}
diff --git a/src/libs6rc/s6rc_repo_listalldeps.c b/src/libs6rc/s6rc_repo_listalldeps.c
index 1c5d4fa..7e9aca6 100644
--- a/src/libs6rc/s6rc_repo_listalldeps.c
+++ b/src/libs6rc/s6rc_repo_listalldeps.c
@@ -2,7 +2,7 @@
#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)
+int s6rc_repo_listalldeps (char const *repo, char const *const *services, uint32_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_internal.c b/src/libs6rc/s6rc_repo_listdeps_internal.c
index 033d3c2..30ecf26 100644
--- a/src/libs6rc/s6rc_repo_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_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, uint32_t n, stralloc *storage, genalloc *indices, uint32_t options)
{
int swasnull = !storage->s ;
int gwasnull = !indices->s ;
@@ -41,40 +41,34 @@ int s6rc_repo_listdeps_internal (char const *repo, char const *const *services,
argv[m++] = options & 1 ? "-u" : "-d" ;
argv[m++] = "--" ;
argv[m++] = options & 2 ? "all-dependencies" : "dependencies" ;
- for (size_t i = 0 ; i < n ; i++) argv[m++] = services[i] ;
+ for (uint32_t i = 0 ; i < n ; i++) argv[m++] = services[i] ;
argv[m++] = 0 ;
pid = child_spawn1_pipe(argv[0], argv, (char const *const *)environ, &fd, 1) ;
- if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return -1 ; }
- if (!slurpn(fd, storage, 0)) { strerr_warnfu2sys("read output from ", argv[0]) ; return -1 ; }
+ if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return 111 ; }
+ if (!slurpn(fd, storage, 0)) { strerr_warnfu2sys("read output from ", argv[0]) ; return 111 ; }
fd_close(fd) ;
if (wait_pid(pid, &wstat) == -1)
{
strerr_warnfu2sys("wait for ", argv[0]) ;
- return -1 ;
+ goto err ;
}
if (WIFSIGNALED(wstat))
{
char fmt[UINT_FMT] ;
fmt[uint_fmt(fmt, WTERMSIG(wstat))] = 0 ;
strerr_warnf3x(argv[0], " crashed with signal ", fmt) ;
- return -1 ;
- }
- if (WEXITSTATUS(wstat))
- {
- char fmt[UINT_FMT] ;
- fmt[uint_fmt(fmt, WEXITSTATUS(wstat))] = 0 ;
- strerr_warnf3x(argv[0], " exited with code ", fmt) ;
- return (WEXITSTATUS(wstat) < 99) - 1 ;
+ goto err ;
}
+ if (WEXITSTATUS(wstat)) return wait_estatus(wstat) ;
}
if (!s6rc_nlto0(storage->s + sabase, sabase, storage->len, indices)) goto err ;
- return 1 ;
+ return 0 ;
err:
if (gwasnull) genalloc_free(size_t, indices) ;
else genalloc_setlen(size_t, indices, gabase) ;
if (swasnull) stralloc_free(storage) ;
else storage->len = sabase ;
- return -1 ;
+ return 111 ;
}
diff --git a/src/libs6rc/s6rc_repo_setcompile.c b/src/libs6rc/s6rc_repo_setcompile.c
index 82f7d02..5da136a 100644
--- a/src/libs6rc/s6rc_repo_setcompile.c
+++ b/src/libs6rc/s6rc_repo_setcompile.c
@@ -1,11 +1,33 @@
/* ISC license. */
+#include <string.h>
+#include <errno.h>
+
+#include <skalibs/djbunix.h>
+
#include <s6-rc/repo.h>
int s6rc_repo_setcompile (char const *repo, char const *set, char const *defbundle, char *oldc, unsigned int verbosity, char const *fdhuser)
{
- static char const *const subs[4] = { "active", "onboot", "always", "bundle" } ;
+ static char const *const subs[4] = { "bundle", s6rc_repo_subnames[1], s6rc_repo_subnames[2], s6rc_repo_subnames[3] } ;
+ int r ;
if (!s6rc_repo_makesetbundles(repo, set, verbosity)) return -1 ;
if (!s6rc_repo_makedefbundle(repo, set, defbundle)) return -1 ;
- return s6rc_repo_compile(repo, set, subs, 4, oldc, verbosity, fdhuser) ;
+ r = s6rc_repo_compile(repo, set, subs, 4, oldc, verbosity, fdhuser) ;
+
+ {
+ int e = errno ;
+ size_t repolen = strlen(repo) ;
+ size_t setlen = strlen(set) ;
+ size_t sublen = strlen(subs[0]) ;
+ char fn[repolen + setlen + 11 + sublen] ;
+ memcpy(fn, repo, repolen) ;
+ memcpy(fn + repolen, "/sources/", 9) ;
+ memcpy(fn + repolen + 9, set, setlen) ;
+ fn[repolen + 9 + setlen] = '/' ;
+ memcpy(fn + repolen + setlen + 10, subs[0], sublen + 1) ;
+ rm_rf(fn) ;
+ errno = e ;
+ }
+ return r ;
}