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