From 10a4385e409b48d9aa60590c140d4ca6485a7a72 Mon Sep 17 00:00:00 2001 From: William Hubbs Date: Sun, 28 Apr 2013 12:51:12 -0500 Subject: [PATCH] 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 --- man/rc.8 | 9 +++++---- src/rc/rc.c | 16 +++++++++++----- 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] []" -#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 */