Don't put "shares console" processes in the foreground.
authorDavin McCall <davmac@davmac.org>
Mon, 8 Jul 2019 10:25:27 +0000 (20:25 +1000)
committerDavin McCall <davmac@davmac.org>
Mon, 8 Jul 2019 10:25:27 +0000 (20:25 +1000)
We don't want them to steal signals such as ^C from a real "runs on
console" process.

src/baseproc-service.cc
src/includes/proc-service.h
src/run-child-proc.cc

index 157b7ae6a5b13051e5866bfde35718df784b3917..4ff189604b376e95eef86b0b643ebd29d1d207bb 100644 (file)
@@ -157,6 +157,7 @@ bool base_process_service::start_ps_process(const std::vector<const char *> &cmd
         after_fork(getpid());
         run_proc_params run_params{cmd.data(), working_dir_c, logfile, pipefd[1], run_as_uid, run_as_gid, rlimits};
         run_params.on_console = on_console;
+        run_params.in_foreground = !onstart_flags.shares_console;
         run_params.csfd = control_socket[1];
         run_params.socket_fd = socket_fd;
         run_params.notify_fd = notify_pipe[1];
index b77113de6f244ed1e16de9722d488b49107a2cd9..e7faf57c51a6264276acfc2627e974916f402b7c 100644 (file)
@@ -31,8 +31,9 @@ struct run_proc_params
     const char * const *args; // program arguments including executable (args[0])
     const char *working_dir;  // working directory
     const char *logfile;      // log file or nullptr (stdout/stderr); must be valid if !on_console
-    const char *env_file;      // file with environment settings (or nullptr)
+    const char *env_file;     // file with environment settings (or nullptr)
     bool on_console;          // whether to run on console
+    bool in_foreground;       // if on console: whether to run in foreground
     int wpipefd;              // pipe to which error status will be sent (if error occurs)
     int csfd;                 // control socket fd (or -1); may be moved
     int socket_fd;            // pre-opened socket fd (or -1); may be moved
@@ -46,8 +47,8 @@ struct run_proc_params
     run_proc_params(const char * const *args, const char *working_dir, const char *logfile, int wpipefd,
             uid_t uid, gid_t gid, const std::vector<service_rlimits> &rlimits)
             : args(args), working_dir(working_dir), logfile(logfile), env_file(nullptr), on_console(false),
-              wpipefd(wpipefd), csfd(-1), socket_fd(-1), notify_fd(-1), force_notify_fd(-1), notify_var(nullptr),
-              uid(uid), gid(gid), rlimits(rlimits)
+              in_foreground(false), wpipefd(wpipefd), csfd(-1), socket_fd(-1), notify_fd(-1),
+              force_notify_fd(-1), notify_var(nullptr), uid(uid), gid(gid), rlimits(rlimits)
     { }
 };
 
index d3a8326811519a64247ff7a44c29247dd035ae6b..f387d9204b29591f8efabe5e469894bcff4bf3d5 100644 (file)
@@ -227,7 +227,9 @@ void base_process_service::run_child_proc(run_proc_params params) noexcept
             ioctl(0, TIOCSCTTY, 0);
         }
         setpgid(0,0);
-        tcsetpgrp(0, getpgrp());
+        if (params.in_foreground) {
+            tcsetpgrp(0, getpgrp());
+        }
     }
 
     // Resource limits