aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2017-12-04 17:17:17 -0600
committerWilliam Hubbs <w.d.hubbs@gmail.com>2017-12-04 17:17:17 -0600
commita2447dfb420cbd97a65cc085404c031d42cb3dfb (patch)
treeeb6c24f86871ec83a905433323a85a1562d57dee
parentcee3919908c2d715fd75a796873e3308209a4c2e (diff)
rc-service: add --ifcrashed option
This works like the other --if options. If the service is crashed, run the command. This fixes #154.
-rw-r--r--man/rc-service.84
-rw-r--r--src/rc/rc-service.c10
2 files changed, 13 insertions, 1 deletions
diff --git a/man/rc-service.8 b/man/rc-service.8
index 80deb5eb..8f075de4 100644
--- a/man/rc-service.8
+++ b/man/rc-service.8
@@ -16,6 +16,10 @@
.Nd locate and run an OpenRC service with the given arguments
.Sh SYNOPSIS
.Nm
+.Op Fl c , -ifcrashed
+.Ar service cmd
+.Op Ar ...
+.Nm
.Op Fl i , -ifexists
.Ar service cmd
.Op Ar ...
diff --git a/src/rc/rc-service.c b/src/rc/rc-service.c
index d0a64999..8e7b00dc 100644
--- a/src/rc/rc-service.c
+++ b/src/rc/rc-service.c
@@ -29,9 +29,10 @@
const char *applet = NULL;
const char *extraopts = NULL;
-const char *getoptstring = "e:ilr:IN" getoptstring_COMMON;
+const char *getoptstring = "ce:ilr:IN" getoptstring_COMMON;
const struct option longopts[] = {
{ "exists", 1, NULL, 'e' },
+ { "ifcrashed", 0, NULL, 'c' },
{ "ifexists", 0, NULL, 'i' },
{ "ifinactive", 0, NULL, 'I' },
{ "ifnotstarted", 0, NULL, 'N' },
@@ -41,6 +42,7 @@ const struct option longopts[] = {
};
const char * const longopts_help[] = {
"tests if the service exists or not",
+ "if the service is crashed then run the command",
"if the service exists then run the command",
"if the service is inactive then run the command",
"if the service is not started then run the command",
@@ -61,6 +63,7 @@ int main(int argc, char **argv)
RC_STRINGLIST *list;
RC_STRING *s;
RC_SERVICE state;
+ bool if_crashed = false;
bool if_exists = false;
bool if_inactive = false;
bool if_notstarted = false;
@@ -79,6 +82,9 @@ int main(int argc, char **argv)
free(service);
return opt;
/* NOTREACHED */
+ case 'c':
+ if_crashed = true;
+ break;
case 'i':
if_exists = true;
break;
@@ -121,6 +127,8 @@ int main(int argc, char **argv)
eerrorx("%s: service `%s' does not exist", applet, *argv);
}
state = rc_service_state(*argv);
+ if (if_crashed && ! (rc_service_daemons_crashed(*argv) && errno != EACCES))
+ return 0;
if (if_inactive && ! (state & RC_SERVICE_INACTIVE))
return 0;
if (if_notstarted && (state & RC_SERVICE_STARTED))