From 8a7e4d38a74c714e1a532e1b7a53fd2a5c528b63 Mon Sep 17 00:00:00 2001 From: William Hubbs Date: Sun, 21 Sep 2014 13:54:51 -0500 Subject: [PATCH] rc-service: add --ifinactive and --ifnotstarted flags X-Gentoo-Bug: 523174 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=523174 --- man/rc-service.8 | 15 +++++++++++++++ src/rc/rc-service.c | 20 +++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) 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));