From 320e91653b19565679a445134388106dfaf21a86 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 19 Jan 2023 19:56:25 +0100 Subject: [PATCH] initctl: add -n,--noerr to return OK(0) if svc doesn't exist Signed-off-by: Joachim Wiberg --- man/initctl.8 | 6 ++++++ src/initctl.c | 19 +++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/man/initctl.8 b/man/initctl.8 index a42fa2b9..07ef8dfc 100644 --- a/man/initctl.8 +++ b/man/initctl.8 @@ -39,6 +39,12 @@ JSON output in and .Ar cond commands. +.It Fl n, -noerr +When scripting +.Nm +to stop, start, restart, or signal a task or service, this option can be +used to ignore error 69 (no such task or service) and instead return 0 +(OK). .It Fl 1, -once Only one lap in commands like top. .It Fl p, -plain diff --git a/src/initctl.c b/src/initctl.c index e010a639..01aa720e 100644 --- a/src/initctl.c +++ b/src/initctl.c @@ -65,6 +65,7 @@ int ionce = 0; int debug = 0; int heading = 1; int json = 0; +int noerr = 0; int verbose = 0; int plain = 0; int quiet = 0; @@ -192,7 +193,7 @@ static int show_log(char *arg) if (arg) { svc = client_svc_find(arg); if (!svc) - ERRX(69, "no such task or service(s): %s", arg); + ERRX(noerr ? 0 : 69, "no such task or service(s): %s", arg); } return do_log(svc, ""); @@ -261,7 +262,7 @@ static int do_startstop(int cmd, char *arg) strlcpy(rq.data, arg, sizeof(rq.data)); if (client_send(&rq, sizeof(rq))) - ERRX(69, "no such task or service(s): %s", arg); + ERRX(noerr ? 0 : 69, "no such task or service(s): %s", arg); return do_svc(cmd, arg); } @@ -280,7 +281,7 @@ static int do_reload (char *arg) static int do_restart(char *arg) { if (do_startstop(INIT_CMD_RESTART_SVC, arg)) - ERRX(7, "failed restarting %s", arg); + ERRX(noerr ? 0 : 7, "failed restarting %s", arg); return 0; } @@ -308,7 +309,7 @@ int do_signal(int argc, char *argv[]) strlcpy(rq.data, argv[0], sizeof(rq.data)); if (client_send(&rq, sizeof(rq))) - ERRX(69, "no such task or service(s): %s", argv[0]); + ERRX(noerr ? 0 : 69, "no such task or service(s): %s", argv[0]); signo = str2sig(argv[1]); if (signo == -1) { @@ -1065,7 +1066,7 @@ static int show_status(char *arg) svc = client_svc_find(arg); if (!svc) - ERRX(69, "no such task or service(s): %s", arg); + ERRX(noerr ? 0 : 69, "no such task or service(s): %s", arg); if (quiet) { if (svc_is_runtask(svc)) { @@ -1261,6 +1262,7 @@ static int usage(int rc) " -f, --force Ignore missing files and arguments, never prompt\n" " -h, --help This help text\n" " -j, --json JSON output in 'status' and 'cond' commands\n" + " -n, --noerr Ignore error for non-existent services\n" " -1, --once Only one lap in commands like 'top'\n" " -p, --plain Use plain table headings, no ctrl chars\n" " -q, --quiet Silent, only return status of command\n" @@ -1448,6 +1450,7 @@ int main(int argc, char *argv[]) { "force", 0, NULL, 'f' }, { "help", 0, NULL, 'h' }, { "json", 0, NULL, 'j' }, + { "noerr", 0, NULL, 'n' }, { "once", 0, NULL, '1' }, { "plain", 0, NULL, 'p' }, { "quiet", 0, NULL, 'q' }, @@ -1520,7 +1523,7 @@ int main(int argc, char *argv[]) cgrp = cgroup_avail(); utmp = has_utmp(); - while ((c = getopt_long(argc, argv, "1bcdfh?jpqtvV", long_options, NULL)) != EOF) { + while ((c = getopt_long(argc, argv, "1bcdfh?jnpqtvV", long_options, NULL)) != EOF) { switch(c) { case '1': ionce = 1; @@ -1550,6 +1553,10 @@ int main(int argc, char *argv[]) json = 1; break; + case 'n': + noerr = 1; + break; + case 'p': plain = 1; break;