From 6dd777fafbd23296d6bd91f8076f4b0ea5bae24e Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Sat, 20 Dec 2025 13:25:40 +0000 Subject: Add s6-rc-repo-list --- .gitignore | 1 + doc/repodefs.html | 3 +- doc/s6-rc-repo-list.html | 66 ++++++++++++++++++++++++++++++++++ package/deps.mak | 8 +++-- package/modes | 1 + package/targets.mak | 1 + src/repo/deps-exe/s6-rc-repo-list | 3 ++ src/repo/s6-rc-repo-init.c | 2 +- src/repo/s6-rc-repo-list.c | 74 +++++++++++++++++++++++++++++++++++++++ src/repo/s6-rc-repo-sync.c | 2 +- src/repo/s6-rc-set-fix.c | 4 +-- src/repo/s6rc_repo_fix.c | 51 --------------------------- 12 files changed, 157 insertions(+), 59 deletions(-) create mode 100644 doc/s6-rc-repo-list.html create mode 100644 src/repo/deps-exe/s6-rc-repo-list create mode 100644 src/repo/s6-rc-repo-list.c delete mode 100644 src/repo/s6rc_repo_fix.c diff --git a/.gitignore b/.gitignore index 22f57b2..0e74e9e 100644 --- a/.gitignore +++ b/.gitignore @@ -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. hardcoded in the stores) with s6-rc-set-new, make a copy of an existing set with s6-rc-set-copy, or delete sets with s6-rc-set-delete. -
  • They mask, unmask, enable or disable services in their favorite set with +
  • They can list the existing sets with s6-rc-repo-list.
  • +
  • They can mask, unmask, enable or disable services in their favorite set with s6-rc-set-change.
  • They can check the list of services and their subs with s6-rc-set-status.
  • 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 @@ + + + + + + s6-rc: the s6-rc-repo-list program + + + + + + +

    +s6-rc
    +Software
    +skarnet.org +

    + +

    The s6-rc-repo-list program

    + +

    + s6-rc-repo-list lists all the sets in a +repository. +

    + +

    Interface

    + +
    +     s6-rc-repo-list [ -v verbosity ] [ -r repo ] [ -x exclude ]
    +
    + + + +

    Options

    + +
    +
    -v verbosity, --verbosity=verbosity
    +
    Be more or less verbose. The default is 1, 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.
    + +
    -r repo, --repository=repo
    +
    Use the repository in repo, which must exist. Default is +/var/lib/s6-rc/repository. +
    + +
    -x exclude, --exclude=exclude
    +
    If the list contains a set named exclude, do not print it. +(This can save a grep -v invocation to automation using the result +of s6-rc-repo-list.)
    +
    + +

    Exit codes

    + +
    +
    0
    Success.
    +
    100
    Incorrect usage.
    +
    111
    System call failed. This usually signals an issue with the +underlying operating system.
    +
    + + + 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 #include -#include +#include #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 +#include +#include + +#include +#include +#include +#include + +#include +#include + +#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 #include -#include +#include #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 -#include -#include - -#include -#include -#include -#include -#include - -#include - -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 ; -} -- cgit v1.3.1