aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2018-05-16 13:25:22 -0500
committerWilliam Hubbs <w.d.hubbs@gmail.com>2018-05-16 13:25:22 -0500
commit08da36149c0b41c64a09369c3eef5e2f5a6fa39c (patch)
tree4149de1d4d79cbc2811c2d258a07a2f462c0098c
parent56870d0db18209396f8276bdc05d413fe4dd7a88 (diff)
rc-service: add --ifstarted and --ifstopped options
-rw-r--r--man/rc-service.88
-rw-r--r--src/rc/rc-service.c16
2 files changed, 23 insertions, 1 deletions
diff --git a/man/rc-service.8 b/man/rc-service.8
index 2834f361..72d5a559 100644
--- a/man/rc-service.8
+++ b/man/rc-service.8
@@ -40,6 +40,14 @@
.Ar service cmd
.Op Ar ...
.Nm
+.Op Fl s , -ifstarted
+.Ar service cmd
+.Op Ar ...
+.Nm
+.Op Fl S , -ifstopped
+.Ar service cmd
+.Op Ar ...
+.Nm
.Fl e , -exists
.Ar service
.Nm
diff --git a/src/rc/rc-service.c b/src/rc/rc-service.c
index ea69dab5..8b01fa0d 100644
--- a/src/rc/rc-service.c
+++ b/src/rc/rc-service.c
@@ -29,7 +29,7 @@
const char *applet = NULL;
const char *extraopts = NULL;
-const char *getoptstring = "cdDe:ilr:INZ" getoptstring_COMMON;
+const char *getoptstring = "cdDe:ilr:INsSZ" getoptstring_COMMON;
const struct option longopts[] = {
{ "debug", 0, NULL, 'd' },
{ "nodeps", 0, NULL, 'D' },
@@ -38,6 +38,8 @@ const struct option longopts[] = {
{ "ifexists", 0, NULL, 'i' },
{ "ifinactive", 0, NULL, 'I' },
{ "ifnotstarted", 0, NULL, 'N' },
+ { "ifstarted", 0, NULL, 's' },
+ { "ifstopped", 0, NULL, 'S' },
{ "list", 0, NULL, 'l' },
{ "resolve", 1, NULL, 'r' },
{ "dry-run", 0, NULL, 'Z' },
@@ -73,6 +75,8 @@ int main(int argc, char **argv)
bool if_exists = false;
bool if_inactive = false;
bool if_notstarted = false;
+ bool if_started = false;
+ bool if_stopped = false;
applet = basename_c(argv[0]);
/* Ensure that we are only quiet when explicitly told to be */
@@ -124,6 +128,12 @@ int main(int argc, char **argv)
free(service);
return EXIT_SUCCESS;
/* NOTREACHED */
+ case 's':
+ if_started = true;
+ break;
+ case 'S':
+ if_stopped = true;
+ break;
case 'Z':
setenv("IN_DRYRUN", "yes", 1);
break;
@@ -148,6 +158,10 @@ int main(int argc, char **argv)
return 0;
if (if_notstarted && (state & RC_SERVICE_STARTED))
return 0;
+ if (if_started && ! (state & RC_SERVICE_STARTED))
+ return 0;
+ if (if_stopped && ! (state & RC_SERVICE_STOPPED))
+ return 0;
*argv = service;
execv(*argv, argv);
eerrorx("%s: %s", applet, strerror(errno));