diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-12-20 13:25:40 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-12-20 13:25:40 +0000 |
| commit | 6dd777fafbd23296d6bd91f8076f4b0ea5bae24e (patch) | |
| tree | 58d57a85299a33f5095c50b62ab587a27b2f27f8 | |
| parent | a065d815b1153ea38c58d5f64a2bfdfe31d330a4 (diff) | |
| download | s6-rc-6dd777fafbd23296d6bd91f8076f4b0ea5bae24e.tar.gz | |
Add s6-rc-repo-list
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | doc/repodefs.html | 3 | ||||
| -rw-r--r-- | doc/s6-rc-repo-list.html | 66 | ||||
| -rw-r--r-- | package/deps.mak | 8 | ||||
| -rw-r--r-- | package/modes | 1 | ||||
| -rw-r--r-- | package/targets.mak | 1 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-repo-list | 3 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-init.c | 2 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-list.c | 74 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-sync.c | 2 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-fix.c | 4 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_fix.c | 51 |
12 files changed, 157 insertions, 59 deletions
@@ -17,6 +17,7 @@ /s6-rc-format-upgrade /s6-rc-repo-init /s6-rc-repo-sync +/s6-rc-repo-list /s6-rc-set-status /s6-rc-set-new /s6-rc-set-copy diff --git a/doc/repodefs.html b/doc/repodefs.html index bbd6811..8a8a6a9 100644 --- a/doc/repodefs.html +++ b/doc/repodefs.html @@ -282,7 +282,8 @@ here. </li> hardcoded in the stores) with <a href="s6-rc-set-new.html">s6-rc-set-new</a>, make a copy of an existing set with <a href="s6-rc-set-copy.html">s6-rc-set-copy</a>, or delete sets with <a href="s6-rc-set-delete.html">s6-rc-set-delete</a>. </li> - <li> They mask, unmask, enable or disable services in their favorite set with + <li> They can list the existing sets with <a href="s6-rc-repo-list.html">s6-rc-repo-list</a>. </li> + <li> They can mask, unmask, enable or disable services in their favorite set with <a href="s6-rc-set-change.html">s6-rc-set-change</a>. </li> <li> They can check the list of services and their subs with <a href="s6-rc-set-status.html">s6-rc-set-status</a>. </li> diff --git a/doc/s6-rc-repo-list.html b/doc/s6-rc-repo-list.html new file mode 100644 index 0000000..92869a1 --- /dev/null +++ b/doc/s6-rc-repo-list.html @@ -0,0 +1,66 @@ +<html> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <meta http-equiv="Content-Language" content="en" /> + <title>s6-rc: the s6-rc-repo-list program</title> + <meta name="Description" content="s6-rc: the s6-rc-repo-list program" /> + <meta name="Keywords" content="s6-rc repo list ls sets" /> + <!-- <link rel="stylesheet" type="text/css" href="//skarnet.org/default.css" /> --> + </head> +<body> + +<p> +<a href="index.html">s6-rc</a><br /> +<a href="//skarnet.org/software/">Software</a><br /> +<a href="//skarnet.org/">skarnet.org</a> +</p> + +<h1> The s6-rc-repo-list program </h1> + +<p> + s6-rc-repo-list lists all the <a href="repodefs.html#set">sets</a> in a +<a href="repodefs.html#repository">repository</a>. +</p> + +<h2> Interface </h2> + +<pre> + s6-rc-repo-list [ -v <em>verbosity</em> ] [ -r <em>repo</em> ] [ -x <em>exclude</em> ] +</pre> + +<ul> + <li> s6-rc-repo-list lists all the defined sets in the repository, printing +one set name per line. </li> +</ul> + +<h2> Options </h2> + +<dl> + <dt> -v <em>verbosity</em>, --verbosity=<em>verbosity</em> </dt> + <dd> Be more or less verbose. The default is <strong>1</strong>, which means +that error messages and warnings will be written to stderr. 0 means that only +error messages will be written, and 2 or more adds informational messages. </dd> + + <dt> -r <em>repo</em>, --repository=<em>repo</em> </dt> + <dd> Use the repository in <em>repo</em>, which must exist. Default is +<strong>/var/lib/s6-rc/repository</strong>. + </dd> + + <dt> -x <em>exclude</em>, --exclude=<em>exclude</em> </dt> + <dd> If the list contains a set named <em>exclude</em>, do not print it. +(This can save a <tt>grep -v</tt> invocation to automation using the result +of s6-rc-repo-list.) </dd> +</dl> + +<h2> Exit codes </h2> + +<dl> + <dt> 0 </dt> <dd> Success. </dd> + <dt> 100 </dt> <dd> Incorrect usage. </dd> + <dt> 111 </dt> <dd> System call failed. This usually signals an issue with the +underlying operating system. </dd> +</dl> + +</body> +</html> diff --git a/package/deps.mak b/package/deps.mak index 8830619..837e179 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -27,8 +27,9 @@ src/libs6rc/s6rc_servicedir_internal.o src/libs6rc/s6rc_servicedir_internal.lo: src/libs6rc/s6rc_servicedir_manage.o src/libs6rc/s6rc_servicedir_manage.lo: src/libs6rc/s6rc_servicedir_manage.c src/include/s6-rc/s6rc-servicedir.h src/libs6rc/s6rc_servicedir_unblock.o src/libs6rc/s6rc_servicedir_unblock.lo: src/libs6rc/s6rc_servicedir_unblock.c src/include/s6-rc/s6rc-servicedir.h src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_servicedir_unsupervise.lo: src/libs6rc/s6rc_servicedir_unsupervise.c src/include/s6-rc/s6rc-servicedir.h -src/repo/s6-rc-repo-init.o src/repo/s6-rc-repo-init.lo: src/repo/s6-rc-repo-init.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h -src/repo/s6-rc-repo-sync.o src/repo/s6-rc-repo-sync.lo: src/repo/s6-rc-repo-sync.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h +src/repo/s6-rc-repo-init.o src/repo/s6-rc-repo-init.lo: src/repo/s6-rc-repo-init.c src/include/s6-rc/config.h src/include/s6-rc/repo.h +src/repo/s6-rc-repo-list.o src/repo/s6-rc-repo-list.lo: src/repo/s6-rc-repo-list.c src/include/s6-rc/config.h src/include/s6-rc/repo.h +src/repo/s6-rc-repo-sync.o src/repo/s6-rc-repo-sync.lo: src/repo/s6-rc-repo-sync.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/repo/s6-rc-set-change.o src/repo/s6-rc-set-change.lo: src/repo/s6-rc-set-change.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/repo/s6-rc-set-commit.o src/repo/s6-rc-set-commit.lo: src/repo/s6-rc-set-commit.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/repo/s6-rc-set-copy.o src/repo/s6-rc-set-copy.lo: src/repo/s6-rc-set-copy.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h @@ -42,7 +43,6 @@ src/repo/s6rc_repo_checkset.o src/repo/s6rc_repo_checkset.lo: src/repo/s6rc_repo src/repo/s6rc_repo_cleanup.o src/repo/s6rc_repo_cleanup.lo: src/repo/s6rc_repo_cleanup.c src/include/s6-rc/repo.h src/repo/s6rc_repo_compile.o src/repo/s6rc_repo_compile.lo: src/repo/s6rc_repo_compile.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/repo/s6rc_repo_fillset.o src/repo/s6rc_repo_fillset.lo: src/repo/s6rc_repo_fillset.c src/include/s6-rc/repo.h -src/repo/s6rc_repo_fix.o src/repo/s6rc_repo_fix.lo: src/repo/s6rc_repo_fix.c src/include/s6-rc/repo.h src/repo/s6rc_repo_fixset.o src/repo/s6rc_repo_fixset.lo: src/repo/s6rc_repo_fixset.c src/include/s6-rc/repo.h src/repo/s6rc_repo_flattenservices.o src/repo/s6rc_repo_flattenservices.lo: src/repo/s6rc_repo_flattenservices.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/repo/s6rc_repo_getserviceflags.o src/repo/s6rc_repo_getserviceflags.lo: src/repo/s6rc_repo_getserviceflags.c src/include/s6-rc/config.h src/include/s6-rc/repo.h @@ -107,6 +107,8 @@ libs6rcrepo.dylib.xyzzy: EXTRA_LIBS := -lskarnet ${SPAWN_LIB} libs6rcrepo.dylib.xyzzy:src/repo/s6rc_repo_badsub.lo src/repo/s6rc_repo_checkset.lo src/repo/s6rc_repo_cleanup.lo src/repo/s6rc_repo_compile.lo src/repo/s6rc_repo_fillset.lo src/repo/s6rc_repo_fixset.lo src/repo/s6rc_repo_flattenservices.lo src/repo/s6rc_repo_getserviceflags.lo src/repo/s6rc_repo_list_sets.lo src/repo/s6rc_repo_listalldeps.lo src/repo/s6rc_repo_listcontents.lo src/repo/s6rc_repo_listdeps.lo src/repo/s6rc_repo_listdeps_internal.lo src/repo/s6rc_repo_listsub.lo src/repo/s6rc_repo_lock.lo src/repo/s6rc_repo_ls.lo src/repo/s6rc_repo_makedefbundle.lo src/repo/s6rc_repo_makesetbundles.lo src/repo/s6rc_repo_makestores.lo src/repo/s6rc_repo_makesvlist.lo src/repo/s6rc_repo_makesvlist_byname.lo src/repo/s6rc_repo_moveservices.lo src/repo/s6rc_repo_removeinternals.lo src/repo/s6rc_repo_sanitize_setname.lo src/repo/s6rc_repo_sanitize_svname.lo src/repo/s6rc_repo_setcompile.lo src/repo/s6rc_repo_setuptodate.lo src/repo/s6rc_repo_subnames.lo src/repo/s6rc_repo_sv_bcmpr.lo src/repo/s6rc_repo_sv_cmpr.lo src/repo/s6rc_repo_sync.lo src/repo/s6rc_repo_syncset.lo src/repo/s6rc_repo_syncset_tmp.lo src/repo/s6rc_repo_touch.lo src/repo/s6rc_repo_touchset.lo src/repo/s6rc_repo_type_check.lo s6-rc-repo-init: EXTRA_LIBS := ${SPAWN_LIB} s6-rc-repo-init: src/repo/s6-rc-repo-init.o ${LIBS6RCREPO} -lskarnet +s6-rc-repo-list: EXTRA_LIBS := ${SPAWN_LIB} +s6-rc-repo-list: src/repo/s6-rc-repo-list.o ${LIBS6RCREPO} -lskarnet s6-rc-repo-sync: EXTRA_LIBS := ${SPAWN_LIB} s6-rc-repo-sync: src/repo/s6-rc-repo-sync.o ${LIBS6RCREPO} -lskarnet s6-rc-set-change: EXTRA_LIBS := ${SPAWN_LIB} diff --git a/package/modes b/package/modes index 567eb45..0676950 100644 --- a/package/modes +++ b/package/modes @@ -10,6 +10,7 @@ s6-rc-oneshot-run 0755 s6-rc-format-upgrade 0755 s6-rc-repo-init 0755 s6-rc-repo-sync 0755 +s6-rc-repo-list 0755 s6-rc-set-status 0755 s6-rc-set-new 0755 s6-rc-set-copy 0755 diff --git a/package/targets.mak b/package/targets.mak index 28f6bcb..fe89f89 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -9,6 +9,7 @@ s6-rc-update \ s6-rc-format-upgrade \ s6-rc-repo-init \ s6-rc-repo-sync \ +s6-rc-repo-list \ s6-rc-set-status \ s6-rc-set-new \ s6-rc-set-copy \ diff --git a/src/repo/deps-exe/s6-rc-repo-list b/src/repo/deps-exe/s6-rc-repo-list new file mode 100644 index 0000000..9fe69bb --- /dev/null +++ b/src/repo/deps-exe/s6-rc-repo-list @@ -0,0 +1,3 @@ +${LIBS6RCREPO} +-lskarnet +${SPAWN_LIB} diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c index 6c8a7fa..933ea67 100644 --- a/src/repo/s6-rc-repo-init.c +++ b/src/repo/s6-rc-repo-init.c @@ -22,7 +22,7 @@ #include <skalibs/unix-transactional.h> #include <s6-rc/config.h> -#include <s6-rc/s6rc.h> +#include <s6-rc/repo.h> #define USAGE "s6-rc-repo-init [ -v verbosity ] [ -r repo ] [ -h fdhuser ] [ -f ] [ -U ] [ -B ] stores..." #define dieusage() strerr_dieusage(100, USAGE) diff --git a/src/repo/s6-rc-repo-list.c b/src/repo/s6-rc-repo-list.c new file mode 100644 index 0000000..15112d1 --- /dev/null +++ b/src/repo/s6-rc-repo-list.c @@ -0,0 +1,74 @@ +/* ISC license. */ + +#include <unistd.h> +#include <string.h> +#include <errno.h> + +#include <skalibs/buffer.h> +#include <skalibs/direntry.h> +#include <skalibs/envexec.h> +#include <skalibs/tai.h> + +#include <s6-rc/config.h> +#include <s6-rc/repo.h> + +#define USAGE "s6-rc-repo-list [ -v verbosity ] [ -r repo ] [ -x exclude ]" +#define dieusage() strerr_dieusage(100, USAGE) +#define dieout() strerr_diefu1sys(111, "write to stdout") + +enum gola_e +{ + GOLA_VERBOSITY, + GOLA_REPODIR, + GOLA_EXCLUDE, + GOLA_N +} ; + +static gol_arg const rgola[] = +{ + { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY }, + { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR }, + { .so = 'x', .lo = "exclude", .i = GOLA_EXCLUDE } +} ; + +int main (int argc, char const *const *argv) +{ + char const *wgola[GOLA_N] = { 0 } ; + unsigned int verbosity = 1 ; + unsigned int golc ; + int fdlock ; + + PROG = "s6-rc-repo-list" ; + wgola[GOLA_REPODIR] = S6RC_REPODIR ; + + golc = gol_main(argc, argv, 0, 0, rgola, 3, 0, wgola) ; + argc -= golc ; argv += golc ; + if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity)) + strerr_dief1x(100, "verbosity needs to be an unsigned integer") ; + + tain_now_g() ; + fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ; + if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ; + + size_t repolen = strlen(wgola[GOLA_REPODIR]) ; + char fn[repolen + 9] ; + memcpy(fn, wgola[GOLA_REPODIR], repolen) ; + memcpy(fn + repolen, "/sources", 9) ; + DIR *dir = opendir(fn) ; + if (!dir) strerr_diefu2sys(111, "opendir ", fn) ; + for (;;) + { + direntry *d ; + errno = 0 ; + d = readdir(dir) ; + if (!d) break ; + if (d->d_name[0] == '.') continue ; + if (wgola[GOLA_EXCLUDE] && !strcmp(d->d_name, wgola[GOLA_EXCLUDE])) continue ; + if (buffer_puts(buffer_1, d->d_name) < 0 + || buffer_put(buffer_1, "\n", 1) < 0) dieout() ; + } + if (errno) strerr_diefu2sys(111, "readdir ", fn) ; + // dir_close(dir) ; + if (!buffer_flush(buffer_1)) dieout() ; + _exit(0) ; +} diff --git a/src/repo/s6-rc-repo-sync.c b/src/repo/s6-rc-repo-sync.c index ba57d49..def9eb4 100644 --- a/src/repo/s6-rc-repo-sync.c +++ b/src/repo/s6-rc-repo-sync.c @@ -6,7 +6,7 @@ #include <skalibs/tai.h> #include <s6-rc/config.h> -#include <s6-rc/s6rc.h> +#include <s6-rc/repo.h> #define USAGE "s6-rc-repo-sync [ -v verbosity ] [ -r repo ] [ -h fdhuser ]" #define dieusage() strerr_dieusage(100, USAGE) diff --git a/src/repo/s6-rc-set-fix.c b/src/repo/s6-rc-set-fix.c index 6205024..54e8c3c 100644 --- a/src/repo/s6-rc-set-fix.c +++ b/src/repo/s6-rc-set-fix.c @@ -58,8 +58,8 @@ int main (int argc, char const **argv) { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR } } ; stralloc sa = STRALLOC_ZERO ; - genalloc svlist = GENALLOC_ZERO ; - genalloc badga = GENALLOC_ZERO ; + genalloc svlist = GENALLOC_ZERO ; /* s6rc_repo_sv */ + genalloc badga = GENALLOC_ZERO ; /* uint32_t */ unsigned int verbosity = 1 ; int fdlock ; uint64_t wgolb = 0 ; diff --git a/src/repo/s6rc_repo_fix.c b/src/repo/s6rc_repo_fix.c deleted file mode 100644 index b379d30..0000000 --- a/src/repo/s6rc_repo_fix.c +++ /dev/null @@ -1,51 +0,0 @@ -/* ISC license. */ - -#include <string.h> -#include <stdlib.h> -#include <errno.h> - -#include <skalibs/posixplz.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_fix (char const *repo, uint32_t options, unsigned int verbosity) -{ - stralloc sa = STRALLOC_ZERO ; - genalloc svlist = GENALLOC_ZERO ; /* s6rc_repo_sv */ - genalloc badga = GENALLOC_ZERO ; /* uint32_t */ - genalloc setind = GENALLOC_ZERO ; /* size_t */ - int n ; - - if (verbosity >= 3) - strerr_warni2x("checking set consistency in repository ", repo) ; - - n = s6rc_repo_list_sets(repo, &sa, &setind) ; - if (n < 0) - { - strerr_warnfu1sys("list sets") ; - return 0 ; - } - for (uint32_t i = 0 ; i < nsets ; i++) - { - if (verbosity >= 3) - strerr_warni2x("checking set ", sa.s + genalloc_s(size_t, &setind)[i]) ; - if (!s6rc_repo_fixset(repo, sa.s + genalloc_s(size_t, &setind)[i], options, verbosity, &sa, &svlist, &badga)) goto err ; - } - - genalloc_free(s6rc_repo_sv, &svlist) ; - genalloc_free(uint32_t, &badga) ; - genalloc_free(size_t, &setind) ; - stralloc_free(&sa) ; - return 1 ; - - err: - genalloc_free(s6rc_repo_sv, &svlist) ; - genalloc_free(uint32_t, &badga) ; - genalloc_free(size_t, &setind) ; - stralloc_free(&sa) ; - return 0 ; -} |
