diff --git a/start-stop-daemon/.signature b/start-stop-daemon/.signature index be715434..f822de8c 100644 --- a/start-stop-daemon/.signature +++ b/start-stop-daemon/.signature @@ -1,8 +1,8 @@ untrusted comment: verify with /etc/ports/core.pub -RWRJc1FUaeVeqtzIP5R7BRVnVyT9uoMyWkuSFh2vdov+LPYO9KSxLhQHpmcK+9iXsCBkqyJP9SfsG936QWlEj3XT9JGve77O+Qc= -SHA256 (Pkgfile) = d512505d65536c5810b0339c88617b37626363be627a41c35775abb788911db8 +RWRJc1FUaeVeqsNL6g8ZyJ5JvTcjHYjX1m9ID9Wdy+Strp6/sxdAHN2Lqp0sXfckN9afsjzhx2DAR7SUXYS3Vr8+SAPymIJmawU= +SHA256 (Pkgfile) = 5808bc2dc26db91b17b3799250c742957fdaec7c99cf9590df1decdd4d26f78b SHA256 (.footprint) = a24924dba386364cd2326ad6abefd3be01927f37f8f2175b3f56845fc88bfb79 -SHA256 (start-stop-daemon.c) = 880baaaf05be96a9b1c56cd9e41dbce0624f059209535569a6a3ae9dcb91a1e2 -SHA256 (start-stop-daemon.8) = 6920da66e820b7d210514660756b566f4a36c791178ed26e67fbdaf7315408fa -SHA256 (crux-patch.diff) = 1a02209ee0683cd789577417dbeb3299a5cd72a908af5bd5b3ec743c0629dcc2 -SHA256 (makefile) = 7ce6e34d7473e965a55ccabf195468cf53f0c49a6d344bc41cd545b2ff8a5485 +SHA256 (start-stop-daemon.c) = 993487323a2d32c4bced321414ab5f66fc5e546b1863a9239aeb158423bedf7c +SHA256 (start-stop-daemon.pod) = c588a34af20e087a57ea79349a6c2494874f7b6b673e464661dcff68a0335ced +SHA256 (crux-patch.diff) = f9ceec9a82d41ee663f12a3e351172cb26524664a6479062f49f1e50531f2608 +SHA256 (makefile) = 74de83342773a7de5928acbdbe79777e54169666b395d1d10bbae34386aed62a diff --git a/start-stop-daemon/Pkgfile b/start-stop-daemon/Pkgfile index bcac2823..e53d48d4 100644 --- a/start-stop-daemon/Pkgfile +++ b/start-stop-daemon/Pkgfile @@ -3,9 +3,9 @@ # Maintainer: CRUX System Team, core-ports at crux dot nu name=start-stop-daemon -version=20200811 +version=20210109 release=1 -source=(start-stop-daemon.c start-stop-daemon.8 crux-patch.diff makefile) +source=(start-stop-daemon.c start-stop-daemon.pod crux-patch.diff makefile) build () { patch -p1 -i crux-patch.diff diff --git a/start-stop-daemon/crux-patch.diff b/start-stop-daemon/crux-patch.diff index 5e580ab4..a5865088 100644 --- a/start-stop-daemon/crux-patch.diff +++ b/start-stop-daemon/crux-patch.diff @@ -1,52 +1,5 @@ -diff --git a/start-stop-daemon.8 b/start-stop-daemon.8 -index 2a083f3..bbeb0f6 100644 ---- a/start-stop-daemon.8 -+++ b/start-stop-daemon.8 -@@ -20,7 +20,7 @@ - .\" You should have received a copy of the GNU General Public License - .\" along with this program. If not, see . - . --.TH start\-stop\-daemon 8 "%RELEASE_DATE%" "%VERSION%" "dpkg suite" -+.TH start\-stop\-daemon 8 "2020-08-11" "CRUX 3.6" "dpkg suite" - .nh - .SH NAME - start\-stop\-daemon \- start and stop system daemon programs -@@ -269,33 +269,6 @@ reason. This is a last resort, and is only meant for programs that either - make no sense forking on their own, or where it's not feasible to add the - code for them to do this themselves. - .TP --.BR \-\-notify\-await --Wait for the background process to send a readiness notification before --considering the service started (since version 1.19.3). --This implements parts of the systemd readiness procotol, as specified --in the \fBsd_notify\fP(3) man page. --The following variables are supported: --.RS --.TP --.B READY=1 --The program is ready to give service, so we can exit safely. --.TP --.BI EXTEND_TIMEOUT_USEC= number --The program requests to extend the timeout by \fInumber\fP microseconds. --This will reset the current timeout to the specified value. --.TP --.BI ERRNO= number --The program is exiting with an error. --Do the same and print the user-friendly string for the \fBerrno\fP value. --.RE --. --.TP --.BI \-\-notify\-timeout timeout --Set a timeout for the \fB\-\-notify\-await\fP option (since version 1.19.3). --When the timeout is reached, \fBstart\-stop\-daemon\fP will exit with an --error code, and no readiness notification will be awaited. --The default is \fB60\fP seconds. --.TP - .BR \-C ", " \-\-no\-close - Do not close any file descriptor when forcing the daemon into the background - (since version 1.16.5). diff --git a/start-stop-daemon.c b/start-stop-daemon.c -index 3947cc0..1e0e163 100644 +index d16f0ed..1c3ff78 100644 --- a/start-stop-daemon.c +++ b/start-stop-daemon.c @@ -20,10 +20,36 @@ @@ -59,10 +12,10 @@ index 3947cc0..1e0e163 100644 #include +#else -+# define VERSION "20200811" -+# define CRUX "CRUX-Linux" ++# define VERSION "20210109" ++# define CRUX "CRUX-Linux" + -+# define WANT_SYSTEMD_NOTIFY 0 /* 1=yes */ ++# define WANT_SYSTEMD_NOTIFY 0 /* 1=yes */ + +# define HAVE_SYS_PARAM_H +# define HAVE_SYS_SYSCALL_H @@ -76,7 +29,7 @@ index 3947cc0..1e0e163 100644 +# define HAVE_IOPRIO_SET +# define HAVE_SETSID + -+# define DPKG_ATTR_NORET __attribute__((noreturn)) ++# define DPKG_ATTR_NORET __attribute__((noreturn)) +# define DPKG_ATTR_PRINTF(X) +# define DPKG_ATTR_VPRINTF(X) + @@ -86,21 +39,21 @@ index 3947cc0..1e0e163 100644 #if defined(__linux__) # define OS_Linux -@@ -160,6 +186,10 @@ - #define HAVE_IOPRIO_SET +@@ -135,6 +161,10 @@ + #define SCHED_RR -1 #endif +#ifndef array_count -+# define array_count(x) (sizeof(x) / sizeof((x)[0])) ++# define array_count(x) (sizeof(x) / sizeof((x)[0])) +#endif + - #define IOPRIO_CLASS_SHIFT 13 - #define IOPRIO_PRIO_VALUE(class, prio) (((class) << IOPRIO_CLASS_SHIFT) | (prio)) - #define IO_SCHED_PRIO_MIN 0 -@@ -212,10 +242,12 @@ static int quietmode = 0; - static int exitnodo = 1; + #if defined(OS_Linux) + /* This comes from TASK_COMM_LEN defined in Linux' include/linux/sched.h. */ + #define PROCESS_NAME_SIZE 15 +@@ -213,10 +243,12 @@ static int exitnodo = 1; static bool background = false; static bool close_io = true; + static const char *output_io; +#if WANT_SYSTEMD_NOTIFY static bool notify_await = false; static int notify_timeout = 60; @@ -110,7 +63,7 @@ index 3947cc0..1e0e163 100644 static bool mpidfile = false; static bool rpidfile = false; static int signal_nr = SIGTERM; -@@ -405,8 +437,7 @@ xstrndup(const char *str, size_t n) +@@ -406,8 +438,7 @@ xstrndup(const char *str, size_t n) static void timespec_gettime(struct timespec *ts) { @@ -120,7 +73,7 @@ index 3947cc0..1e0e163 100644 if (clock_gettime(CLOCK_MONOTONIC, ts) < 0) fatale("clock_gettime failed"); #else -@@ -548,6 +579,7 @@ wait_for_child(pid_t pid) +@@ -549,6 +580,7 @@ wait_for_child(pid_t pid) } } @@ -128,7 +81,7 @@ index 3947cc0..1e0e163 100644 static void cleanup_socket_dir(void) { -@@ -737,6 +769,7 @@ wait_for_notify(int fd) +@@ -738,6 +770,7 @@ wait_for_notify(int fd) } } } @@ -136,7 +89,7 @@ index 3947cc0..1e0e163 100644 static void write_pidfile(const char *filename, pid_t pid) -@@ -769,7 +802,9 @@ remove_pidfile(const char *filename) +@@ -770,7 +803,9 @@ remove_pidfile(const char *filename) static void daemonize(void) { @@ -146,7 +99,7 @@ index 3947cc0..1e0e163 100644 pid_t pid; sigset_t mask; sigset_t oldmask; -@@ -783,8 +818,10 @@ daemonize(void) +@@ -784,8 +819,10 @@ daemonize(void) if (sigprocmask(SIG_BLOCK, &mask, &oldmask) == -1) fatale("cannot block SIGCHLD"); @@ -157,7 +110,7 @@ index 3947cc0..1e0e163 100644 pid = fork(); if (pid < 0) -@@ -795,6 +832,7 @@ daemonize(void) +@@ -796,6 +833,7 @@ daemonize(void) * not suffer from race conditions on return. */ wait_for_child(pid); @@ -165,7 +118,7 @@ index 3947cc0..1e0e163 100644 if (notify_await) { /* Wait for a readiness notification from the second * child, so that we can safely exit when the service -@@ -803,13 +841,16 @@ daemonize(void) +@@ -804,13 +842,16 @@ daemonize(void) close(notify_fd); cleanup_socket_dir(); } @@ -182,7 +135,7 @@ index 3947cc0..1e0e163 100644 /* Create a new session. */ if (setsid() < 0) -@@ -905,8 +946,10 @@ usage(void) +@@ -906,8 +947,10 @@ usage(void) " scheduler (default prio is 4)\n" " -k, --umask change the umask to before starting\n" " -b, --background force the process to detach\n" @@ -191,9 +144,9 @@ index 3947cc0..1e0e163 100644 " --notify-timeout timeout after seconds of notify wait\n" +#endif " -C, --no-close do not close any file descriptor\n" + " -O, --output send stdout and stderr to \n" " -m, --make-pidfile create the pidfile before starting\n" - " --remove-pidfile delete the pidfile after stopping\n" -@@ -951,9 +994,9 @@ usage(void) +@@ -953,9 +996,9 @@ usage(void) static void do_version(void) { @@ -206,7 +159,7 @@ index 3947cc0..1e0e163 100644 } static void DPKG_ATTR_NORET -@@ -1278,8 +1321,10 @@ parse_options(int argc, char * const *argv) +@@ -1280,8 +1323,10 @@ parse_options(int argc, char * const *argv) { "iosched", 1, NULL, 'I'}, { "umask", 1, NULL, 'k'}, { "background", 0, NULL, 'b'}, @@ -215,9 +168,9 @@ index 3947cc0..1e0e163 100644 { "notify-timeout", 1, NULL, OPT_NOTIFY_TIMEOUT}, +#endif { "no-close", 0, NULL, 'C'}, + { "output", 1, NULL, 'O'}, { "make-pidfile", 0, NULL, 'm'}, - { "remove-pidfile", 0, NULL, OPT_RM_PIDFILE}, -@@ -1294,7 +1339,9 @@ parse_options(int argc, char * const *argv) +@@ -1297,7 +1342,9 @@ parse_options(int argc, char * const *argv) const char *schedule_str = NULL; const char *proc_schedule_str = NULL; const char *io_schedule_str = NULL; @@ -227,7 +180,7 @@ index 3947cc0..1e0e163 100644 size_t changeuser_len; int c; -@@ -1395,12 +1442,14 @@ parse_options(int argc, char * const *argv) +@@ -1398,12 +1445,14 @@ parse_options(int argc, char * const *argv) case 'b': /* --background */ background = true; break; @@ -242,9 +195,9 @@ index 3947cc0..1e0e163 100644 case 'C': /* --no-close */ close_io = false; break; -@@ -1453,9 +1502,11 @@ parse_options(int argc, char * const *argv) - badusage("umask value must be a positive number"); - } +@@ -1462,9 +1511,11 @@ parse_options(int argc, char * const *argv) + if (output_io != NULL && output_io[0] != '/') + badusage("--output file needs to be an absolute filename"); +#if WANT_SYSTEMD_NOTIFY if (notify_timeout_str != NULL) @@ -254,7 +207,7 @@ index 3947cc0..1e0e163 100644 if (action == ACTION_NONE) badusage("need one of --start or --stop or --status"); -@@ -2303,7 +2354,8 @@ do_pidfile(const char *name) +@@ -2317,7 +2368,8 @@ do_pidfile(const char *name) if (match_mode == MATCH_PIDFILE && ((st.st_uid != getuid() && st.st_uid != 0) || @@ -264,3 +217,47 @@ index 3947cc0..1e0e163 100644 fatal("matching only on non-root pidfile %s is insecure", name); if (st.st_mode & 0002) fatal("matching on world-writable pidfile %s is insecure", name); +diff --git a/start-stop-daemon.pod b/start-stop-daemon.pod +index 499e945..58cc083 100644 +--- a/start-stop-daemon.pod ++++ b/start-stop-daemon.pod +@@ -312,39 +312,6 @@ reason. This is a last resort, and is only meant for programs that either + make no sense forking on their own, or where it's not feasible to add the + code for them to do this themselves. + +-=item B<--notify-await> +- +-Wait for the background process to send a readiness notification before +-considering the service started (since version 1.19.3). +-This implements parts of the systemd readiness protocol, as specified +-in the B(3) man page. +-The following variables are supported: +- +-=over +- +-=item B +- +-The program is ready to give service, so we can exit safely. +- +-=item BI +- +-The program requests to extend the timeout by I microseconds. +-This will reset the current timeout to the specified value. +- +-=item BI +- +-The program is exiting with an error. +-Do the same and print the user-friendly string for the B value. +- +-=back +- +-=item B<--notify-timeout> I +- +-Set a timeout for the B<--notify-await> option (since version 1.19.3). +-When the timeout is reached, B will exit with an +-error code, and no readiness notification will be awaited. +-The default is B<60> seconds. +- + =item B<-C>, B<--no-close> + + Do not close any file descriptor when forcing the daemon into the background diff --git a/start-stop-daemon/makefile b/start-stop-daemon/makefile index 976a01ab..fa119127 100644 --- a/start-stop-daemon/makefile +++ b/start-stop-daemon/makefile @@ -1,12 +1,21 @@ CC = cc CFLAGS += -g -Wall + PROGRAM = start-stop-daemon SOURCES = start-stop-daemon.c +MANUAL = start-stop-daemon.8 +POD = start-stop-daemon.pod + +default: all + $(PROGRAM): $(SOURCES) $(CC) $(CFLAGS) -o $(@) $(SOURCES) +$(MANUAL): $(POD) + pod2man --section=8 --center=' ' $(POD) $(@) -all: $(PROGRAM) -clean: ; rm -f $(PROGRAM) +all: $(PROGRAM) $(MANUAL) +clean: ; rm -f $(PROGRAM) $(MANUAL) +patch: ; patch -p1 -i crux-patch.diff force: clean all diff --git a/start-stop-daemon/start-stop-daemon.8 b/start-stop-daemon/start-stop-daemon.8 deleted file mode 100644 index 2a083f34..00000000 --- a/start-stop-daemon/start-stop-daemon.8 +++ /dev/null @@ -1,420 +0,0 @@ -.\" dpkg manual page - start-stop-daemon(8) -.\" -.\" Copyright © 1999 Klee Dienes -.\" Copyright © 1999 Ben Collins -.\" Copyright © 2000-2001 Wichert Akkerman -.\" Copyright © 2002-2003 Adam Heath -.\" Copyright © 2004 Scott James Remnant -.\" Copyright © 2008-2016, 2018 Guillem Jover -.\" -.\" This is free software; you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation; either version 2 of the License, or -.\" (at your option) any later version. -.\" -.\" This is distributed in the hope that it will be useful, -.\" but WITHOUT ANY WARRANTY; without even the implied warranty of -.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.\" GNU General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program. If not, see . -. -.TH start\-stop\-daemon 8 "%RELEASE_DATE%" "%VERSION%" "dpkg suite" -.nh -.SH NAME -start\-stop\-daemon \- start and stop system daemon programs -. -.SH SYNOPSIS -.B start\-stop\-daemon -.RI [ option "...] " command -. -.SH DESCRIPTION -.B start\-stop\-daemon -is used to control the creation and termination of system-level processes. -Using one of the matching options, \fBstart\-stop\-daemon\fP -can be configured to find existing instances of a running process. -.PP -Note: unless -.B \-\-pid -or -.B \-\-pidfile -are specified, -.B start\-stop\-daemon -behaves similar to -.BR killall (1). -.B start\-stop\-daemon -will scan the process table looking for any processes which -match the process name, parent pid, uid, and/or gid (if specified). Any -matching process will prevent -.BR \-\-start -from starting the daemon. All matching processes will be sent the TERM -signal (or the one specified via \fB\-\-signal\fP or \fB\-\-retry\fP) if -.BR \-\-stop -is specified. For daemons which have long-lived children -which need to live through a -.BR \-\-stop , -you must specify a pidfile. -. -.SH COMMANDS -.TP -.BR \-S ", " \-\-start " [" \-\- "] \fIarguments\fP" -Check for the existence of a specified process. -If such a process exists, -.B start\-stop\-daemon -does nothing, and exits with error status 1 (0 if -.BR \-\-oknodo -is specified). -If such a process does not exist, it starts an -instance, using either the executable specified by -.B \-\-exec -or, if specified, by -.BR \-\-startas . -Any arguments given after -.BR \-\- -on the command line are passed unmodified to the program being -started. -.TP -.BR \-K ", " \-\-stop -Checks for the existence of a specified process. -If such a process exists, -.B start\-stop\-daemon -sends it the signal specified by -.BR \-\-signal , -and exits with error status 0. -If such a process does not exist, -.B start\-stop\-daemon -exits with error status 1 -(0 if -.BR \-\-oknodo -is specified). If -.B \-\-retry -is specified, then -.B start\-stop\-daemon -will check that the process(es) have terminated. -.TP -.BR \-T ", " \-\-status -Check for the existence of a specified process, and returns an exit status -code, according to the LSB Init Script Actions (since version 1.16.1). -.TP -.BR \-H ", " \-\-help -Show usage information and exit. -.TP -.BR \-V ", " \-\-version -Show the program version and exit. -. -.SH OPTIONS -.SS Matching options -.TP -.BR \-\-pid " \fIpid\fP" -Check for a process with the specified \fIpid\fP (since version 1.17.6). -The \fIpid\fP must be a number greater than 0. -.TP -.BR \-\-ppid " \fIppid\fP" -Check for a process with the specified parent pid \fIppid\fP -(since version 1.17.7). -The \fIppid\fP must be a number greater than 0. -.TP -.BR \-p ", " \-\-pidfile " \fIpid-file\fP" -Check whether a process has created the file \fIpid-file\fP. -.IP -Note: using this matching option alone might cause unintended processes to -be acted on, if the old process terminated without being able to remove the -\fIpid-file\fP. -.IP -\fBWarning:\fP using this match option with a world-writable pidfile or using -it alone with a daemon that writes the pidfile as an unprivileged (non-root) -user will be refused with an error (since version 1.19.3) as this is a -security risk, because either any user can write to it, or if the daemon -gets compromised, the contents of the pidfile cannot be trusted, and then -a privileged runner (such as an init script executed as root) would end up -acting on any system process. -Using \fI/dev/null\fP is exempt from these checks. -.TP -.BR \-x ", " \-\-exec " \fIexecutable\fP" -Check for processes that are instances of this \fIexecutable\fP. The -\fIexecutable\fP argument should be an absolute pathname. Note: this might -not work as intended with interpreted scripts, as the executable will point -to the interpreter. Take into account processes running from inside a chroot -will also be matched, so other match restrictions might be needed. -.TP -.BR \-n ", " \-\-name " \fIprocess-name\fP" -Check for processes with the name \fIprocess-name\fP. The \fIprocess-name\fP -is usually the process filename, but it could have been changed by the -process itself. Note: on most systems this information is retrieved from -the process comm name from the kernel, which tends to have a relatively -short length limit (assuming more than 15 characters is non-portable). -.TP -.BR \-u ", " \-\-user " \fIusername\fP|\fIuid\fP -Check for processes owned by the user specified by \fIusername\fP or -\fIuid\fP. Note: using this matching option alone will cause all processes -matching the user to be acted on. -. -.SS Generic options -.TP -.BR \-g ", " \-\-group " \fIgroup\fP|\fIgid\fP" -Change to \fIgroup\fP or \fIgid\fP when starting the process. -.TP -.BR \-s ", " \-\-signal " \fIsignal\fP" -With -.BR \-\-stop , -specifies the signal to send to processes being stopped (default TERM). -.TP -.BR \-R ", " \-\-retry " \fItimeout\fP|\fIschedule\fP" -With -.BR \-\-stop , -specifies that -.B start\-stop\-daemon -is to check whether the process(es) -do finish. It will check repeatedly whether any matching processes -are running, until none are. If the processes do not exit it will -then take further action as determined by the schedule. - -If -.I timeout -is specified instead of -.IR schedule , -then the schedule -.IB signal / timeout /KILL/ timeout -is used, where -.I signal -is the signal specified with -.BR \-\-signal . - -.I schedule -is a list of at least two items separated by slashes -.RB ( / ); -each item may be -.BI \- signal-number -or [\fB\-\fP]\fIsignal-name\fP, -which means to send that signal, -or -.IR timeout , -which means to wait that many seconds for processes to -exit, -or -.BR forever , -which means to repeat the rest of the schedule forever if -necessary. - -If the end of the schedule is reached and -.BR forever -is not specified, then -.B start\-stop\-daemon -exits with error status 2. -If a schedule is specified, then any signal specified -with -.B \-\-signal -is ignored. -.TP -.BR \-a ", " \-\-startas " \fIpathname\fP" -With -.BR \-\-start , -start the process specified by -.IR pathname . -If not specified, defaults to the argument given to -.BR \-\-exec . -.TP -.BR \-t ", " \-\-test -Print actions that would be taken and set appropriate return value, -but take no action. -.TP -.BR \-o ", " \-\-oknodo -Return exit status 0 instead of 1 if no actions are (would be) taken. -.TP -.BR \-q ", " \-\-quiet -Do not print informational messages; only display error messages. -.TP -.BR \-c ", " \-\-chuid " \fIusername\fR|\fIuid\fP[\fB:\fP\fIgroup\fR|\fIgid\fP]" -Change to this username/uid before starting the process. You can also -specify a group by appending a -.BR : , -then the group or gid in the same way -as you would for the \fBchown\fP(1) command (\fIuser\fP\fB:\fP\fIgroup\fP). -If a user is specified without a group, the primary GID for that user is used. -When using this option -you must realize that the primary and supplemental groups are set as well, -even if the -.B \-\-group -option is not specified. The -.B \-\-group -option is only for -groups that the user isn't normally a member of (like adding per process -group membership for generic users like -.BR nobody ). -.TP -.BR \-r ", " \-\-chroot " \fIroot\fP" -Chdir and chroot to -.I root -before starting the process. Please note that the pidfile is also written -after the chroot. -.TP -.BR \-d ", " \-\-chdir " \fIpath\fP" -Chdir to -.I path -before starting the process. This is done after the chroot if the -\fB\-r\fP|\fB\-\-chroot\fP option is set. When not specified, -.B start\-stop\-daemon -will chdir to the root directory before starting the process. -.TP -.BR \-b ", " \-\-background -Typically used with programs that don't detach on their own. This option -will force -.B start\-stop\-daemon -to fork before starting the process, and force it into the background. -.B Warning: start\-stop\-daemon -cannot check the exit status if the process fails to execute for -.B any -reason. This is a last resort, and is only meant for programs that either -make no sense forking on their own, or where it's not feasible to add the -code for them to do this themselves. -.TP -.BR \-\-notify\-await -Wait for the background process to send a readiness notification before -considering the service started (since version 1.19.3). -This implements parts of the systemd readiness procotol, as specified -in the \fBsd_notify\fP(3) man page. -The following variables are supported: -.RS -.TP -.B READY=1 -The program is ready to give service, so we can exit safely. -.TP -.BI EXTEND_TIMEOUT_USEC= number -The program requests to extend the timeout by \fInumber\fP microseconds. -This will reset the current timeout to the specified value. -.TP -.BI ERRNO= number -The program is exiting with an error. -Do the same and print the user-friendly string for the \fBerrno\fP value. -.RE -. -.TP -.BI \-\-notify\-timeout timeout -Set a timeout for the \fB\-\-notify\-await\fP option (since version 1.19.3). -When the timeout is reached, \fBstart\-stop\-daemon\fP will exit with an -error code, and no readiness notification will be awaited. -The default is \fB60\fP seconds. -.TP -.BR \-C ", " \-\-no\-close -Do not close any file descriptor when forcing the daemon into the background -(since version 1.16.5). -Used for debugging purposes to see the process output, or to redirect file -descriptors to log the process output. -Only relevant when using \fB\-\-background\fP. -.TP -.BR \-N ", " \-\-nicelevel " \fIint\fP" -This alters the priority of the process before starting it. -.TP -.BR \-P ", " \-\-procsched " \fIpolicy\fP\fB:\fP\fIpriority\fP" -This alters the process scheduler policy and priority of the process before -starting it (since version 1.15.0). -The priority can be optionally specified by appending a \fB:\fP -followed by the value. The default \fIpriority\fP is 0. The currently -supported policy values are \fBother\fP, \fBfifo\fP and \fBrr\fP. -.TP -.BR \-I ", " \-\-iosched " \fIclass\fP\fB:\fP\fIpriority\fP" -This alters the IO scheduler class and priority of the process before starting -it (since version 1.15.0). -The priority can be optionally specified by appending a \fB:\fP followed -by the value. The default \fIpriority\fP is 4, unless \fIclass\fP is \fBidle\fP, -then \fIpriority\fP will always be 7. The currently supported values for -\fIclass\fP are \fBidle\fP, \fBbest-effort\fP and \fBreal-time\fP. -.TP -.BR \-k ", " \-\-umask " \fImask\fP" -This sets the umask of the process before starting it (since version 1.13.22). -.TP -.BR \-m ", " \-\-make\-pidfile -Used when starting a program that does not create its own pid file. This -option will make -.B start\-stop\-daemon -create the file referenced with -.B \-\-pidfile -and place the pid into it just before executing the process. Note, the -file will only be removed when stopping the program if -\fB\-\-remove\-pidfile\fP is used. -.B Note: -This feature may not work in all cases. Most notably when the program -being executed forks from its main process. Because of this, it is usually -only useful when combined with the -.B \-\-background -option. -.TP -.B \-\-remove\-pidfile -Used when stopping a program that does not remove its own pid file -(since version 1.17.19). -This option will make -.B start\-stop\-daemon -remove the file referenced with -.B \-\-pidfile -after terminating the process. -.TP -.BR \-v ", " \-\-verbose -Print verbose informational messages. -. -.SH EXIT STATUS -.TP -.B 0 -The requested action was performed. If -.B \-\-oknodo -was specified, it's also possible that nothing had to be done. -This can happen when -.B \-\-start -was specified and a matching process was already running, or when -.B \-\-stop -was specified and there were no matching processes. -.TP -.B 1 -If -.B \-\-oknodo -was not specified and nothing was done. -.TP -.B 2 -If -.B \-\-stop -and -.B \-\-retry -were specified, but the end of the schedule was reached and the processes were -still running. -.TP -.B 3 -Any other error. -.PP -When using the \fB\-\-status\fP command, the following status codes are -returned: -.TP -.B 0 -Program is running. -.TP -.B 1 -Program is not running and the pid file exists. -.TP -.B 3 -Program is not running. -.TP -.B 4 -Unable to determine program status. -. -.SH EXAMPLE -Start the \fBfood\fP daemon, unless one is already running (a process named -food, running as user food, with pid in food.pid): -.IP -.nf -start\-stop\-daemon \-\-start \-\-oknodo \-\-user food \-\-name food \\ - \-\-pidfile /run/food.pid \-\-startas /usr/sbin/food \\ - \-\-chuid food \-\- \-\-daemon -.fi -.PP -Send \fBSIGTERM\fP to \fBfood\fP and wait up to 5 seconds for it to stop: -.IP -.nf -start\-stop\-daemon \-\-stop \-\-oknodo \-\-user food \-\-name food \\ - \-\-pidfile /run/food.pid \-\-retry 5 -.fi -.PP -Demonstration of a custom schedule for stopping \fBfood\fP: -.IP -.nf -start\-stop\-daemon \-\-stop \-\-oknodo \-\-user food \-\-name food \\ - \-\-pidfile /run/food.pid \-\-retry=TERM/30/KILL/5 -.fi diff --git a/start-stop-daemon/start-stop-daemon.c b/start-stop-daemon/start-stop-daemon.c index 3947cc06..d16f0ed2 100644 --- a/start-stop-daemon/start-stop-daemon.c +++ b/start-stop-daemon/start-stop-daemon.c @@ -212,6 +212,7 @@ static int quietmode = 0; static int exitnodo = 1; static bool background = false; static bool close_io = true; +static const char *output_io; static bool notify_await = false; static int notify_timeout = 60; static char *notify_sockdir; @@ -908,6 +909,7 @@ usage(void) " --notify-await wait for a readiness notification\n" " --notify-timeout timeout after seconds of notify wait\n" " -C, --no-close do not close any file descriptor\n" +" -O, --output send stdout and stderr to \n" " -m, --make-pidfile create the pidfile before starting\n" " --remove-pidfile delete the pidfile after stopping\n" " -R, --retry check whether processes die, and retry\n" @@ -1281,6 +1283,7 @@ parse_options(int argc, char * const *argv) { "notify-await", 0, NULL, OPT_NOTIFY_AWAIT}, { "notify-timeout", 1, NULL, OPT_NOTIFY_TIMEOUT}, { "no-close", 0, NULL, 'C'}, + { "output", 1, NULL, 'O'}, { "make-pidfile", 0, NULL, 'm'}, { "remove-pidfile", 0, NULL, OPT_RM_PIDFILE}, { "retry", 1, NULL, 'R'}, @@ -1300,7 +1303,7 @@ parse_options(int argc, char * const *argv) for (;;) { c = getopt_long(argc, argv, - "HKSVTa:n:op:qr:s:tu:vx:c:N:P:I:k:bCmR:g:d:", + "HKSVTa:n:op:qr:s:tu:vx:c:N:P:I:k:bCO:mR:g:d:", longopts, NULL); if (c == -1) break; @@ -1404,6 +1407,9 @@ parse_options(int argc, char * const *argv) case 'C': /* --no-close */ close_io = false; break; + case 'O': /* --outout */ + output_io = optarg; + break; case 'm': /* --make-pidfile */ mpidfile = true; break; @@ -1453,6 +1459,9 @@ parse_options(int argc, char * const *argv) badusage("umask value must be a positive number"); } + if (output_io != NULL && output_io[0] != '/') + badusage("--output file needs to be an absolute filename"); + if (notify_timeout_str != NULL) if (parse_unsigned(notify_timeout_str, 10, ¬ify_timeout) != 0) badusage("invalid notify timeout value"); @@ -1491,6 +1500,11 @@ parse_options(int argc, char * const *argv) if (!close_io && !background) badusage("--no-close is only relevant with --background"); + if (output_io && !background) + badusage("--output is only relevant with --background"); + + if (close_io && output_io == NULL) + output_io = "/dev/null"; } static void @@ -2528,6 +2542,7 @@ static int do_start(int argc, char **argv) { int devnull_fd = -1; + int output_fd = -1; gid_t rgid; uid_t ruid; @@ -2564,6 +2579,8 @@ do_start(int argc, char **argv) return 0; debug("Starting %s...\n", startas); *--argv = startas; + if (umask_value >= 0) + umask(umask_value); if (background) /* Ok, we need to detach this process. */ daemonize(); @@ -2571,10 +2588,15 @@ do_start(int argc, char **argv) /* User wants _us_ to make the pidfile, but detach themself! */ write_pidfile(pidfile, getpid()); if (background && close_io) { - devnull_fd = open("/dev/null", O_RDWR); + devnull_fd = open("/dev/null", O_RDONLY); if (devnull_fd < 0) fatale("unable to open '%s'", "/dev/null"); } + if (background && output_io) { + output_fd = open(output_io, O_CREAT | O_WRONLY, 0664); + if (output_fd < 0) + fatale("unable to open '%s'", output_io); + } if (nicelevel) { errno = 0; if ((nice(nicelevel) == -1) && (errno != 0)) @@ -2584,8 +2606,6 @@ do_start(int argc, char **argv) set_proc_schedule(proc_sched); if (io_sched) set_io_schedule(io_sched); - if (umask_value >= 0) - umask(umask_value); if (changeroot != NULL) { if (chdir(changeroot) < 0) fatale("unable to chdir() to %s", changeroot); @@ -2616,12 +2636,14 @@ do_start(int argc, char **argv) fatale("unable to set uid to %s", changeuser); } + if (background && output_fd >= 0) { + dup2(output_fd, 1); /* stdout */ + dup2(output_fd, 2); /* stderr */ + } if (background && close_io) { int i; dup2(devnull_fd, 0); /* stdin */ - dup2(devnull_fd, 1); /* stdout */ - dup2(devnull_fd, 2); /* stderr */ /* Now close all extra fds. */ for (i = get_open_fd_max() - 1; i >= 3; --i) diff --git a/start-stop-daemon/start-stop-daemon.pod b/start-stop-daemon/start-stop-daemon.pod new file mode 100644 index 00000000..499e9451 --- /dev/null +++ b/start-stop-daemon/start-stop-daemon.pod @@ -0,0 +1,509 @@ +# dpkg manual page - start-stop-daemon(8) +# +# Copyright © 1999 Klee Dienes +# Copyright © 1999 Ben Collins +# Copyright © 2000-2001 Wichert Akkerman +# Copyright © 2002-2003 Adam Heath +# Copyright © 2004 Scott James Remnant +# Copyright © 2008-2016, 2018 Guillem Jover +# +# This is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +=encoding utf8 + +=head1 NAME + +start-stop-daemon - start and stop system daemon programs + +=head1 SYNOPSIS + +B +[I