aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2014-09-21 13:54:51 -0500
committerWilliam Hubbs <w.d.hubbs@gmail.com>2016-01-28 12:57:11 -0600
commit8a7e4d38a74c714e1a532e1b7a53fd2a5c528b63 (patch)
tree79c3e1790c7f5f33d9f72ae41f4678066487ca80
parent47dd5e37cbf372df3ee0fad2c87226dce5b51587 (diff)
rc-service: add --ifinactive and --ifnotstarted flags
X-Gentoo-Bug: 523174 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=523174
-rw-r--r--man/rc-service.815
-rw-r--r--src/rc/rc-service.c20
2 files changed, 34 insertions, 1 deletions
diff --git a/man/rc-service.8 b/man/rc-service.8
index 9260329f..80deb5eb 100644
--- a/man/rc-service.8
+++ b/man/rc-service.8
@@ -20,6 +20,14 @@
.Ar service cmd
.Op Ar ...
.Nm
+.Op Fl I , -ifinactive
+.Ar service cmd
+.Op Ar ...
+.Nm
+.Op Fl N , -ifnotstarted
+.Ar service cmd
+.Op Ar ...
+.Nm
.Fl e , -exists
.Ar service
.Nm
@@ -36,6 +44,13 @@ If
is given then
.Nm
returns 0 even if the service does not exist.
+If
+.Fl I , -ifinactive
+or
+.Fl N , -ifnotstarted
+is given then
+.Nm
+returns 0 if the service exists but is in the wrong state.
.Pp
If given the
.Fl l , -list
diff --git a/src/rc/rc-service.c b/src/rc/rc-service.c
index 8e9da446..3fd94b25 100644
--- a/src/rc/rc-service.c
+++ b/src/rc/rc-service.c
@@ -29,10 +29,12 @@
const char *applet = NULL;
const char *extraopts = NULL;
-const char *getoptstring = "e:ilr:" getoptstring_COMMON;
+const char *getoptstring = "e:ilr:IN" getoptstring_COMMON;
const struct option longopts[] = {
{ "exists", 1, NULL, 'e' },
{ "ifexists", 0, NULL, 'i' },
+ { "ifinactive", 0, NULL, 'I' },
+ { "ifnotstarted", 0, NULL, 'N' },
{ "list", 0, NULL, 'l' },
{ "resolve", 1, NULL, 'r' },
longopts_COMMON
@@ -40,6 +42,8 @@ const struct option longopts[] = {
const char * const longopts_help[] = {
"tests if the service exists or not",
"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",
"list all available services",
"resolve the service name to an init script",
longopts_help_COMMON
@@ -56,7 +60,10 @@ int main(int argc, char **argv)
char *service;
RC_STRINGLIST *list;
RC_STRING *s;
+ RC_SERVICE state;
bool if_exists = false;
+ bool if_inactive = false;
+ bool if_notstarted = false;
applet = basename_c(argv[0]);
/* Ensure that we are only quiet when explicitly told to be */
@@ -77,6 +84,12 @@ int main(int argc, char **argv)
case 'i':
if_exists = true;
break;
+ case 'I':
+ if_inactive = true;
+ break;
+ case 'N':
+ if_notstarted = true;
+ break;
case 'l':
list = rc_services_in_runlevel(NULL);
if (TAILQ_FIRST(list) == NULL)
@@ -113,6 +126,11 @@ int main(int argc, char **argv)
return 0;
eerrorx("%s: service `%s' does not exist", applet, *argv);
}
+ state = rc_service_state(*argv);
+ if (if_inactive && ! (state & RC_SERVICE_INACTIVE))
+ return 0;
+ if (if_notstarted && (state & RC_SERVICE_STARTED))
+ return 0;
*argv = service;
execv(*argv, argv);
eerrorx("%s: %s", applet, strerror(errno));