264 lines
7.5 KiB
Diff
264 lines
7.5 KiB
Diff
diff --git a/start-stop-daemon.c b/start-stop-daemon.c
|
|
index d16f0ed..1c3ff78 100644
|
|
--- a/start-stop-daemon.c
|
|
+++ b/start-stop-daemon.c
|
|
@@ -20,10 +20,36 @@
|
|
* Changes by Ian Jackson: added --retry (and associated rearrangements).
|
|
*/
|
|
|
|
+#if 0
|
|
#include <config.h>
|
|
#include <compat.h>
|
|
|
|
#include <dpkg/macros.h>
|
|
+#else
|
|
+# define VERSION "20221219"
|
|
+# define CRUX "CRUX-Linux"
|
|
+
|
|
+# define WANT_SYSTEMD_NOTIFY 0 /* 1=yes */
|
|
+
|
|
+# define HAVE_SYS_PARAM_H
|
|
+# define HAVE_SYS_SYSCALL_H
|
|
+# define HAVE_SYS_USER_H
|
|
+# define HAVE_STDDEF_H
|
|
+# define HAVE_ERROR_H
|
|
+# define HAVE_ERR_H
|
|
+
|
|
+# define HAVE_CLOCK_MONOTONIC
|
|
+# define HAVE_GETDTABLESIZE
|
|
+# define HAVE_IOPRIO_SET
|
|
+# define HAVE_SETSID
|
|
+
|
|
+# define LIBCOMPAT_ATTR_NORET __attribute__((noreturn))
|
|
+# define LIBCOMPAT_ATTR_PRINTF(X)
|
|
+# define LIBCOMPAT_ATTR_VPRINTF(X)
|
|
+
|
|
+# define _GNU_SOURCE
|
|
+# include <unistd.h>
|
|
+#endif
|
|
|
|
#if defined(__linux__)
|
|
# define OS_Linux
|
|
@@ -135,6 +161,10 @@
|
|
#define SCHED_RR -1
|
|
#endif
|
|
|
|
+#ifndef array_count
|
|
+# define array_count(x) (sizeof(x) / sizeof((x)[0]))
|
|
+#endif
|
|
+
|
|
#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;
|
|
static char *notify_sockdir;
|
|
static char *notify_socket;
|
|
+#endif
|
|
static bool mpidfile = false;
|
|
static bool rpidfile = false;
|
|
static int signal_nr = SIGTERM;
|
|
@@ -406,8 +438,7 @@ xstrndup(const char *str, size_t n)
|
|
static void
|
|
timespec_gettime(struct timespec *ts)
|
|
{
|
|
-#if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0 && \
|
|
- defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK > 0
|
|
+#ifdef HAVE_CLOCK_MONOTONIC
|
|
if (clock_gettime(CLOCK_MONOTONIC, ts) < 0)
|
|
fatale("clock_gettime failed");
|
|
#else
|
|
@@ -549,6 +580,7 @@ wait_for_child(pid_t pid)
|
|
}
|
|
}
|
|
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
static void
|
|
cleanup_socket_dir(void)
|
|
{
|
|
@@ -738,6 +770,7 @@ wait_for_notify(int fd)
|
|
}
|
|
}
|
|
}
|
|
+#endif /* WANT_SYSTEMD_NOTIFY */
|
|
|
|
static void
|
|
write_pidfile(const char *filename, pid_t pid)
|
|
@@ -770,7 +803,9 @@ remove_pidfile(const char *filename)
|
|
static void
|
|
daemonize(void)
|
|
{
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
int notify_fd = -1;
|
|
+#endif
|
|
pid_t pid;
|
|
sigset_t mask;
|
|
sigset_t oldmask;
|
|
@@ -784,8 +819,10 @@ daemonize(void)
|
|
if (sigprocmask(SIG_BLOCK, &mask, &oldmask) == -1)
|
|
fatale("cannot block SIGCHLD");
|
|
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
if (notify_await)
|
|
notify_fd = create_notify_socket();
|
|
+#endif
|
|
|
|
pid = fork();
|
|
if (pid < 0)
|
|
@@ -796,6 +833,7 @@ daemonize(void)
|
|
* not suffer from race conditions on return. */
|
|
wait_for_child(pid);
|
|
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
if (notify_await) {
|
|
/* Wait for a readiness notification from the second
|
|
* child, so that we can safely exit when the service
|
|
@@ -804,13 +842,16 @@ daemonize(void)
|
|
close(notify_fd);
|
|
cleanup_socket_dir();
|
|
}
|
|
+#endif
|
|
|
|
_exit(0);
|
|
}
|
|
|
|
/* Close the notification socket, even though it is close-on-exec. */
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
if (notify_await)
|
|
close(notify_fd);
|
|
+#endif
|
|
|
|
/* Create a new session. */
|
|
if (setsid() < 0)
|
|
@@ -906,8 +947,10 @@ usage(void)
|
|
" scheduler (default prio is 4)\n"
|
|
" -k, --umask <mask> change the umask to <mask> before starting\n"
|
|
" -b, --background force the process to detach\n"
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
" --notify-await wait for a readiness notification\n"
|
|
" --notify-timeout <int> timeout after <int> seconds of notify wait\n"
|
|
+#endif
|
|
" -C, --no-close do not close any file descriptor\n"
|
|
" -O, --output <filename> send stdout and stderr to <filename>\n"
|
|
" -m, --make-pidfile create the pidfile before starting\n"
|
|
@@ -953,9 +996,9 @@ usage(void)
|
|
static void
|
|
do_version(void)
|
|
{
|
|
- printf("start-stop-daemon %s for Debian\n\n", VERSION);
|
|
-
|
|
- printf("Written by Marek Michalkiewicz, public domain.\n");
|
|
+ printf("start-stop-daemon " VERSION " for " CRUX "\n\n"
|
|
+ "Written by Marek Michalkiewicz, public domain.\n"
|
|
+ "Adjusted for " CRUX ".\n");
|
|
}
|
|
|
|
static void DPKG_ATTR_NORET
|
|
@@ -1280,8 +1323,10 @@ parse_options(int argc, char * const *argv)
|
|
{ "iosched", 1, NULL, 'I'},
|
|
{ "umask", 1, NULL, 'k'},
|
|
{ "background", 0, NULL, 'b'},
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
{ "notify-await", 0, NULL, OPT_NOTIFY_AWAIT},
|
|
{ "notify-timeout", 1, NULL, OPT_NOTIFY_TIMEOUT},
|
|
+#endif
|
|
{ "no-close", 0, NULL, 'C'},
|
|
{ "output", 1, NULL, 'O'},
|
|
{ "make-pidfile", 0, NULL, 'm'},
|
|
@@ -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;
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
const char *notify_timeout_str = NULL;
|
|
+#endif
|
|
size_t changeuser_len;
|
|
int c;
|
|
|
|
@@ -1398,12 +1445,14 @@ parse_options(int argc, char * const *argv)
|
|
case 'b': /* --background */
|
|
background = true;
|
|
break;
|
|
+#if WANT_SYSTEMD_NOTIFY
|
|
case OPT_NOTIFY_AWAIT:
|
|
notify_await = true;
|
|
break;
|
|
case OPT_NOTIFY_TIMEOUT:
|
|
notify_timeout_str = optarg;
|
|
break;
|
|
+#endif
|
|
case 'C': /* --no-close */
|
|
close_io = false;
|
|
break;
|
|
@@ -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)
|
|
if (parse_unsigned(notify_timeout_str, 10, ¬ify_timeout) != 0)
|
|
badusage("invalid notify timeout value");
|
|
+#endif
|
|
|
|
if (action == ACTION_NONE)
|
|
badusage("need one of --start or --stop or --status");
|
|
@@ -2317,7 +2368,8 @@ do_pidfile(const char *name)
|
|
|
|
if (match_mode == MATCH_PIDFILE &&
|
|
((st.st_uid != getuid() && st.st_uid != 0) ||
|
|
- (st.st_gid != getgid() && st.st_gid != 0)))
|
|
+ ((st.st_gid != getgid() && st.st_gid != 0) &&
|
|
+ (st.st_mode & 0020))))
|
|
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<sd_notify>(3) man page.
|
|
-The following variables are supported:
|
|
-
|
|
-=over
|
|
-
|
|
-=item B<READY=1>
|
|
-
|
|
-The program is ready to give service, so we can exit safely.
|
|
-
|
|
-=item B<EXTEND_TIMEOUT_USEC=>I<number>
|
|
-
|
|
-The program requests to extend the timeout by I<number> microseconds.
|
|
-This will reset the current timeout to the specified value.
|
|
-
|
|
-=item B<ERRNO=>I<number>
|
|
-
|
|
-The program is exiting with an error.
|
|
-Do the same and print the user-friendly string for the B<errno> value.
|
|
-
|
|
-=back
|
|
-
|
|
-=item B<--notify-timeout> I<timeout>
|
|
-
|
|
-Set a timeout for the B<--notify-await> option (since version 1.19.3).
|
|
-When the timeout is reached, B<start-stop-daemon> 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
|