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
This commit is contained in:
William Hubbs
2013-04-28 12:51:12 -05:00
parent 10eabd4d92
commit 10a4385e40
2 changed files with 16 additions and 9 deletions

View File

@ -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 */