aboutsummaryrefslogtreecommitdiffstats
path: root/src/repo/s6-rc-set-delete.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/repo/s6-rc-set-delete.c')
-rw-r--r--src/repo/s6-rc-set-delete.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/repo/s6-rc-set-delete.c b/src/repo/s6-rc-set-delete.c
new file mode 100644
index 0000000..e45561f
--- /dev/null
+++ b/src/repo/s6-rc-set-delete.c
@@ -0,0 +1,73 @@
+/* ISC license. */
+
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <skalibs/posixplz.h>
+#include <skalibs/prog.h>
+#include <skalibs/strerr.h>
+#include <skalibs/gol.h>
+#include <skalibs/djbunix.h>
+
+#include <s6-rc/config.h>
+#include <s6-rc/s6rc.h>
+
+#define USAGE "s6-rc-set-delete [ -v verbosity ] [ -r repo ] setname..."
+#define dieusage() strerr_dieusage(100, USAGE)
+
+static inline void dodelete (char const *repo, char const *setname)
+{
+ size_t repolen = strlen(repo) ;
+ size_t setlen = strlen(setname) ;
+ char fn[repolen + setlen + 10] ;
+ memcpy(fn, repo, repolen) ;
+ memcpy(fn + repolen, "/sources/", 9) ;
+ memcpy(fn + repolen + 9, setname, setlen + 1) ;
+ if (access(fn, W_OK) == -1)
+ {
+ if (errno != ENOENT) strerr_diefu2sys(111, "access ", fn) ;
+ else strerr_warnwu2sys("delete set ", setname) ;
+ }
+ else rm_rf(fn) ;
+}
+
+enum gola_e
+{
+ GOLA_VERBOSITY,
+ GOLA_REPODIR,
+ GOLA_N
+} ;
+
+static gol_arg const rgola[2] =
+{
+ { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY },
+ { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR }
+} ;
+
+int main (int argc, char const *const *argv)
+{
+ char const *repo = S6RC_REPO_BASE ;
+ int fdlock ;
+ unsigned int verbosity = 1 ;
+ char const *wgola[2] = { 0 } ;
+ unsigned int golc ;
+
+ PROG = "s6-rc-set-delete" ;
+ golc = gol_main(argc, argv, 0, 0, rgola, 2, 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 (wgola[GOLA_REPODIR]) repo = wgola[GOLA_REPODIR] ;
+ if (!argc) dieusage() ;
+ for (unsigned int i = 0 ; i < argc ; i++)
+ if (strchr(argv[i], '/') || strchr(argv[i], '\n'))
+ strerr_dief1x(100, "set names cannot contain / or newlines") ;
+
+ fdlock = s6rc_repo_lock(repo, 1) ;
+ if (fdlock == -1) strerr_diefu2sys(111, "lock ", repo) ;
+
+ for (unsigned int i = 0 ; i < argc ; i++)
+ dodelete(repo, argv[i]) ;
+ return 0 ;
+}