commit:     08da36149c0b41c64a09369c3eef5e2f5a6fa39c
Author:     William Hubbs <w.d.hubbs <AT> gmail <DOT> com>
AuthorDate: Wed May 16 18:25:22 2018 +0000
Commit:     William Hubbs <williamh <AT> gentoo <DOT> org>
CommitDate: Wed May 16 18:25:22 2018 +0000
URL:        https://gitweb.gentoo.org/proj/openrc.git/commit/?id=08da3614

rc-service: add --ifstarted and --ifstopped options

 man/rc-service.8    |  8 ++++++++
 src/rc/rc-service.c | 16 +++++++++++++++-
 2 files changed, 23 insertions(+), 1 deletion(-)

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));

Reply via email to