aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2013-04-28 12:51:12 -0500
committerWilliam Hubbs <w.d.hubbs@gmail.com>2013-04-28 12:51:12 -0500
commit10a4385e409b48d9aa60590c140d4ca6485a7a72 (patch)
treedc52fb42c93f37fad1eeba1eb65441c090e59705
parent10eabd4d921cea895b8f9bde47f29d107f39fa0b (diff)
rc: allow switching runlevels without stopping services
OpenRC, by default, stops all services that are not listed in a runlevel when rc is used to switch runlevels. This adds a -n/--no-stop command line option to rc which tells it to skip stopping the services which are not in the runlevel. Reported-by: gentoo@thoth.purplefrog.com X-Gentoo-Bug: 372585 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=372585
-rw-r--r--man/rc.89
-rw-r--r--src/rc/rc.c16
2 files changed, 16 insertions, 9 deletions
diff --git a/man/rc.8 b/man/rc.8
index 0d645bf5..dd457888 100644
--- a/man/rc.8
+++ b/man/rc.8
@@ -29,16 +29,17 @@
.Nd stops and starts services for the specified runlevel
.Sh SYNOPSIS
.Nm
+.Op Fl n , -no-stop
.Op Fl o , -override
.Op Ar runlevel
.Sh DESCRIPTION
.Nm
-first stops any services that are not for the runlevel and then starts any
-services in the runlevel and from stacked runlevels added by
+first stops any services that are not in the specified runlevel unless
+--no-stop is specified, then starts any services in the runlevel and
+stacked runlevels added by
.Nm rc-update
that are not currently started.
-If no runlevel is specified then we use the current runlevel the system
-is currently in.
+If no runlevel is specified, we use the current runlevel.
.Pp
There are some special runlevels that you should be aware of:
.Bl -tag -width "shutdown"
diff --git a/src/rc/rc.c b/src/rc/rc.c
index a5d70850..0e37182c 100644
--- a/src/rc/rc.c
+++ b/src/rc/rc.c
@@ -729,16 +729,18 @@ handle_bad_signal(int sig)
#include "_usage.h"
#define usagestring "" \
"Usage: rc [options] [<runlevel>]"
-#define getoptstring "a:o:s:S" getoptstring_COMMON
+#define getoptstring "a:no:s:S" getoptstring_COMMON
static const struct option longopts[] = {
{ "applet", 1, NULL, 'a' },
- { "override", 1, NULL, 'o' },
- { "service", 1, NULL, 's' },
- { "sys", 0, NULL, 'S' },
+ { "no-stop", 0, NULL, 'n' },
+ { "override", 1, NULL, 'o' },
+ { "service", 1, NULL, 's' },
+ { "sys", 0, NULL, 'S' },
longopts_COMMON
};
static const char * const longopts_help[] = {
"runs the applet specified by the next argument",
+ "do not stop any services",
"override the next runlevel to change into\n"
"when leaving single user or boot runlevels",
"runs the service specified with the rest\nof the arguments",
@@ -762,6 +764,7 @@ main(int argc, char **argv)
int opt;
bool parallel;
int regen = 0;
+ bool nostop = false;
#ifdef __linux__
char *proc;
char *p;
@@ -812,6 +815,9 @@ main(int argc, char **argv)
/* Do nothing, actual logic in run_applets, this
* is a placeholder */
break;
+ case 'n':
+ nostop = true;
+ break;
case 'o':
if (*optarg == '\0')
optarg = NULL;
@@ -1022,7 +1028,7 @@ main(int argc, char **argv)
parallel = rc_conf_yesno("rc_parallel");
/* Now stop the services that shouldn't be running */
- if (stop_services)
+ if (stop_services && !nostop)
do_stop_services(newlevel, parallel, going_down);
/* Wait for our services to finish */