aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-12-20 13:25:40 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-12-20 13:25:40 +0000
commit6dd777fafbd23296d6bd91f8076f4b0ea5bae24e (patch)
tree58d57a85299a33f5095c50b62ab587a27b2f27f8
parenta065d815b1153ea38c58d5f64a2bfdfe31d330a4 (diff)
downloads6-rc-6dd777fafbd23296d6bd91f8076f4b0ea5bae24e.tar.gz
Add s6-rc-repo-list
-rw-r--r--.gitignore1
-rw-r--r--doc/repodefs.html3
-rw-r--r--doc/s6-rc-repo-list.html66
-rw-r--r--package/deps.mak8
-rw-r--r--package/modes1
-rw-r--r--package/targets.mak1
-rw-r--r--src/repo/deps-exe/s6-rc-repo-list3
-rw-r--r--src/repo/s6-rc-repo-init.c2
-rw-r--r--src/repo/s6-rc-repo-list.c74
-rw-r--r--src/repo/s6-rc-repo-sync.c2
-rw-r--r--src/repo/s6-rc-set-fix.c4
-rw-r--r--src/repo/s6rc_repo_fix.c51
12 files changed, 157 insertions, 59 deletions
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. </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 ;
-}