Separate "runs-on-console" into runs-on- and starts-on- options.
authorDavin McCall <davmac@davmac.org>
Fri, 2 Jun 2017 18:39:07 +0000 (19:39 +0100)
committerDavin McCall <davmac@davmac.org>
Fri, 2 Jun 2017 18:39:07 +0000 (19:39 +0100)
README
doc/linux/services/auxfscheck
doc/linux/services/rootfscheck
src/load_service.cc
src/service.cc
src/service.h

diff --git a/README b/README
index 3312c922c7ba414a4ea0c52d5e94c70478c3d81b..c9213a7056463a94d1001f0b2d939ed2919dc5ba 100644 (file)
--- a/README
+++ b/README
@@ -220,13 +220,23 @@ options = ( runs-on-console | nosigterm | starts-rwfs | starts-log ) ...
   runs-on-console : specifies that this service uses the console; its input
               and output should be directed to the console. A service running
               on the console prevents other services from running on the
-              console (they will queue for the console). For scripted services
-              "runs-on-console" applies only during execution of the start
-              script.
+              console (they will queue for the console).
 
               The "interrupt" key (normally control-C) will be active for
-              process / scripted services that run on the console. This is
-              useful to allow filesystem checks to be interrupted/skipped.
+              process / scripted services that run on the console. Handling
+              of an interrupt is determined by the service process, but
+              typically will cause it to terminate.
+              
+  starts-on-console : specifies that this service uses the console during
+              service startup. This is implied by runs-on-console, but can
+              be specified separately for services that need the console
+              while they start but not afterwards.
+              
+              This setting is not applicable to regular "process" services,
+              but can be used for "scripted" and "bgprocess" services. It
+              allows for interrupting startup via the "interrupt" key
+              (normally control-C). This is useful to allow filesystem checks
+              to be interrupted/skipped.
 
   starts-rwfs : this service mounts the root filesystem read/write (or at
               least mounts the normal writable filesystems for the system).
index 5eccc38ffac280a30afb5938fea8e8cd42a04f30..135871d6ceded4e8d8f57b6b1a35b0b2b92d84e7 100644 (file)
@@ -3,7 +3,7 @@
 type = scripted
 command = /sbin/fsck -A -R -C -a
 restart = false
-options = runs-on-console
+options = starts-on-console
 
 depends-on = early-filesystems
 depends-on = udevd
index 236cc1f9623adf8d308b1c1d4386f52469bbb3fd..c8e0ef27f43f3579ea091f58833b585d5189dae3 100644 (file)
@@ -3,7 +3,7 @@
 type = scripted
 command = /etc/dinit.d/rootfscheck.sh start
 restart = false
-options = runs-on-console pass-cs-fd
+options = starts-on-console pass-cs-fd
 
 depends-on = early-filesystems
 depends-on = udevd
index 61ed0e77ccbedeb00540a3f653cc21348c09c756..e01f50c80f3636d1b16e3f546a5f720f13f378fd 100644 (file)
@@ -468,6 +468,11 @@ ServiceRecord * ServiceSet::loadServiceRecord(const char * name)
                         }
                         else if (option_txt == "runs-on-console") {
                             onstart_flags.runs_on_console = true;
+                            // A service that runs on the console necessarily starts on console:
+                            onstart_flags.starts_on_console = true;
+                        }
+                        else if (option_txt == "starts-on-console") {
+                            onstart_flags.starts_on_console = true;
                         }
                         else if (option_txt == "pass-cs-fd") {
                             onstart_flags.pass_cs_fd = true;
index 282809ca5a0efe39805e2936611cacdfefde95a5..f8cc7e3bc489c4dfdeb01f579345ce27965f310c 100644 (file)
@@ -69,8 +69,7 @@ void ServiceSet::stopService(const std::string & name) noexcept
 // is due to an unexpected process termination.
 void ServiceRecord::stopped() noexcept
 {
-    if (service_type != ServiceType::SCRIPTED && service_type != ServiceType::BGPROCESS
-            && onstart_flags.runs_on_console) {
+    if (onstart_flags.runs_on_console) {
         tcsetpgrp(0, getpgrp());
         discard_console_log_buffer();
         releaseConsole();
@@ -625,7 +624,7 @@ bool ServiceRecord::open_socket() noexcept
 
 void ServiceRecord::allDepsStarted(bool has_console) noexcept
 {
-    if (onstart_flags.runs_on_console && ! has_console) {
+    if (onstart_flags.starts_on_console && ! has_console) {
         waiting_for_deps = true;
         queueForConsole();
         return;
@@ -689,7 +688,7 @@ bool bgproc_service::read_pid_file() noexcept
 
 void ServiceRecord::started() noexcept
 {
-    if (onstart_flags.runs_on_console && (service_type == ServiceType::SCRIPTED || service_type == ServiceType::BGPROCESS)) {
+    if (onstart_flags.starts_on_console && ! onstart_flags.runs_on_console) {
         tcsetpgrp(0, getpgrp());
         releaseConsole();
     }
@@ -722,7 +721,7 @@ void ServiceRecord::started() noexcept
 
 void ServiceRecord::failed_to_start(bool depfailed) noexcept
 {
-    if (!depfailed && onstart_flags.runs_on_console) {
+    if (!depfailed && onstart_flags.starts_on_console) {
         tcsetpgrp(0, getpgrp());
         releaseConsole();
     }
index e4dd2d9967a6356cdf1d663194bd0488aff7ebda..21411b6bbf05f0da7f70519c1e80d000beb679ab 100644 (file)
@@ -88,10 +88,11 @@ struct OnstartFlags {
     // Not actually "onstart" commands:
     bool no_sigterm : 1;  // do not send SIGTERM
     bool runs_on_console : 1;  // run "in the foreground"
+    bool starts_on_console : 1; // starts in the foreground
     bool pass_cs_fd : 1;  // pass this service a control socket connection via fd
     
     OnstartFlags() noexcept : rw_ready(false), log_ready(false),
-            no_sigterm(false), runs_on_console(false), pass_cs_fd(false)
+            no_sigterm(false), runs_on_console(false), starts_on_console(false), pass_cs_fd(false)
     {
     }
 };