diff options
author | William Hubbs <w.d.hubbs@gmail.com> | 2014-09-21 13:54:51 -0500 |
---|---|---|
committer | William Hubbs <w.d.hubbs@gmail.com> | 2016-01-28 12:57:11 -0600 |
commit | 8a7e4d38a74c714e1a532e1b7a53fd2a5c528b63 (patch) | |
tree | 79c3e1790c7f5f33d9f72ae41f4678066487ca80 /src | |
parent | 47dd5e37cbf372df3ee0fad2c87226dce5b51587 (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
Diffstat (limited to 'src')
-rw-r--r-- | src/rc/rc-service.c | 20 |
1 files changed, 19 insertions, 1 deletions
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)); |