aboutsummaryrefslogtreecommitdiffstats
path: root/src/repo/s6-rc-set-status.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/repo/s6-rc-set-status.c')
-rw-r--r--src/repo/s6-rc-set-status.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/repo/s6-rc-set-status.c b/src/repo/s6-rc-set-status.c
index 7c07e9d..f6b6e5f 100644
--- a/src/repo/s6-rc-set-status.c
+++ b/src/repo/s6-rc-set-status.c
@@ -12,11 +12,13 @@
#include <skalibs/direntry.h>
#include <skalibs/buffer.h>
#include <skalibs/tai.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
#include <s6-rc/config.h>
#include <s6-rc/repo.h>
-#define USAGE "s6-rc-set-status [ -v verbosity ] [ -r repo ] [ -E | -e ] set services..."
+#define USAGE "s6-rc-set-status [ -v verbosity ] [ -r repo ] [ -E | -e ] [ -L ] set services..."
#define dieusage() strerr_dieusage(100, USAGE)
#define dieout() strerr_diefu1sys(111, "write to stdout")
@@ -46,6 +48,8 @@ int main (int argc, char const **argv)
{ .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY },
{ .so = 'r', .lo = "repodir", .i = GOLA_REPODIR }
} ;
+ stralloc sa = STRALLOC_ZERO ;
+ genalloc ga = GENALLOC_ZERO ; /* size_t */
int fdlock ;
unsigned int verbosity = 1 ;
uint64_t wgolb = 0 ;
@@ -59,19 +63,12 @@ int main (int argc, char const **argv)
golc = GOL_main(argc, argv, rgolb, rgola, &wgolb, wgola) ;
argc -= golc ; argv += golc ;
- if (argc < 2) dieusage() ;
+ if (!argc) dieusage() ;
setname = *argv++ ; argc-- ;
if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity))
strerr_dief1x(100, "verbosity needs to be an unsigned integer") ;
- if (strchr(setname, '/') || strchr(setname, '\n'))
- strerr_dief2x(100, "set", " names cannot contain / or newlines") ;
- for (unsigned int i = 0 ; i < argc ; i++)
- {
- if (argv[i][0] == '.')
- strerr_dief2x(100, "service", " names cannot start with a dot") ;
- if (strchr(argv[i], '/') || strchr(argv[i], '\n'))
- strerr_dief2x(100, "service", " names cannot contain / or newlines") ;
- }
+ s6rc_repo_sanitize_setname(setname) ;
+ for (unsigned int i = 0 ; i < argc ; i++) s6rc_repo_sanitize_svname(argv[i]) ;
tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
@@ -82,7 +79,20 @@ int main (int argc, char const **argv)
if (e) _exit(e) ;
}
- qsort(argv, argc, sizeof(char const *), &str_cmp) ;
+ if (argc)
+ {
+ int e = s6rc_repo_flattenservices(wgola[GOLA_REPODIR], argv, argc, &sa, &ga) ;
+ if (e) _exit(e) ;
+ argc = genalloc_len(size_t, &ga) ;
+ }
+ char const *flatargv[argc ? argc : 1] ;
+ if (argc)
+ {
+ for (unsigned int i = 0 ; i < argc ; i++)
+ flatargv[i] = sa.s + genalloc_s(size_t, &ga)[i] ;
+ qsort(flatargv, argc, sizeof(char const *), &str_cmp) ;
+ genalloc_free(size_t, &ga) ;
+ }
size_t repolen = strlen(wgola[GOLA_REPODIR]) ;
size_t setlen = strlen(setname) ;
@@ -105,7 +115,7 @@ int main (int argc, char const **argv)
d = readdir(dir) ;
if (!d) break ;
if (d->d_name[0] == '.') continue ;
- if (argc && !bsearch(d->d_name, argv, argc, sizeof(char const *), &str_bcmp)) continue ;
+ if (argc && !bsearch(d->d_name, flatargv, argc, sizeof(char const *), &str_bcmp)) continue ;
if (buffer_puts(buffer_1, d->d_name) < 0) dieout() ;
if (!(wgolb & GOLB_NOSUB))
if (buffer_put(buffer_1, "/", 1) < 0