diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-11-12 01:12:15 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-11-12 01:12:15 +0000 |
| commit | e31ad31e271e9e78f6755e047bb25230c6b542f1 (patch) | |
| tree | ab6b74aa1427b2a09c4f69809cfa3cef761c11d0 | |
| parent | 79dc6f49c4f8c26cbd53f92517d82a48d9db0398 (diff) | |
| download | s6-rc-e31ad31e271e9e78f6755e047bb25230c6b542f1.tar.gz | |
Add s6-rc-set-list
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | doc/index.html | 11 | ||||
| -rw-r--r-- | doc/s6-rc-set-list.html | 78 | ||||
| -rw-r--r-- | doc/s6-rc-set-new.html | 4 | ||||
| -rw-r--r-- | package/deps-build | 6 | ||||
| -rw-r--r-- | package/deps.mak | 4 | ||||
| -rw-r--r-- | package/modes | 1 | ||||
| -rw-r--r-- | package/targets.mak | 1 | ||||
| -rw-r--r-- | src/repo/deps-exe/s6-rc-set-list | 3 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-list.c | 86 |
10 files changed, 184 insertions, 11 deletions
@@ -17,6 +17,7 @@ /s6-rc-format-upgrade /s6-rc-repo-init /s6-rc-repo-sync +/s6-rc-set-list /s6-rc-set-new /s6-rc-set-copy /s6-rc-set-delete diff --git a/doc/index.html b/doc/index.html index 462dd04..25c47de 100644 --- a/doc/index.html +++ b/doc/index.html @@ -135,11 +135,12 @@ the previous versions of s6-rc and the current one. </li> <li> An <a href="repodefs.html">overview</a> of the <em>repo</em> tools </li> <li> <a href="s6-rc-repo-init.html">The <tt>s6-rc-repo-init</tt> program</a> </li> <li> <a href="s6-rc-repo-sync.html">The <tt>s6-rc-repo-sync</tt> program</a> </li> - <li> <a href="s6-rc-repo-set-new.html">The <tt>s6-rc-set-new</tt> program</a> </li> - <li> <a href="s6-rc-repo-set-copy.html">The <tt>s6-rc-set-copy</tt> program</a> </li> - <li> <a href="s6-rc-repo-set-delete.html">The <tt>s6-rc-set-delete</tt> program</a> </li> - <li> <a href="s6-rc-repo-set-change.html">The <tt>s6-rc-set-change</tt> program</a> </li> - <li> <a href="s6-rc-repo-set-commit.html">The <tt>s6-rc-set-commit</tt> program</a> </li> + <li> <a href="s6-rc-set-new.html">The <tt>s6-rc-set-new</tt> program</a> </li> + <li> <a href="s6-rc-set-copy.html">The <tt>s6-rc-set-copy</tt> program</a> </li> + <li> <a href="s6-rc-set-delete.html">The <tt>s6-rc-set-delete</tt> program</a> </li> + <li> <a href="s6-rc-set-change.html">The <tt>s6-rc-set-change</tt> program</a> </li> + <li> <a href="s6-rc-set-commit.html">The <tt>s6-rc-set-commit</tt> program</a> </li> + <li> <a href="s6-rc-set-install.html">The <tt>s6-rc-set-install</tt> program</a> </li> </ul> <h2> Related resources </h2> diff --git a/doc/s6-rc-set-list.html b/doc/s6-rc-set-list.html new file mode 100644 index 0000000..18a04ee --- /dev/null +++ b/doc/s6-rc-set-list.html @@ -0,0 +1,78 @@ +<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-set-list program</title> + <meta name="Description" content="s6-rc: the s6-rc-set-list program" /> + <meta name="Keywords" content="s6-rc s6-rc-set-list repo set sub list services" /> + <!-- <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-set-list program </h1> + +<p> + s6-rc-set-list lists all the services of a <a href="repodefs.html#set">set</a>, +along with the <a href="repodefs.html#sub">sub</a> each service is on. +</p> + +<h2> Interface </h2> + +<pre> + s6-rc-set-list [ -v <em>verbosity</em> ] [ -r <em>repo</em> ] <em>set</em> +</pre> + +<ul> + <li> s6-rc-set-list prints all the services in set <em>set</em> of repository +<em>repo</em>, one per line, to stdout. Each line contains: + <ul> + <li> The name of the service </li> + <li> A slash (<tt>/</tt>) character </li> + <li> The canonical name for the sub the service is in. </li> + </ul> </li> + <li> It exits 0. </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> +</dl> + +<h2> Exit codes </h2> + +<dl> + <dt> 0 </dt> <dd> Success. </dd> + <dt> 3 </dt> <dd> Nonexistent set. </dd> + <dt> 100 </dt> <dd> Incorrect usage. </dd> + <dt> 102 </dt> <dd> Invalid repository. </dd> + <dt> 111 </dt> <dd> System call failed. </dd> +</dl> + +<h2> Notes </h2> + +<ul> + <li> s6-rc-set-list is meant to be used with automation such as +<a href="https://pubs.opengroup.org/onlinepubs/9799919799/utilities/cut.html">cut</a> +or util-linux's <a href="https://man7.org/linux/man-pages/man1/column.1.html">column</a> +for formatting. A slash is used to separate the service name for the sub because +slashes cannot appear in service names. </li> +</ul> + +</body> +</html> diff --git a/doc/s6-rc-set-new.html b/doc/s6-rc-set-new.html index 8cdc2f7..4d4642b 100644 --- a/doc/s6-rc-set-new.html +++ b/doc/s6-rc-set-new.html @@ -19,14 +19,14 @@ <h1> The s6-rc-set-new program </h1> <p> - s6-rc-set-new creates new <a href="repodefs.html#sets">sets</a> + s6-rc-set-new creates new <a href="repodefs.html#set">sets</a> in a <a href="repodefs.html#repository">repository</a>. </p> <h2> Interface </h2> <pre> - s6-rc-set-delete [ -v <em>verbosity</em> ] [ -r <em>repo</em> ] <em>setname...</em> + s6-rc-set-new [ -v <em>verbosity</em> ] [ -r <em>repo</em> ] <em>setname...</em> </pre> <ul> diff --git a/package/deps-build b/package/deps-build index 3d304bf..e3b3462 100644 --- a/package/deps-build +++ b/package/deps-build @@ -1,3 +1,3 @@ -true true /package/prog/skalibs 2.14.4.0 libskarnet -true false /package/admin/execline 2.9.7.0 libexecline -true true /package/admin/s6 2.13.2.0 libs6 +true true /package/prog/skalibs 2.14.5.0 libskarnet +true false /package/admin/execline 2.9.8.0 libexecline +true true /package/admin/s6 2.14.0.0 libs6 diff --git a/package/deps.mak b/package/deps.mak index 0340059..9543a02 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -34,7 +34,7 @@ src/repo/s6-rc-set-commit.o src/repo/s6-rc-set-commit.lo: src/repo/s6-rc-set-com 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 src/repo/s6-rc-set-delete.o src/repo/s6-rc-set-delete.lo: src/repo/s6-rc-set-delete.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/repo/s6-rc-set-install.o src/repo/s6-rc-set-install.lo: src/repo/s6-rc-set-install.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h -src/repo/s6-rc-set-list.o src/repo/s6-rc-set-list.lo: src/repo/s6-rc-set-list.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h +src/repo/s6-rc-set-list.o src/repo/s6-rc-set-list.lo: src/repo/s6-rc-set-list.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/repo/s6-rc-set-new.o src/repo/s6-rc-set-new.lo: src/repo/s6-rc-set-new.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/repo/s6rc_repo_badsub.o src/repo/s6rc_repo_badsub.lo: src/repo/s6rc_repo_badsub.c src/include/s6-rc/repo.h src/repo/s6rc_repo_checkset.o src/repo/s6rc_repo_checkset.lo: src/repo/s6rc_repo_checkset.c src/include/s6-rc/repo.h @@ -115,6 +115,8 @@ s6-rc-set-delete: EXTRA_LIBS := ${SPAWN_LIB} s6-rc-set-delete: src/repo/s6-rc-set-delete.o ${LIBS6RCREPO} -lskarnet s6-rc-set-install: EXTRA_LIBS := ${SPAWN_LIB} s6-rc-set-install: src/repo/s6-rc-set-install.o ${LIBS6RCREPO} -lskarnet +s6-rc-set-list: EXTRA_LIBS := ${SPAWN_LIB} +s6-rc-set-list: src/repo/s6-rc-set-list.o ${LIBS6RCREPO} -lskarnet s6-rc-set-new: EXTRA_LIBS := ${SPAWN_LIB} s6-rc-set-new: src/repo/s6-rc-set-new.o ${LIBS6RCREPO} -lskarnet s6-rc: EXTRA_LIBS := ${SYSCLOCK_LIB} ${SPAWN_LIB} diff --git a/package/modes b/package/modes index a940c7a..95ee646 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-set-list 0755 s6-rc-set-new 0755 s6-rc-set-copy 0755 s6-rc-set-delete 0755 diff --git a/package/targets.mak b/package/targets.mak index d996293..9a83f37 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-set-list \ s6-rc-set-new \ s6-rc-set-copy \ s6-rc-set-delete \ diff --git a/src/repo/deps-exe/s6-rc-set-list b/src/repo/deps-exe/s6-rc-set-list new file mode 100644 index 0000000..9fe69bb --- /dev/null +++ b/src/repo/deps-exe/s6-rc-set-list @@ -0,0 +1,3 @@ +${LIBS6RCREPO} +-lskarnet +${SPAWN_LIB} diff --git a/src/repo/s6-rc-set-list.c b/src/repo/s6-rc-set-list.c new file mode 100644 index 0000000..84ef3bb --- /dev/null +++ b/src/repo/s6-rc-set-list.c @@ -0,0 +1,86 @@ +/* ISC license. */ + +#include <skalibs/nonposix.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> + +#include <skalibs/envexec.h> +#include <skalibs/direntry.h> +#include <skalibs/buffer.h> + +#include <s6-rc/config.h> +#include <s6-rc/repo.h> + +#define USAGE "s6-rc-set-list [ -v verbosity ] [ -r repo ] set" +#define dieusage() strerr_dieusage(100, USAGE) + +enum gola_e +{ + GOLA_VERBOSITY, + GOLA_REPODIR, + GOLA_N +} ; + +int main (int argc, char const *const *argv) +{ + static gol_arg const rgola[] = + { + { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY }, + { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR } + } ; + int fdlock ; + unsigned int verbosity = 1 ; + char const *wgola[GOLA_N] = { 0 } ; + unsigned int golc ; + int e ; + uint8_t sub = 4 ; + + PROG = "s6-rc-set-list" ; + wgola[GOLA_REPODIR] = S6RC_REPODIR ; + + golc = gol_main(argc, argv, 0, 0, rgola, GOLA_N, 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") ; + if (!argc) dieusage() ; + if (strchr(argv[0], '/') || strchr(argv[0], '\n')) + strerr_dief1x(100, "set names cannot contain / or newlines") ; + + fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ; + if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ; + + e = s6rc_repo_checkset(wgola[GOLA_REPODIR], argv[0]) ; + if (e) _exit(e) ; + + size_t repolen = strlen(wgola[GOLA_REPODIR]) ; + size_t setlen = strlen(argv[0]) ; + char fn[repolen + setlen + 17] ; + memcpy(fn, wgola[GOLA_REPODIR], repolen) ; + memcpy(fn + repolen, "/sources/", 9) ; + memcpy(fn + repolen + 9, argv[0], setlen) ; + fn[repolen + 9 + setlen] = '/' ; + while (sub--) + { + memcpy(fn + repolen + 10 + setlen, s6rc_repo_subnames[sub], 7) ; + 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 (buffer_puts(buffer_1, d->d_name) < 0 + || buffer_put(buffer_1, "/", 1) < 0 + || buffer_put(buffer_1, s6rc_repo_subnames[sub], 6) < 0 + || buffer_put(buffer_1, "\n", 1) < 0) + strerr_diefu1sys(111, "write to stdout") ; + } + if (errno) strerr_diefu2sys(111, "readdir ", fn) ; + dir_close(dir) ; + } + if (!buffer_flush(buffer_1)) strerr_diefu1sys(111, "write to stdout") ; + _exit(0) ; +} |
