1 /*
2 * A rewrite of the original Debian's start-stop-daemon Perl script
3 * in C (faster - it is executed many times during system startup).
4 *
5 * Written by Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>,
6 * public domain. Based conceptually on start-stop-daemon.pl, by Ian
7 * Jackson <ijackson@gnu.ai.mit.edu>. May be used and distributed
8 * freely for any purpose. Changes by Christian Schwarz
9 * <schwarz@monet.m.isar.de>, to make output conform to the Debian
10 * Console Message Standard, also placed in public domain. Minor
11 * changes by Klee Dienes <klee@debian.org>, also placed in the Public
12 * Domain.
13 *
14 * Changes by Ben Collins <bcollins@debian.org>, added --chuid, --background
15 * and --make-pidfile options, placed in public domain as well.
16 *
17 * Port to OpenBSD by Sontri Tomo Huynh <huynh.29@osu.edu>
18 * and Andreas Schuldei <andreas@schuldei.org>
19 *
20 * Changes by Ian Jackson: added --retry (and associated rearrangements).
21 */
22
23 #include <config.h>
24 #include <compat.h>
25
26 #include <dpkg/macros.h>
27
28 #if defined(__linux__)
29 # define OS_Linux
30 #elif defined(__GNU__)
31 # define OS_Hurd
32 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
33 # define OS_FreeBSD
34 #elif defined(__NetBSD__)
35 # define OS_NetBSD
36 #elif defined(__OpenBSD__)
37 # define OS_OpenBSD
38 #elif defined(__DragonFly__)
39 # define OS_DragonFlyBSD
40 #elif defined(__APPLE__) && defined(__MACH__)
41 # define OS_Darwin
42 #elif defined(__sun)
43 # define OS_Solaris
44 #elif defined(_AIX)
45 # define OS_AIX
46 #elif defined(__hpux)
47 # define OS_HPUX
48 #else
49 # error Unknown architecture - cannot build start-stop-daemon
50 #endif
51
52 /* NetBSD needs this to expose struct proc. */
53 #define _KMEMUSER 1
54
55 #ifdef HAVE_SYS_PARAM_H
56 #include <sys/param.h>
57 #endif
58 #ifdef HAVE_SYS_SYSCALL_H
59 #include <sys/syscall.h>
60 #endif
61 #ifdef HAVE_SYS_SYSCTL_H
62 #include <sys/sysctl.h>
63 #endif
64 #ifdef HAVE_SYS_PROCFS_H
65 #include <sys/procfs.h>
66 #endif
67 #ifdef HAVE_SYS_PROC_H
68 #include <sys/proc.h>
69 #endif
70 #ifdef HAVE_SYS_USER_H
71 #include <sys/user.h>
72 #endif
73 #ifdef HAVE_SYS_PSTAT_H
74 #include <sys/pstat.h>
75 #endif
76 #include <sys/types.h>
77 #include <sys/time.h>
78 #include <sys/stat.h>
79 #include <sys/wait.h>
80 #include <sys/select.h>
81 #include <sys/ioctl.h>
82 #include <sys/socket.h>
83 #include <sys/un.h>
84
85 #include <errno.h>
86 #include <limits.h>
87 #include <time.h>
88 #include <fcntl.h>
89 #include <dirent.h>
90 #include <ctype.h>
91 #include <string.h>
92 #include <pwd.h>
93 #include <grp.h>
94 #include <signal.h>
95 #include <termios.h>
96 #include <unistd.h>
97 #ifdef HAVE_STDDEF_H
98 #include <stddef.h>
99 #endif
100 #include <stdbool.h>
101 #include <stdarg.h>
102 #include <stdlib.h>
103 #include <stdio.h>
104 #include <getopt.h>
105 #ifdef HAVE_ERROR_H
106 #include <error.h>
107 #endif
108 #ifdef HAVE_ERR_H
109 #include <err.h>
110 #endif
111
112 #if defined(OS_Hurd)
113 #include <hurd.h>
114 #include <ps.h>
115 #endif
116
117 #if defined(OS_Darwin)
118 #include <libproc.h>
119 #endif
120
121 #ifdef HAVE_KVM_H
122 #include <kvm.h>
123 #if defined(OS_FreeBSD)
124 #define KVM_MEMFILE "/dev/null"
125 #else
126 #define KVM_MEMFILE NULL
127 #endif
128 #endif
129
130 #if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
131 #include <sched.h>
132 #else
133 #define SCHED_OTHER -1
134 #define SCHED_FIFO -1
135 #define SCHED_RR -1
136 #endif
137
138 /* At least macOS and AIX do not define this. */
139 #ifndef SOCK_NONBLOCK
140 #define SOCK_NONBLOCK 0
141 #endif
142
143 #if defined(OS_Linux)
144 /* This comes from TASK_COMM_LEN defined in Linux' include/linux/sched.h. */
145 #define PROCESS_NAME_SIZE 15
146 #elif defined(OS_Solaris)
147 #define PROCESS_NAME_SIZE 15
148 #elif defined(OS_Darwin)
149 #define PROCESS_NAME_SIZE 16
150 #elif defined(OS_AIX)
151 /* This comes from PRFNSZ defined in AIX's <sys/procfs.h>. */
152 #define PROCESS_NAME_SIZE 16
153 #elif defined(OS_NetBSD)
154 #define PROCESS_NAME_SIZE 16
155 #elif defined(OS_OpenBSD)
156 #define PROCESS_NAME_SIZE 16
157 #elif defined(OS_FreeBSD)
158 #define PROCESS_NAME_SIZE 19
159 #elif defined(OS_DragonFlyBSD)
160 /* On DragonFlyBSD MAXCOMLEN expands to 16. */
161 #define PROCESS_NAME_SIZE MAXCOMLEN
162 #endif
163
164 #if defined(SYS_ioprio_set) && defined(linux)
165 #define HAVE_IOPRIO_SET
166 #endif
167
168 #define IOPRIO_CLASS_SHIFT 13
169 #define IOPRIO_PRIO_VALUE(class, prio) (((class) << IOPRIO_CLASS_SHIFT) | (prio))
170 #define IO_SCHED_PRIO_MIN 0
171 #define IO_SCHED_PRIO_MAX 7
172
173 enum {
174 IOPRIO_WHO_PROCESS = 1,
175 IOPRIO_WHO_PGRP,
176 IOPRIO_WHO_USER,
177 };
178
179 enum {
180 IOPRIO_CLASS_NONE,
181 IOPRIO_CLASS_RT,
182 IOPRIO_CLASS_BE,
183 IOPRIO_CLASS_IDLE,
184 };
185
186 enum action_code {
187 ACTION_NONE,
188 ACTION_START,
189 ACTION_STOP,
190 ACTION_STATUS,
191 };
192
193 enum match_code {
194 MATCH_NONE = 0,
195 MATCH_PID = 1 << 0,
196 MATCH_PPID = 1 << 1,
197 MATCH_PIDFILE = 1 << 2,
198 MATCH_EXEC = 1 << 3,
199 MATCH_NAME = 1 << 4,
200 MATCH_USER = 1 << 5,
201 };
202
203 /* Time conversion constants. */
204 enum {
205 NANOSEC_IN_SEC = 1000000000L,
206 NANOSEC_IN_MILLISEC = 1000000L,
207 NANOSEC_IN_MICROSEC = 1000L,
208 };
209
210 /* The minimum polling interval, 20ms. */
211 static const long MIN_POLL_INTERVAL = 20L * NANOSEC_IN_MILLISEC;
212
213 static enum action_code action;
214 static enum match_code match_mode;
215 static bool testmode = false;
216 static int quietmode = 0;
217 static int exitnodo = 1;
218 static bool background = false;
219 static bool close_io = true;
220 static const char *output_io;
221 static bool notify_await = false;
222 static int notify_timeout = 60;
223 static char *notify_sockdir;
224 static char *notify_socket;
225 static bool mpidfile = false;
226 static bool rpidfile = false;
227 static int signal_nr = SIGTERM;
228 static int user_id = -1;
229 static int runas_uid = -1;
230 static int runas_gid = -1;
231 static const char *userspec = NULL;
232 static char *changeuser = NULL;
233 static const char *changegroup = NULL;
234 static char *changeroot = NULL;
235 static const char *changedir = "/";
236 static const char *cmdname = NULL;
237 static char *execname = NULL;
238 static char *startas = NULL;
239 static pid_t match_pid = -1;
240 static pid_t match_ppid = -1;
241 static const char *pidfile = NULL;
242 static char *what_stop = NULL;
243 static const char *progname = "";
244 static int nicelevel = 0;
245 static int umask_value = -1;
246
247 static struct stat exec_stat;
248 #if defined(OS_Hurd)
249 static struct proc_stat_list *procset = NULL;
250 #endif
251
252 /* LSB Init Script process status exit codes. */
253 enum status_code {
254 STATUS_OK = 0,
255 STATUS_DEAD_PIDFILE = 1,
256 STATUS_DEAD_LOCKFILE = 2,
257 STATUS_DEAD = 3,
258 STATUS_UNKNOWN = 4,
259 };
260
261 struct pid_list {
262 struct pid_list *next;
263 pid_t pid;
264 };
265
266 static struct pid_list *found = NULL;
267 static struct pid_list *killed = NULL;
268
269 /* Resource scheduling policy. */
270 struct res_schedule {
271 const char *policy_name;
272 int policy;
273 int priority;
274 };
275
276 struct schedule_item {
277 enum {
278 sched_timeout,
279 sched_signal,
280 sched_goto,
281 /* Only seen within parse_schedule and callees. */
282 sched_forever,
283 } type;
284 /* Seconds, signal no., or index into array. */
285 int value;
286 };
287
288 static struct res_schedule *proc_sched = NULL;
289 static struct res_schedule *io_sched = NULL;
290
291 static int schedule_length;
292 static struct schedule_item *schedule = NULL;
293
294
295 static void LIBCOMPAT_ATTR_PRINTF(1)
296 debug(const char *format, ...)
297 {
298 va_list arglist;
299
300 if (quietmode >= 0)
301 return;
302
303 va_start(arglist, format);
304 vprintf(format, arglist);
305 va_end(arglist);
306 }
307
308 static void LIBCOMPAT_ATTR_PRINTF(1)
309 info(const char *format, ...)
310 {
311 va_list arglist;
312
313 if (quietmode > 0)
314 return;
315
316 va_start(arglist, format);
317 vprintf(format, arglist);
318 va_end(arglist);
319 }
320
321 static void LIBCOMPAT_ATTR_PRINTF(1)
322 warning(const char *format, ...)
323 {
324 va_list arglist;
325
326 fprintf(stderr, "%s: warning: ", progname);
327 va_start(arglist, format);
328 vfprintf(stderr, format, arglist);
329 va_end(arglist);
330 }
331
332 static void LIBCOMPAT_ATTR_NORET LIBCOMPAT_ATTR_VPRINTF(2)
333 fatalv(int errno_fatal, const char *format, va_list args)
334 {
335 va_list args_copy;
336
337 fprintf(stderr, "%s: ", progname);
338 va_copy(args_copy, args);
339 vfprintf(stderr, format, args_copy);
340 va_end(args_copy);
341 if (errno_fatal)
342 fprintf(stderr, " (%s)\n", strerror(errno_fatal));
343 else
344 fprintf(stderr, "\n");
345
346 if (action == ACTION_STATUS)
347 exit(STATUS_UNKNOWN);
348 else
349 exit(2);
350 }
351
352 static void LIBCOMPAT_ATTR_NORET LIBCOMPAT_ATTR_PRINTF(1)
353 fatal(const char *format, ...)
354 {
355 va_list args;
356
357 va_start(args, format);
358 fatalv(0, format, args);
359 }
360
361 static void LIBCOMPAT_ATTR_NORET LIBCOMPAT_ATTR_PRINTF(1)
362 fatale(const char *format, ...)
363 {
364 va_list args;
365
366 va_start(args, format);
367 fatalv(errno, format, args);
368 }
369
370 #define BUG(...) bug(__FILE__, __LINE__, __func__, __VA_ARGS__)
371
372 static void LIBCOMPAT_ATTR_NORET LIBCOMPAT_ATTR_PRINTF(4)
373 bug(const char *file, int line, const char *func, const char *format, ...)
374 {
375 va_list arglist;
376
377 fprintf(stderr, "%s:%s:%d:%s: internal error: ",
378 progname, file, line, func);
379 va_start(arglist, format);
380 vfprintf(stderr, format, arglist);
381 va_end(arglist);
382
383 if (action == ACTION_STATUS)
384 exit(STATUS_UNKNOWN);
385 else
386 exit(3);
387 }
388
389 static void *
390 xmalloc(int size)
391 {
392 void *ptr;
393
394 ptr = malloc(size);
395 if (ptr)
396 return ptr;
397 fatale("malloc(%d) failed", size);
398 }
399
400 static char *
401 xstrndup(const char *str, size_t n)
402 {
403 char *new_str;
404
405 new_str = strndup(str, n);
406 if (new_str)
407 return new_str;
408 fatale("strndup(%s, %zu) failed", str, n);
409 }
410
411 static void
412 timespec_gettime(struct timespec *ts)
413 {
414 #if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0 && \
415 defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK > 0
416 if (clock_gettime(CLOCK_MONOTONIC, ts) < 0)
417 fatale("clock_gettime failed");
418 #else
419 struct timeval tv;
420
421 if (gettimeofday(&tv, NULL) != 0)
422 fatale("gettimeofday failed");
423
424 ts->tv_sec = tv.tv_sec;
425 ts->tv_nsec = tv.tv_usec * NANOSEC_IN_MICROSEC;
426 #endif
427 }
428
429 #define timespec_cmp(a, b, OP) \
430 (((a)->tv_sec == (b)->tv_sec) ? \
431 ((a)->tv_nsec OP (b)->tv_nsec) : \
432 ((a)->tv_sec OP (b)->tv_sec))
433
434 static void
435 timespec_sub(struct timespec *a, struct timespec *b, struct timespec *res)
436 {
437 res->tv_sec = a->tv_sec - b->tv_sec;
438 res->tv_nsec = a->tv_nsec - b->tv_nsec;
439 if (res->tv_nsec < 0) {
440 res->tv_sec--;
441 res->tv_nsec += NANOSEC_IN_SEC;
442 }
443 }
444
445 static void
446 timespec_mul(struct timespec *a, int b)
447 {
448 long nsec = a->tv_nsec * b;
449
450 a->tv_sec *= b;
451 a->tv_sec += nsec / NANOSEC_IN_SEC;
452 a->tv_nsec = nsec % NANOSEC_IN_SEC;
453 }
454
455 static char *
456 newpath(const char *dirname, const char *filename)
457 {
458 char *path;
459 size_t path_len;
460
461 path_len = strlen(dirname) + 1 + strlen(filename) + 1;
462 path = xmalloc(path_len);
463 snprintf(path, path_len, "%s/%s", dirname, filename);
464
465 return path;
466 }
467
468 static int
469 parse_unsigned(const char *string, int base, int *value_r)
470 {
471 long value;
472 char *endptr;
473
474 errno = 0;
475 if (!string[0])
476 return -1;
477
478 value = strtol(string, &endptr, base);
479 if (string == endptr || *endptr != '\0' || errno != 0)
480 return -1;
481 if (value < 0 || value > INT_MAX)
482 return -1;
483
484 *value_r = value;
485 return 0;
486 }
487
488 static long
489 get_open_fd_max(void)
490 {
491 #ifdef HAVE_GETDTABLESIZE
492 return getdtablesize();
493 #else
494 return sysconf(_SC_OPEN_MAX);
495 #endif
496 }
497
498 #ifndef HAVE_SETSID
499 static void
500 detach_controlling_tty(void)
501 {
502 #ifdef HAVE_TIOCNOTTY
503 int tty_fd;
504
505 tty_fd = open("/dev/tty", O_RDWR);
506
507 /* The current process does not have a controlling tty. */
508 if (tty_fd < 0)
509 return;
510
511 if (ioctl(tty_fd, TIOCNOTTY, 0) != 0)
512 fatale("unable to detach controlling tty");
513
514 close(tty_fd);
515 #endif
516 }
517
518 static pid_t
519 setsid(void)
520 {
521 if (setpgid(0, 0) < 0)
522 return -1:
523
524 detach_controlling_tty();
525
526 return 0;
527 }
528 #endif
529
530 static void
531 wait_for_child(pid_t pid)
532 {
533 pid_t child;
534 int status;
535
536 do {
537 child = waitpid(pid, &status, 0);
538 } while (child == -1 && errno == EINTR);
539
540 if (child != pid)
541 fatal("error waiting for child");
542
543 if (WIFEXITED(status)) {
544 int ret = WEXITSTATUS(status);
545
546 if (ret != 0)
547 fatal("child returned error exit status %d", ret);
548 } else if (WIFSIGNALED(status)) {
549 int signo = WTERMSIG(status);
550
551 fatal("child was killed by signal %d", signo);
552 } else {
553 fatal("unexpected status %d waiting for child", status);
554 }
555 }
556
557 static void
558 cleanup_socket_dir(void)
559 {
560 (void)unlink(notify_socket);
561 (void)rmdir(notify_sockdir);
562 }
563
564 static char *
565 setup_socket_name(const char *suffix)
566 {
567 const char *basedir;
568
569 if (getuid() == 0 && access(RUNSTATEDIR, F_OK) == 0) {
570 basedir = RUNSTATEDIR;
571 } else {
572 basedir = getenv("TMPDIR");
573 if (basedir == NULL)
574 basedir = P_tmpdir;
575 }
576
577 if (asprintf(¬ify_sockdir, "%s/%s.XXXXXX", basedir, suffix) < 0)
578 fatale("cannot allocate socket directory name");
579
580 if (mkdtemp(notify_sockdir) == NULL)
581 fatale("cannot create socket directory %s", notify_sockdir);
582
583 atexit(cleanup_socket_dir);
584
585 if (chown(notify_sockdir, runas_uid, runas_gid))
586 fatale("cannot change socket directory ownership");
587
588 if (asprintf(¬ify_socket, "%s/notify", notify_sockdir) < 0)
589 fatale("cannot allocate socket name");
590
591 setenv("NOTIFY_SOCKET", notify_socket, 1);
592
593 return notify_socket;
594 }
595
596 static void
597 set_socket_passcred(int fd)
598 {
599 #ifdef SO_PASSCRED
600 static const int enable = 1;
601
602 (void)setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable));
603 #endif
604 }
605
606 static int
607 create_notify_socket(void)
608 {
609 const char *sockname;
610 struct sockaddr_un su;
611 int fd, rc, flags;
612
613 /* Create notification socket. */
614 fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0);
615 if (fd < 0)
616 fatale("cannot create notification socket");
617
618 /* We could set SOCK_CLOEXEC instead, but then we would need to
619 * check whether the socket call failed, try and then do this anyway,
620 * when we have no threading problems to worry about. */
621 flags = fcntl(fd, F_GETFD);
622 if (flags < 0)
623 fatale("cannot read fd flags for notification socket");
624 if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0)
625 fatale("cannot set close-on-exec flag for notification socket");
626
627 sockname = setup_socket_name(".s-s-d-notify");
628
629 /* Bind to a socket in a temporary directory, selected based on
630 * the platform. */
631 memset(&su, 0, sizeof(su));
632 su.sun_family = AF_UNIX;
633 strncpy(su.sun_path, sockname, sizeof(su.sun_path) - 1);
634
635 rc = bind(fd, (struct sockaddr *)&su, sizeof(su));
636 if (rc < 0)
637 fatale("cannot bind to notification socket");
638
639 rc = chmod(su.sun_path, 0660);
640 if (rc < 0)
641 fatale("cannot change notification socket permissions");
642
643 rc = chown(su.sun_path, runas_uid, runas_gid);
644 if (rc < 0)
645 fatale("cannot change notification socket ownership");
646
647 /* XXX: Verify we are talking to an expected child? Although it is not
648 * clear whether this is feasible given the knowledge we have got. */
649 set_socket_passcred(fd);
650
651 return fd;
652 }
653
654 static void
655 wait_for_notify(int fd)
656 {
657 struct timespec startat, now, elapsed, timeout, timeout_orig;
658 fd_set fdrs;
659 int rc;
660
661 timeout.tv_sec = notify_timeout;
662 timeout.tv_nsec = 0;
663 timeout_orig = timeout;
664
665 timespec_gettime(&startat);
666
667 while (timeout.tv_sec >= 0 && timeout.tv_nsec >= 0) {
668 FD_ZERO(&fdrs);
669 FD_SET(fd, &fdrs);
670
671 /* Wait for input. */
672 debug("Waiting for notifications... (timeout %lusec %lunsec)\n",
673 timeout.tv_sec, timeout.tv_nsec);
674 rc = pselect(fd + 1, &fdrs, NULL, NULL, &timeout, NULL);
675
676 /* Catch non-restartable errors, that is, not signals nor
677 * kernel out of resources. */
678 if (rc < 0 && (errno != EINTR && errno != EAGAIN))
679 fatale("cannot monitor notification socket for activity");
680
681 /* Timed-out. */
682 if (rc == 0)
683 fatal("timed out waiting for a notification");
684
685 /* Update the timeout, as should not rely on pselect() having
686 * done that for us, which is an unportable assumption. */
687 timespec_gettime(&now);
688 timespec_sub(&now, &startat, &elapsed);
689 timespec_sub(&timeout_orig, &elapsed, &timeout);
690
691 /* Restartable error, a signal or kernel out of resources. */
692 if (rc < 0)
693 continue;
694
695 /* Parse it and check for a supported notification message,
696 * once we get a READY=1, we exit. */
697 for (;;) {
698 ssize_t nrecv;
699 char buf[4096];
700 char *line, *line_next;
701
702 nrecv = recv(fd, buf, sizeof(buf), 0);
703 if (nrecv < 0 && (errno != EINTR && errno != EAGAIN))
704 fatale("cannot receive notification packet");
705 if (nrecv < 0)
706 break;
707
708 buf[nrecv] = '\0';
709
710 for (line = buf; *line; line = line_next) {
711 line_next = strchrnul(line, '\n');
712 if (*line_next == '\n')
713 *line_next++ = '\0';
714
715 debug("Child sent some notification...\n");
716 if (strncmp(line, "EXTEND_TIMEOUT_USEC=", 20) == 0) {
717 int extend_usec = 0;
718
719 if (parse_unsigned(line + 20, 10, &extend_usec) != 0)
720 fatale("cannot parse extended timeout notification %s", line);
721
722 /* Reset the current timeout. */
723 timeout.tv_sec = extend_usec / 1000L;
724 timeout.tv_nsec = (extend_usec % 1000L) *
725 NANOSEC_IN_MILLISEC;
726 timeout_orig = timeout;
727
728 timespec_gettime(&startat);
729 } else if (strncmp(line, "ERRNO=", 6) == 0) {
730 int suberrno = 0;
731
732 if (parse_unsigned(line + 6, 10, &suberrno) != 0)
733 fatale("cannot parse errno notification %s", line);
734 errno = suberrno;
735 fatale("program failed to initialize");
736 } else if (strcmp(line, "READY=1") == 0) {
737 debug("-> Notification => ready for service.\n");
738 return;
739 } else {
740 debug("-> Notification line '%s' received\n", line);
741 }
742 }
743 }
744 }
745 }
746
747 static void
748 write_pidfile(const char *filename, pid_t pid)
749 {
750 FILE *fp;
751 int fd;
752
753 fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, 0666);
754 if (fd < 0)
755 fp = NULL;
756 else
757 fp = fdopen(fd, "w");
758
759 if (fp == NULL)
760 fatale("unable to open pidfile '%s' for writing", filename);
761
762 fprintf(fp, "%d\n", pid);
763
764 if (fclose(fp))
765 fatale("unable to close pidfile '%s'", filename);
766 }
767
768 static void
769 remove_pidfile(const char *filename)
770 {
771 if (unlink(filename) < 0 && errno != ENOENT)
772 fatale("cannot remove pidfile '%s'", filename);
773 }
774
775 static void
776 daemonize(void)
777 {
778 int notify_fd = -1;
779 pid_t pid;
780 sigset_t mask;
781 sigset_t oldmask;
782
783 debug("Detaching to start %s...\n", startas);
784
785 /* Block SIGCHLD to allow waiting for the child process while it is
786 * performing actions, such as creating a pidfile. */
787 sigemptyset(&mask);
788 sigaddset(&mask, SIGCHLD);
789 if (sigprocmask(SIG_BLOCK, &mask, &oldmask) == -1)
790 fatale("cannot block SIGCHLD");
791
792 if (notify_await)
793 notify_fd = create_notify_socket();
794
795 pid = fork();
796 if (pid < 0)
797 fatale("unable to do first fork");
798 else if (pid) { /* First Parent. */
799 /* Wait for the second parent to exit, so that if we need to
800 * perform any actions there, like creating a pidfile, we do
801 * not suffer from race conditions on return. */
802 wait_for_child(pid);
803
804 if (notify_await) {
805 /* Wait for a readiness notification from the second
806 * child, so that we can safely exit when the service
807 * is up. */
808 wait_for_notify(notify_fd);
809 close(notify_fd);
810 cleanup_socket_dir();
811 }
812
813 _exit(0);
814 }
815
816 /* Close the notification socket, even though it is close-on-exec. */
817 if (notify_await)
818 close(notify_fd);
819
820 /* Create a new session. */
821 if (setsid() < 0)
822 fatale("cannot set session ID");
823
824 pid = fork();
825 if (pid < 0)
826 fatale("unable to do second fork");
827 else if (pid) { /* Second parent. */
828 /* Set a default umask for dumb programs, which might get
829 * overridden by the --umask option later on, so that we get
830 * a defined umask when creating the pidfile. */
831 umask(022);
832
833 if (mpidfile && pidfile != NULL)
834 /* User wants _us_ to make the pidfile. */
835 write_pidfile(pidfile, pid);
836
837 _exit(0);
838 }
839
840 if (sigprocmask(SIG_SETMASK, &oldmask, NULL) == -1)
841 fatale("cannot restore signal mask");
842
843 debug("Detaching complete...\n");
844 }
845
846 static void
847 pid_list_push(struct pid_list **list, pid_t pid)
848 {
849 struct pid_list *p;
850
851 p = xmalloc(sizeof(*p));
852 p->next = *list;
853 p->pid = pid;
854 *list = p;
855 }
856
857 static void
858 pid_list_free(struct pid_list **list)
859 {
860 struct pid_list *here, *next;
861
862 for (here = *list; here != NULL; here = next) {
863 next = here->next;
864 free(here);
865 }
866
867 *list = NULL;
868 }
869
870 static void
871 usage(void)
872 {
873 printf(
874 "Usage: start-stop-daemon [<option>...] <command>\n"
875 "\n");
876
877 printf(
878 "Commands:\n"
879 " -S, --start -- <argument>... start a program and pass <arguments> to it\n"
880 " -K, --stop stop a program\n"
881 " -T, --status get the program status\n"
882 " -H, --help print help information\n"
883 " -V, --version print version\n"
884 "\n");
885
886 printf(
887 "Matching options (at least one is required):\n"
888 " --pid <pid> pid to check\n"
889 " --ppid <ppid> parent pid to check\n"
890 " -p, --pidfile <pid-file> pid file to check\n"
891 " -x, --exec <executable> program to start/check if it is running\n"
892 " -n, --name <process-name> process name to check\n"
893 " -u, --user <username|uid> process owner to check\n"
894 "\n");
895
896 printf(
897 "Options:\n"
898 " -g, --group <group|gid> run process as this group\n"
899 " -c, --chuid <name|uid[:group|gid]>\n"
900 " change to this user/group before starting\n"
901 " process\n"
902 " -s, --signal <signal> signal to send (default TERM)\n"
903 " -a, --startas <pathname> program to start (default is <executable>)\n"
904 " -r, --chroot <directory> chroot to <directory> before starting\n"
905 " -d, --chdir <directory> change to <directory> (default is /)\n"
906 " -N, --nicelevel <incr> add incr to the process' nice level\n"
907 " -P, --procsched <policy[:prio]>\n"
908 " use <policy> with <prio> for the kernel\n"
909 " process scheduler (default prio is 0)\n"
910 " -I, --iosched <class[:prio]> use <class> with <prio> to set the IO\n"
911 " scheduler (default prio is 4)\n"
912 " -k, --umask <mask> change the umask to <mask> before starting\n"
913 " -b, --background force the process to detach\n"
914 " --notify-await wait for a readiness notification\n"
915 " --notify-timeout <int> timeout after <int> seconds of notify wait\n"
916 " -C, --no-close do not close any file descriptor\n"
917 " -O, --output <filename> send stdout and stderr to <filename>\n"
918 " -m, --make-pidfile create the pidfile before starting\n"
919 " --remove-pidfile delete the pidfile after stopping\n"
920 " -R, --retry <schedule> check whether processes die, and retry\n"
921 " -t, --test test mode, don't do anything\n"
922 " -o, --oknodo exit status 0 (not 1) if nothing done\n"
923 " -q, --quiet be more quiet\n"
924 " -v, --verbose be more verbose\n"
925 "\n");
926
927 printf(
928 "Retry <schedule> is <item>|/<item>/... where <item> is one of\n"
929 " -<signal-num>|[-]<signal-name> send that signal\n"
930 " <timeout> wait that many seconds\n"
931 " forever repeat remainder forever\n"
932 "or <schedule> may be just <timeout>, meaning <signal>/<timeout>/KILL/<timeout>\n"
933 "\n");
934
935 printf(
936 "The process scheduler <policy> can be one of:\n"
937 " other, fifo or rr\n"
938 "\n");
939
940 printf(
941 "The IO scheduler <class> can be one of:\n"
942 " real-time, best-effort or idle\n"
943 "\n");
944
945 printf(
946 "Exit status:\n"
947 " 0 = done\n"
948 " 1 = nothing done (=> 0 if --oknodo)\n"
949 " 2 = with --retry, processes would not die\n"
950 " 3 = trouble\n"
951 "Exit status with --status:\n"
952 " 0 = program is running\n"
953 " 1 = program is not running and the pid file exists\n"
954 " 3 = program is not running\n"
955 " 4 = unable to determine status\n");
956 }
957
958 static void
959 do_version(void)
960 {
961 printf("start-stop-daemon %s for Debian\n\n", VERSION);
962
963 printf("Written by Marek Michalkiewicz, public domain.\n");
964 }
965
966 static void LIBCOMPAT_ATTR_NORET
967 badusage(const char *msg)
968 {
969 if (msg)
970 fprintf(stderr, "%s: %s\n", progname, msg);
971 fprintf(stderr, "Try '%s --help' for more information.\n", progname);
972
973 if (action == ACTION_STATUS)
974 exit(STATUS_UNKNOWN);
975 else
976 exit(3);
977 }
978
979 struct sigpair {
980 const char *name;
981 int signal;
982 };
983
984 static const struct sigpair siglist[] = {
985 { "ABRT", SIGABRT },
986 { "ALRM", SIGALRM },
987 { "FPE", SIGFPE },
988 { "HUP", SIGHUP },
989 { "ILL", SIGILL },
990 { "INT", SIGINT },
991 { "KILL", SIGKILL },
992 { "PIPE", SIGPIPE },
993 { "QUIT", SIGQUIT },
994 { "SEGV", SIGSEGV },
995 { "TERM", SIGTERM },
996 { "USR1", SIGUSR1 },
997 { "USR2", SIGUSR2 },
998 { "CHLD", SIGCHLD },
999 { "CONT", SIGCONT },
1000 { "STOP", SIGSTOP },
1001 { "TSTP", SIGTSTP },
1002 { "TTIN", SIGTTIN },
1003 { "TTOU", SIGTTOU }
1004 };
1005
1006 static int
1007 parse_pid(const char *pid_str, int *pid_num)
1008 {
1009 if (parse_unsigned(pid_str, 10, pid_num) != 0)
1010 return -1;
1011 if (*pid_num == 0)
1012 return -1;
1013
1014 return 0;
1015 }
1016
1017 static int
1018 parse_signal(const char *sig_str, int *sig_num)
1019 {
1020 unsigned int i;
1021
1022 if (parse_unsigned(sig_str, 10, sig_num) == 0)
1023 return 0;
1024
1025 for (i = 0; i < array_count(siglist); i++) {
1026 if (strcmp(sig_str, siglist[i].name) == 0) {
1027 *sig_num = siglist[i].signal;
1028 return 0;
1029 }
1030 }
1031 return -1;
1032 }
1033
1034 static int
1035 parse_umask(const char *string, int *value_r)
1036 {
1037 return parse_unsigned(string, 0, value_r);
1038 }
1039
1040 static void
1041 validate_proc_schedule(void)
1042 {
1043 #if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
1044 int prio_min, prio_max;
1045
1046 prio_min = sched_get_priority_min(proc_sched->policy);
1047 prio_max = sched_get_priority_max(proc_sched->policy);
1048
1049 if (proc_sched->priority < prio_min)
1050 badusage("process scheduler priority less than min");
1051 if (proc_sched->priority > prio_max)
1052 badusage("process scheduler priority greater than max");
1053 #endif
1054 }
1055
1056 static void
1057 parse_proc_schedule(const char *string)
1058 {
1059 char *policy_str;
1060 size_t policy_len;
1061 int prio = 0;
1062
1063 policy_len = strcspn(string, ":");
1064 policy_str = xstrndup(string, policy_len);
1065
1066 if (string[policy_len] == ':' &&
1067 parse_unsigned(string + policy_len + 1, 10, &prio) != 0)
1068 fatale("invalid process scheduler priority");
1069
1070 proc_sched = xmalloc(sizeof(*proc_sched));
1071 proc_sched->policy_name = policy_str;
1072
1073 if (strcmp(policy_str, "other") == 0) {
1074 proc_sched->policy = SCHED_OTHER;
1075 proc_sched->priority = 0;
1076 } else if (strcmp(policy_str, "fifo") == 0) {
1077 proc_sched->policy = SCHED_FIFO;
1078 proc_sched->priority = prio;
1079 } else if (strcmp(policy_str, "rr") == 0) {
1080 proc_sched->policy = SCHED_RR;
1081 proc_sched->priority = prio;
1082 } else
1083 badusage("invalid process scheduler policy");
1084
1085 validate_proc_schedule();
1086 }
1087
1088 static void
1089 parse_io_schedule(const char *string)
1090 {
1091 char *class_str;
1092 size_t class_len;
1093 int prio = 4;
1094
1095 class_len = strcspn(string, ":");
1096 class_str = xstrndup(string, class_len);
1097
1098 if (string[class_len] == ':' &&
1099 parse_unsigned(string + class_len + 1, 10, &prio) != 0)
1100 fatale("invalid IO scheduler priority");
1101
1102 io_sched = xmalloc(sizeof(*io_sched));
1103 io_sched->policy_name = class_str;
1104
1105 if (strcmp(class_str, "real-time") == 0) {
1106 io_sched->policy = IOPRIO_CLASS_RT;
1107 io_sched->priority = prio;
1108 } else if (strcmp(class_str, "best-effort") == 0) {
1109 io_sched->policy = IOPRIO_CLASS_BE;
1110 io_sched->priority = prio;
1111 } else if (strcmp(class_str, "idle") == 0) {
1112 io_sched->policy = IOPRIO_CLASS_IDLE;
1113 io_sched->priority = 7;
1114 } else
1115 badusage("invalid IO scheduler policy");
1116
1117 if (io_sched->priority < IO_SCHED_PRIO_MIN)
1118 badusage("IO scheduler priority less than min");
1119 if (io_sched->priority > IO_SCHED_PRIO_MAX)
1120 badusage("IO scheduler priority greater than max");
1121 }
1122
1123 static void
1124 set_proc_schedule(struct res_schedule *sched)
1125 {
1126 #if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
1127 struct sched_param param;
1128
1129 param.sched_priority = sched->priority;
1130
1131 if (sched_setscheduler(getpid(), sched->policy, ¶m) == -1)
1132 fatale("unable to set process scheduler");
1133 #endif
1134 }
1135
1136 #ifdef HAVE_IOPRIO_SET
1137 static inline int
1138 ioprio_set(int which, int who, int ioprio)
1139 {
1140 return syscall(SYS_ioprio_set, which, who, ioprio);
1141 }
1142 #endif
1143
1144 static void
1145 set_io_schedule(struct res_schedule *sched)
1146 {
1147 #ifdef HAVE_IOPRIO_SET
1148 int io_sched_mask;
1149
1150 io_sched_mask = IOPRIO_PRIO_VALUE(sched->policy, sched->priority);
1151 if (ioprio_set(IOPRIO_WHO_PROCESS, getpid(), io_sched_mask) == -1)
1152 warning("unable to alter IO priority to mask %i (%s)\n",
1153 io_sched_mask, strerror(errno));
1154 #endif
1155 }
1156
1157 static void
1158 parse_schedule_item(const char *string, struct schedule_item *item)
1159 {
1160 const char *after_hyph;
1161
1162 if (strcmp(string, "forever") == 0) {
1163 item->type = sched_forever;
1164 } else if (isdigit(string[0])) {
1165 item->type = sched_timeout;
1166 if (parse_unsigned(string, 10, &item->value) != 0)
1167 badusage("invalid timeout value in schedule");
1168 } else if ((after_hyph = string + (string[0] == '-')) &&
1169 parse_signal(after_hyph, &item->value) == 0) {
1170 item->type = sched_signal;
1171 } else {
1172 badusage("invalid schedule item (must be [-]<signal-name>, "
1173 "-<signal-number>, <timeout> or 'forever'");
1174 }
1175 }
1176
1177 static void
1178 parse_schedule(const char *schedule_str)
1179 {
1180 char item_buf[20];
1181 const char *slash;
1182 int count, repeatat;
1183 size_t str_len;
1184
1185 count = 0;
1186 for (slash = schedule_str; *slash; slash++)
1187 if (*slash == '/')
1188 count++;
1189
1190 schedule_length = (count == 0) ? 4 : count + 1;
1191 schedule = xmalloc(sizeof(*schedule) * schedule_length);
1192
1193 if (count == 0) {
1194 schedule[0].type = sched_signal;
1195 schedule[0].value = signal_nr;
1196 parse_schedule_item(schedule_str, &schedule[1]);
1197 if (schedule[1].type != sched_timeout) {
1198 badusage("--retry takes timeout, or schedule list"
1199 " of at least two items");
1200 }
1201 schedule[2].type = sched_signal;
1202 schedule[2].value = SIGKILL;
1203 schedule[3] = schedule[1];
1204 } else {
1205 count = 0;
1206 repeatat = -1;
1207 while (*schedule_str) {
1208 slash = strchrnul(schedule_str, '/');
1209 str_len = (size_t)(slash - schedule_str);
1210 if (str_len >= sizeof(item_buf))
1211 badusage("invalid schedule item: far too long"
1212 " (you must delimit items with slashes)");
1213 memcpy(item_buf, schedule_str, str_len);
1214 item_buf[str_len] = '\0';
1215 schedule_str = *slash ? slash + 1 : slash;
1216
1217 parse_schedule_item(item_buf, &schedule[count]);
1218 if (schedule[count].type == sched_forever) {
1219 if (repeatat >= 0)
1220 badusage("invalid schedule: 'forever'"
1221 " appears more than once");
1222 repeatat = count;
1223 continue;
1224 }
1225 count++;
1226 }
1227 if (repeatat == count)
1228 badusage("invalid schedule: 'forever' appears last, "
1229 "nothing to repeat");
1230 if (repeatat >= 0) {
1231 schedule[count].type = sched_goto;
1232 schedule[count].value = repeatat;
1233 count++;
1234 }
1235 if (count != schedule_length)
1236 BUG("count=%d != schedule_length=%d",
1237 count, schedule_length);
1238 }
1239 }
1240
1241 static void
1242 set_action(enum action_code new_action)
1243 {
1244 if (action == new_action)
1245 return;
1246
1247 if (action != ACTION_NONE)
1248 badusage("only one command can be specified");
1249
1250 action = new_action;
1251 }
1252
1253 #define OPT_PID 500
1254 #define OPT_PPID 501
1255 #define OPT_RM_PIDFILE 502
1256 #define OPT_NOTIFY_AWAIT 503
1257 #define OPT_NOTIFY_TIMEOUT 504
1258
1259 static void
1260 parse_options(int argc, char * const *argv)
1261 {
1262 static struct option longopts[] = {
1263 { "help", 0, NULL, 'H'},
1264 { "stop", 0, NULL, 'K'},
1265 { "start", 0, NULL, 'S'},
1266 { "status", 0, NULL, 'T'},
1267 { "version", 0, NULL, 'V'},
1268 { "startas", 1, NULL, 'a'},
1269 { "name", 1, NULL, 'n'},
1270 { "oknodo", 0, NULL, 'o'},
1271 { "pid", 1, NULL, OPT_PID},
1272 { "ppid", 1, NULL, OPT_PPID},
1273 { "pidfile", 1, NULL, 'p'},
1274 { "quiet", 0, NULL, 'q'},
1275 { "signal", 1, NULL, 's'},
1276 { "test", 0, NULL, 't'},
1277 { "user", 1, NULL, 'u'},
1278 { "group", 1, NULL, 'g'},
1279 { "chroot", 1, NULL, 'r'},
1280 { "verbose", 0, NULL, 'v'},
1281 { "exec", 1, NULL, 'x'},
1282 { "chuid", 1, NULL, 'c'},
1283 { "nicelevel", 1, NULL, 'N'},
1284 { "procsched", 1, NULL, 'P'},
1285 { "iosched", 1, NULL, 'I'},
1286 { "umask", 1, NULL, 'k'},
1287 { "background", 0, NULL, 'b'},
1288 { "notify-await", 0, NULL, OPT_NOTIFY_AWAIT},
1289 { "notify-timeout", 1, NULL, OPT_NOTIFY_TIMEOUT},
1290 { "no-close", 0, NULL, 'C'},
1291 { "output", 1, NULL, 'O'},
1292 { "make-pidfile", 0, NULL, 'm'},
1293 { "remove-pidfile", 0, NULL, OPT_RM_PIDFILE},
1294 { "retry", 1, NULL, 'R'},
1295 { "chdir", 1, NULL, 'd'},
1296 { NULL, 0, NULL, 0 }
1297 };
1298 const char *pid_str = NULL;
1299 const char *ppid_str = NULL;
1300 const char *umask_str = NULL;
1301 const char *signal_str = NULL;
1302 const char *schedule_str = NULL;
1303 const char *proc_schedule_str = NULL;
1304 const char *io_schedule_str = NULL;
1305 const char *notify_timeout_str = NULL;
1306 size_t changeuser_len;
1307 int c;
1308
1309 for (;;) {
1310 c = getopt_long(argc, argv,
1311 "HKSVTa:n:op:qr:s:tu:vx:c:N:P:I:k:bCO:mR:g:d:",
1312 longopts, NULL);
1313 if (c == -1)
1314 break;
1315 switch (c) {
1316 case 'H': /* --help */
1317 usage();
1318 exit(0);
1319 case 'K': /* --stop */
1320 set_action(ACTION_STOP);
1321 break;
1322 case 'S': /* --start */
1323 set_action(ACTION_START);
1324 break;
1325 case 'T': /* --status */
1326 set_action(ACTION_STATUS);
1327 break;
1328 case 'V': /* --version */
1329 do_version();
1330 exit(0);
1331 case 'a': /* --startas <pathname> */
1332 startas = optarg;
1333 break;
1334 case 'n': /* --name <process-name> */
1335 match_mode |= MATCH_NAME;
1336 cmdname = optarg;
1337 break;
1338 case 'o': /* --oknodo */
1339 exitnodo = 0;
1340 break;
1341 case OPT_PID: /* --pid <pid> */
1342 match_mode |= MATCH_PID;
1343 pid_str = optarg;
1344 break;
1345 case OPT_PPID: /* --ppid <ppid> */
1346 match_mode |= MATCH_PPID;
1347 ppid_str = optarg;
1348 break;
1349 case 'p': /* --pidfile <pid-file> */
1350 match_mode |= MATCH_PIDFILE;
1351 pidfile = optarg;
1352 break;
1353 case 'q': /* --quiet */
1354 quietmode = true;
1355 break;
1356 case 's': /* --signal <signal> */
1357 signal_str = optarg;
1358 break;
1359 case 't': /* --test */
1360 testmode = true;
1361 break;
1362 case 'u': /* --user <username>|<uid> */
1363 match_mode |= MATCH_USER;
1364 userspec = optarg;
1365 break;
1366 case 'v': /* --verbose */
1367 quietmode = -1;
1368 break;
1369 case 'x': /* --exec <executable> */
1370 match_mode |= MATCH_EXEC;
1371 execname = optarg;
1372 break;
1373 case 'c': /* --chuid <username>|<uid> */
1374 free(changeuser);
1375 /* We copy the string just in case we need the
1376 * argument later. */
1377 changeuser_len = strcspn(optarg, ":");
1378 changeuser = xstrndup(optarg, changeuser_len);
1379 if (optarg[changeuser_len] == ':') {
1380 if (optarg[changeuser_len + 1] == '\0')
1381 fatal("missing group name");
1382 changegroup = optarg + changeuser_len + 1;
1383 }
1384 break;
1385 case 'g': /* --group <group>|<gid> */
1386 changegroup = optarg;
1387 break;
1388 case 'r': /* --chroot /new/root */
1389 changeroot = optarg;
1390 break;
1391 case 'N': /* --nice */
1392 nicelevel = atoi(optarg);
1393 break;
1394 case 'P': /* --procsched */
1395 proc_schedule_str = optarg;
1396 break;
1397 case 'I': /* --iosched */
1398 io_schedule_str = optarg;
1399 break;
1400 case 'k': /* --umask <mask> */
1401 umask_str = optarg;
1402 break;
1403 case 'b': /* --background */
1404 background = true;
1405 break;
1406 case OPT_NOTIFY_AWAIT:
1407 notify_await = true;
1408 break;
1409 case OPT_NOTIFY_TIMEOUT:
1410 notify_timeout_str = optarg;
1411 break;
1412 case 'C': /* --no-close */
1413 close_io = false;
1414 break;
1415 case 'O': /* --outout <filename> */
1416 output_io = optarg;
1417 break;
1418 case 'm': /* --make-pidfile */
1419 mpidfile = true;
1420 break;
1421 case OPT_RM_PIDFILE: /* --remove-pidfile */
1422 rpidfile = true;
1423 break;
1424 case 'R': /* --retry <schedule>|<timeout> */
1425 schedule_str = optarg;
1426 break;
1427 case 'd': /* --chdir /new/dir */
1428 changedir = optarg;
1429 break;
1430 default:
1431 /* Message printed by getopt. */
1432 badusage(NULL);
1433 }
1434 }
1435
1436 if (pid_str != NULL) {
1437 if (parse_pid(pid_str, &match_pid) != 0)
1438 badusage("pid value must be a number greater than 0");
1439 }
1440
1441 if (ppid_str != NULL) {
1442 if (parse_pid(ppid_str, &match_ppid) != 0)
1443 badusage("ppid value must be a number greater than 0");
1444 }
1445
1446 if (signal_str != NULL) {
1447 if (parse_signal(signal_str, &signal_nr) != 0)
1448 badusage("signal value must be numeric or name"
1449 " of signal (KILL, INT, ...)");
1450 }
1451
1452 if (schedule_str != NULL) {
1453 parse_schedule(schedule_str);
1454 }
1455
1456 if (proc_schedule_str != NULL)
1457 parse_proc_schedule(proc_schedule_str);
1458
1459 if (io_schedule_str != NULL)
1460 parse_io_schedule(io_schedule_str);
1461
1462 if (umask_str != NULL) {
1463 if (parse_umask(umask_str, &umask_value) != 0)
1464 badusage("umask value must be a positive number");
1465 }
1466
1467 if (output_io != NULL && output_io[0] != '/')
1468 badusage("--output file needs to be an absolute filename");
1469
1470 if (notify_timeout_str != NULL)
1471 if (parse_unsigned(notify_timeout_str, 10, ¬ify_timeout) != 0)
1472 badusage("invalid notify timeout value");
1473
1474 if (action == ACTION_NONE)
1475 badusage("need one of --start or --stop or --status");
1476
1477 if (match_mode == MATCH_NONE ||
1478 (!execname && !cmdname && !userspec &&
1479 !pid_str && !ppid_str && !pidfile))
1480 badusage("need at least one of --exec, --pid, --ppid, --pidfile, --user or --name");
1481
1482 #ifdef PROCESS_NAME_SIZE
1483 if (cmdname && strlen(cmdname) > PROCESS_NAME_SIZE)
1484 warning("this system is not able to track process names\n"
1485 "longer than %d characters, please use --exec "
1486 "instead of --name.\n", PROCESS_NAME_SIZE);
1487 #endif
1488
1489 if (!startas)
1490 startas = execname;
1491
1492 if (action == ACTION_START && !startas)
1493 badusage("--start needs --exec or --startas");
1494
1495 if (mpidfile && pidfile == NULL)
1496 badusage("--make-pidfile requires --pidfile");
1497 if (rpidfile && pidfile == NULL)
1498 badusage("--remove-pidfile requires --pidfile");
1499
1500 if (pid_str && pidfile)
1501 badusage("need either --pid or --pidfile, not both");
1502
1503 if (background && action != ACTION_START)
1504 badusage("--background is only relevant with --start");
1505
1506 if (!close_io && !background)
1507 badusage("--no-close is only relevant with --background");
1508 if (output_io && !background)
1509 badusage("--output is only relevant with --background");
1510
1511 if (close_io && output_io == NULL)
1512 output_io = "/dev/null";
1513 }
1514
1515 static void
1516 setup_options(void)
1517 {
1518 if (execname) {
1519 char *fullexecname;
1520
1521 /* If it's a relative path, normalize it. */
1522 if (execname[0] != '/')
1523 execname = newpath(changedir, execname);
1524
1525 if (changeroot)
1526 fullexecname = newpath(changeroot, execname);
1527 else
1528 fullexecname = execname;
1529
1530 if (stat(fullexecname, &exec_stat))
1531 fatale("unable to stat %s", fullexecname);
1532
1533 if (fullexecname != execname)
1534 free(fullexecname);
1535 }
1536
1537 if (userspec && parse_unsigned(userspec, 10, &user_id) < 0) {
1538 struct passwd *pw;
1539
1540 pw = getpwnam(userspec);
1541 if (!pw)
1542 fatale("user '%s' not found", userspec);
1543
1544 user_id = pw->pw_uid;
1545 }
1546
1547 if (changegroup && parse_unsigned(changegroup, 10, &runas_gid) < 0) {
1548 struct group *gr;
1549
1550 gr = getgrnam(changegroup);
1551 if (!gr)
1552 fatale("group '%s' not found", changegroup);
1553 changegroup = gr->gr_name;
1554 runas_gid = gr->gr_gid;
1555 }
1556 if (changeuser) {
1557 struct passwd *pw;
1558 struct stat st;
1559
1560 if (parse_unsigned(changeuser, 10, &runas_uid) == 0)
1561 pw = getpwuid(runas_uid);
1562 else
1563 pw = getpwnam(changeuser);
1564 if (!pw)
1565 fatale("user '%s' not found", changeuser);
1566 changeuser = pw->pw_name;
1567 runas_uid = pw->pw_uid;
1568 if (changegroup == NULL) {
1569 /* Pass the default group of this user. */
1570 changegroup = ""; /* Just empty. */
1571 runas_gid = pw->pw_gid;
1572 }
1573 if (stat(pw->pw_dir, &st) == 0)
1574 setenv("HOME", pw->pw_dir, 1);
1575 }
1576 }
1577
1578 #if defined(OS_Linux)
1579 static const char *
1580 proc_status_field(pid_t pid, const char *field)
1581 {
1582 static char *line = NULL;
1583 static size_t line_size = 0;
1584
1585 FILE *fp;
1586 char filename[32];
1587 char *value = NULL;
1588 ssize_t line_len;
1589 size_t field_len = strlen(field);
1590
1591 sprintf(filename, "/proc/%d/status", pid);
1592 fp = fopen(filename, "r");
1593 if (!fp)
1594 return NULL;
1595 while ((line_len = getline(&line, &line_size, fp)) >= 0) {
1596 if (strncasecmp(line, field, field_len) == 0) {
1597 line[line_len - 1] = '\0';
1598
1599 value = line + field_len;
1600 while (isspace(*value))
1601 value++;
1602
1603 break;
1604 }
1605 }
1606 fclose(fp);
1607
1608 return value;
1609 }
1610 #elif defined(OS_AIX)
1611 static bool
1612 proc_get_psinfo(pid_t pid, struct psinfo *psinfo)
1613 {
1614 char filename[64];
1615 FILE *fp;
1616
1617 sprintf(filename, "/proc/%d/psinfo", pid);
1618 fp = fopen(filename, "r");
1619 if (!fp)
1620 return false;
1621 if (fread(psinfo, sizeof(*psinfo), 1, fp) == 0) {
1622 fclose(fp);
1623 return false;
1624 }
1625 if (ferror(fp)) {
1626 fclose(fp);
1627 return false;
1628 }
1629
1630 fclose(fp);
1631
1632 return true;
1633 }
1634 #elif defined(OS_Hurd)
1635 static void
1636 init_procset(void)
1637 {
1638 struct ps_context *context;
1639 error_t err;
1640
1641 err = ps_context_create(getproc(), &context);
1642 if (err)
1643 error(1, err, "ps_context_create");
1644
1645 err = proc_stat_list_create(context, &procset);
1646 if (err)
1647 error(1, err, "proc_stat_list_create");
1648
1649 err = proc_stat_list_add_all(procset, 0, 0);
1650 if (err)
1651 error(1, err, "proc_stat_list_add_all");
1652 }
1653
1654 static struct proc_stat *
1655 get_proc_stat(pid_t pid, ps_flags_t flags)
1656 {
1657 struct proc_stat *ps;
1658 ps_flags_t wanted_flags = PSTAT_PID | flags;
1659
1660 if (!procset)
1661 init_procset();
1662
1663 ps = proc_stat_list_pid_proc_stat(procset, pid);
1664 if (!ps)
1665 return NULL;
1666 if (proc_stat_set_flags(ps, wanted_flags))
1667 return NULL;
1668 if ((proc_stat_flags(ps) & wanted_flags) != wanted_flags)
1669 return NULL;
1670
1671 return ps;
1672 }
1673 #elif defined(HAVE_KVM_H)
1674 static kvm_t *
1675 ssd_kvm_open(void)
1676 {
1677 kvm_t *kd;
1678 char errbuf[_POSIX2_LINE_MAX];
1679
1680 kd = kvm_openfiles(NULL, KVM_MEMFILE, NULL, O_RDONLY, errbuf);
1681 if (kd == NULL)
1682 errx(1, "%s", errbuf);
1683
1684 return kd;
1685 }
1686
1687 static struct kinfo_proc *
1688 ssd_kvm_get_procs(kvm_t *kd, int op, int arg, int *count)
1689 {
1690 struct kinfo_proc *kp;
1691 int lcount;
1692
1693 if (count == NULL)
1694 count = &lcount;
1695 *count = 0;
1696
1697 #if defined(OS_OpenBSD)
1698 kp = kvm_getprocs(kd, op, arg, sizeof(*kp), count);
1699 #else
1700 kp = kvm_getprocs(kd, op, arg, count);
1701 #endif
1702 if (kp == NULL && errno != ESRCH)
1703 errx(1, "%s", kvm_geterr(kd));
1704
1705 return kp;
1706 }
1707 #endif
1708
1709 #if defined(OS_Linux)
1710 static bool
1711 pid_is_exec(pid_t pid, const struct stat *esb)
1712 {
1713 char lname[32];
1714 char lcontents[_POSIX_PATH_MAX + 1];
1715 char *filename;
1716 const char deleted[] = " (deleted)";
1717 int nread;
1718 struct stat sb;
1719
1720 sprintf(lname, "/proc/%d/exe", pid);
1721 nread = readlink(lname, lcontents, sizeof(lcontents) - 1);
1722 if (nread == -1)
1723 return false;
1724
1725 filename = lcontents;
1726 filename[nread] = '\0';
1727
1728 /* OpenVZ kernels contain a bogus patch that instead of appending,
1729 * prepends the deleted marker. Workaround those. Otherwise handle
1730 * the normal appended marker. */
1731 if (strncmp(filename, deleted, strlen(deleted)) == 0)
1732 filename += strlen(deleted);
1733 else if (strcmp(filename + nread - strlen(deleted), deleted) == 0)
1734 filename[nread - strlen(deleted)] = '\0';
1735
1736 if (stat(filename, &sb) != 0)
1737 return false;
1738
1739 return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
1740 }
1741 #elif defined(OS_AIX)
1742 static bool
1743 pid_is_exec(pid_t pid, const struct stat *esb)
1744 {
1745 struct stat sb;
1746 char filename[64];
1747
1748 sprintf(filename, "/proc/%d/object/a.out", pid);
1749
1750 if (stat(filename, &sb) != 0)
1751 return false;
1752
1753 return sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino;
1754 }
1755 #elif defined(OS_Hurd)
1756 static bool
1757 pid_is_exec(pid_t pid, const struct stat *esb)
1758 {
1759 struct proc_stat *ps;
1760 struct stat sb;
1761 const char *filename;
1762
1763 ps = get_proc_stat(pid, PSTAT_ARGS);
1764 if (ps == NULL)
1765 return false;
1766
1767 /* On old Hurd systems we have to use the argv[0] value, because
1768 * there is nothing better. */
1769 filename = proc_stat_args(ps);
1770 #ifdef PSTAT_EXE
1771 /* On new Hurd systems we can use the correct value, as long
1772 * as it's not NULL nor empty, as it was the case on the first
1773 * implementation. */
1774 if (proc_stat_set_flags(ps, PSTAT_EXE) == 0 &&
1775 proc_stat_flags(ps) & PSTAT_EXE &&
1776 proc_stat_exe(ps) != NULL &&
1777 proc_stat_exe(ps)[0] != '\0')
1778 filename = proc_stat_exe(ps);
1779 #endif
1780
1781 if (stat(filename, &sb) != 0)
1782 return false;
1783
1784 return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
1785 }
1786 #elif defined(OS_Darwin)
1787 static bool
1788 pid_is_exec(pid_t pid, const struct stat *esb)
1789 {
1790 struct stat sb;
1791 char pathname[_POSIX_PATH_MAX];
1792
1793 if (proc_pidpath(pid, pathname, sizeof(pathname)) < 0)
1794 return false;
1795
1796 if (stat(pathname, &sb) != 0)
1797 return false;
1798
1799 return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
1800 }
1801 #elif defined(OS_HPUX)
1802 static bool
1803 pid_is_exec(pid_t pid, const struct stat *esb)
1804 {
1805 struct pst_status pst;
1806
1807 if (pstat_getproc(&pst, sizeof(pst), (size_t)0, (int)pid) < 0)
1808 return false;
1809 return ((dev_t)pst.pst_text.psf_fsid.psfs_id == esb->st_dev &&
1810 (ino_t)pst.pst_text.psf_fileid == esb->st_ino);
1811 }
1812 #elif defined(OS_FreeBSD)
1813 static bool
1814 pid_is_exec(pid_t pid, const struct stat *esb)
1815 {
1816 struct stat sb;
1817 int error, mib[4];
1818 size_t len;
1819 char pathname[PATH_MAX];
1820
1821 mib[0] = CTL_KERN;
1822 mib[1] = KERN_PROC;
1823 mib[2] = KERN_PROC_PATHNAME;
1824 mib[3] = pid;
1825 len = sizeof(pathname);
1826
1827 error = sysctl(mib, 4, pathname, &len, NULL, 0);
1828 if (error != 0 && errno != ESRCH)
1829 return false;
1830 if (len == 0)
1831 pathname[0] = '\0';
1832
1833 if (stat(pathname, &sb) != 0)
1834 return false;
1835
1836 return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
1837 }
1838 #elif defined(HAVE_KVM_H)
1839 static bool
1840 pid_is_exec(pid_t pid, const struct stat *esb)
1841 {
1842 kvm_t *kd;
1843 int argv_len = 0;
1844 struct kinfo_proc *kp;
1845 struct stat sb;
1846 char buf[_POSIX2_LINE_MAX];
1847 char **pid_argv_p;
1848 char *start_argv_0_p, *end_argv_0_p;
1849 bool res = false;
1850
1851 kd = ssd_kvm_open();
1852 kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
1853 if (kp == NULL)
1854 goto cleanup;
1855
1856 pid_argv_p = kvm_getargv(kd, kp, argv_len);
1857 if (pid_argv_p == NULL)
1858 errx(1, "%s", kvm_geterr(kd));
1859
1860 /* Find and compare string. */
1861 start_argv_0_p = *pid_argv_p;
1862
1863 /* Find end of argv[0] then copy and cut of str there. */
1864 end_argv_0_p = strchr(*pid_argv_p, ' ');
1865 if (end_argv_0_p == NULL)
1866 /* There seems to be no space, so we have the command
1867 * already in its desired form. */
1868 start_argv_0_p = *pid_argv_p;
1869 else {
1870 /* Tests indicate that this never happens, since
1871 * kvm_getargv itself cuts of tailing stuff. This is
1872 * not what the manpage says, however. */
1873 strncpy(buf, *pid_argv_p, (end_argv_0_p - start_argv_0_p));
1874 buf[(end_argv_0_p - start_argv_0_p) + 1] = '\0';
1875 start_argv_0_p = buf;
1876 }
1877
1878 if (stat(start_argv_0_p, &sb) != 0)
1879 goto cleanup;
1880
1881 res = (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
1882
1883 cleanup:
1884 kvm_close(kd);
1885
1886 return res;
1887 }
1888 #endif
1889
1890 #if defined(OS_Linux)
1891 static bool
1892 pid_is_child(pid_t pid, pid_t ppid)
1893 {
1894 const char *ppid_str;
1895 pid_t proc_ppid;
1896 int rc;
1897
1898 ppid_str = proc_status_field(pid, "PPid:");
1899 if (ppid_str == NULL)
1900 return false;
1901
1902 rc = parse_pid(ppid_str, &proc_ppid);
1903 if (rc < 0)
1904 return false;
1905
1906 return proc_ppid == ppid;
1907 }
1908 #elif defined(OS_Hurd)
1909 static bool
1910 pid_is_child(pid_t pid, pid_t ppid)
1911 {
1912 struct proc_stat *ps;
1913 struct procinfo *pi;
1914
1915 ps = get_proc_stat(pid, PSTAT_PROC_INFO);
1916 if (ps == NULL)
1917 return false;
1918
1919 pi = proc_stat_proc_info(ps);
1920
1921 return pi->ppid == ppid;
1922 }
1923 #elif defined(OS_Darwin)
1924 static bool
1925 pid_is_child(pid_t pid, pid_t ppid)
1926 {
1927 struct proc_bsdinfo info;
1928
1929 if (proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &info, sizeof(info)) < 0)
1930 return false;
1931
1932 return (pid_t)info.pbi_ppid == ppid;
1933 }
1934 #elif defined(OS_AIX)
1935 static bool
1936 pid_is_child(pid_t pid, pid_t ppid)
1937 {
1938 struct psinfo psi;
1939
1940 if (!proc_get_psinfo(pid, &psi))
1941 return false;
1942
1943 return (pid_t)psi.pr_ppid == ppid;
1944 }
1945 #elif defined(OS_HPUX)
1946 static bool
1947 pid_is_child(pid_t pid, pid_t ppid)
1948 {
1949 struct pst_status pst;
1950
1951 if (pstat_getproc(&pst, sizeof(pst), (size_t)0, (int)pid) < 0)
1952 return false;
1953
1954 return pst.pst_ppid == ppid;
1955 }
1956 #elif defined(OS_FreeBSD)
1957 static bool
1958 pid_is_child(pid_t pid, pid_t ppid)
1959 {
1960 struct kinfo_proc kp;
1961 int rc, mib[4];
1962 size_t len;
1963
1964 mib[0] = CTL_KERN;
1965 mib[1] = KERN_PROC;
1966 mib[2] = KERN_PROC_PID;
1967 mib[3] = pid;
1968 len = sizeof(kp);
1969
1970 rc = sysctl(mib, 4, &kp, &len, NULL, 0);
1971 if (rc != 0 && errno != ESRCH)
1972 return false;
1973 if (len == 0 || len != sizeof(kp))
1974 return false;
1975
1976 return kp.ki_ppid == ppid;
1977 }
1978 #elif defined(HAVE_KVM_H)
1979 static bool
1980 pid_is_child(pid_t pid, pid_t ppid)
1981 {
1982 kvm_t *kd;
1983 struct kinfo_proc *kp;
1984 pid_t proc_ppid;
1985 bool res = false;
1986
1987 kd = ssd_kvm_open();
1988 kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
1989 if (kp == NULL)
1990 goto cleanup;
1991
1992 #if defined(OS_FreeBSD)
1993 proc_ppid = kp->ki_ppid;
1994 #elif defined(OS_OpenBSD)
1995 proc_ppid = kp->p_ppid;
1996 #elif defined(OS_DragonFlyBSD)
1997 proc_ppid = kp->kp_ppid;
1998 #else
1999 proc_ppid = kp->kp_proc.p_ppid;
2000 #endif
2001
2002 res = (proc_ppid == ppid);
2003
2004 cleanup:
2005 kvm_close(kd);
2006
2007 return res;
2008 }
2009 #endif
2010
2011 #if defined(OS_Linux)
2012 static bool
2013 pid_is_user(pid_t pid, uid_t uid)
2014 {
2015 struct stat sb;
2016 char buf[32];
2017
2018 sprintf(buf, "/proc/%d", pid);
2019 if (stat(buf, &sb) != 0)
2020 return false;
2021 return (sb.st_uid == uid);
2022 }
2023 #elif defined(OS_Hurd)
2024 static bool
2025 pid_is_user(pid_t pid, uid_t uid)
2026 {
2027 struct proc_stat *ps;
2028
2029 ps = get_proc_stat(pid, PSTAT_OWNER_UID);
2030 return ps && (uid_t)proc_stat_owner_uid(ps) == uid;
2031 }
2032 #elif defined(OS_Darwin)
2033 static bool
2034 pid_is_user(pid_t pid, uid_t uid)
2035 {
2036 struct proc_bsdinfo info;
2037
2038 if (proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &info, sizeof(info)) < 0)
2039 return false;
2040
2041 return info.pbi_ruid == uid;
2042 }
2043 #elif defined(OS_AIX)
2044 static bool
2045 pid_is_user(pid_t pid, uid_t uid)
2046 {
2047 struct psinfo psi;
2048
2049 if (!proc_get_psinfo(pid, &psi))
2050 return false;
2051
2052 return psi.pr_uid == uid;
2053 }
2054 #elif defined(OS_HPUX)
2055 static bool
2056 pid_is_user(pid_t pid, uid_t uid)
2057 {
2058 struct pst_status pst;
2059
2060 if (pstat_getproc(&pst, sizeof(pst), (size_t)0, (int)pid) < 0)
2061 return false;
2062 return ((uid_t)pst.pst_uid == uid);
2063 }
2064 #elif defined(OS_FreeBSD)
2065 static bool
2066 pid_is_user(pid_t pid, uid_t uid)
2067 {
2068 struct kinfo_proc kp;
2069 int rc, mib[4];
2070 size_t len;
2071
2072 mib[0] = CTL_KERN;
2073 mib[1] = KERN_PROC;
2074 mib[2] = KERN_PROC_PID;
2075 mib[3] = pid;
2076 len = sizeof(kp);
2077
2078 rc = sysctl(mib, 4, &kp, &len, NULL, 0);
2079 if (rc != 0 && errno != ESRCH)
2080 return false;
2081 if (len == 0 || len != sizeof(kp))
2082 return false;
2083
2084 return kp.ki_ruid == uid;
2085 }
2086 #elif defined(HAVE_KVM_H)
2087 static bool
2088 pid_is_user(pid_t pid, uid_t uid)
2089 {
2090 kvm_t *kd;
2091 uid_t proc_uid;
2092 struct kinfo_proc *kp;
2093 bool res = false;
2094
2095 kd = ssd_kvm_open();
2096 kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
2097 if (kp == NULL)
2098 goto cleanup;
2099
2100 #if defined(OS_FreeBSD)
2101 proc_uid = kp->ki_ruid;
2102 #elif defined(OS_OpenBSD)
2103 proc_uid = kp->p_ruid;
2104 #elif defined(OS_DragonFlyBSD)
2105 proc_uid = kp->kp_ruid;
2106 #elif defined(OS_NetBSD)
2107 proc_uid = kp->kp_eproc.e_pcred.p_ruid;
2108 #else
2109 if (kp->kp_proc.p_cred)
2110 kvm_read(kd, (u_long)&(kp->kp_proc.p_cred->p_ruid),
2111 &proc_uid, sizeof(uid_t));
2112 else
2113 goto cleanup;
2114 #endif
2115
2116 res = (proc_uid == (uid_t)uid);
2117
2118 cleanup:
2119 kvm_close(kd);
2120
2121 return res;
2122 }
2123 #endif
2124
2125 #if defined(OS_Linux)
2126 static bool
2127 pid_is_cmd(pid_t pid, const char *name)
2128 {
2129 const char *comm;
2130
2131 comm = proc_status_field(pid, "Name:");
2132 if (comm == NULL)
2133 return false;
2134
2135 return strcmp(comm, name) == 0;
2136 }
2137 #elif defined(OS_Hurd)
2138 static bool
2139 pid_is_cmd(pid_t pid, const char *name)
2140 {
2141 struct proc_stat *ps;
2142 size_t argv0_len;
2143 const char *argv0;
2144 const char *binary_name;
2145
2146 ps = get_proc_stat(pid, PSTAT_ARGS);
2147 if (ps == NULL)
2148 return false;
2149
2150 argv0 = proc_stat_args(ps);
2151 argv0_len = strlen(argv0) + 1;
2152
2153 binary_name = basename(argv0);
2154 if (strcmp(binary_name, name) == 0)
2155 return true;
2156
2157 /* XXX: This is all kinds of ugly, but on the Hurd there's no way to
2158 * know the command name of a process, so we have to try to match
2159 * also on argv[1] for the case of an interpreted script. */
2160 if (proc_stat_args_len(ps) > argv0_len) {
2161 const char *script_name = basename(argv0 + argv0_len);
2162
2163 return strcmp(script_name, name) == 0;
2164 }
2165
2166 return false;
2167 }
2168 #elif defined(OS_AIX)
2169 static bool
2170 pid_is_cmd(pid_t pid, const char *name)
2171 {
2172 struct psinfo psi;
2173
2174 if (!proc_get_psinfo(pid, &psi))
2175 return false;
2176
2177 return strcmp(psi.pr_fname, name) == 0;
2178 }
2179 #elif defined(OS_HPUX)
2180 static bool
2181 pid_is_cmd(pid_t pid, const char *name)
2182 {
2183 struct pst_status pst;
2184
2185 if (pstat_getproc(&pst, sizeof(pst), (size_t)0, (int)pid) < 0)
2186 return false;
2187 return (strcmp(pst.pst_ucomm, name) == 0);
2188 }
2189 #elif defined(OS_Darwin)
2190 static bool
2191 pid_is_cmd(pid_t pid, const char *name)
2192 {
2193 char pathname[_POSIX_PATH_MAX];
2194
2195 if (proc_pidpath(pid, pathname, sizeof(pathname)) < 0)
2196 return false;
2197
2198 return strcmp(pathname, name) == 0;
2199 }
2200 #elif defined(OS_FreeBSD)
2201 static bool
2202 pid_is_cmd(pid_t pid, const char *name)
2203 {
2204 struct kinfo_proc kp;
2205 int rc, mib[4];
2206 size_t len;
2207
2208 mib[0] = CTL_KERN;
2209 mib[1] = KERN_PROC;
2210 mib[2] = KERN_PROC_PID;
2211 mib[3] = pid;
2212 len = sizeof(kp);
2213
2214 rc = sysctl(mib, 4, &kp, &len, NULL, 0);
2215 if (rc != 0 && errno != ESRCH)
2216 return false;
2217 if (len == 0 || len != sizeof(kp))
2218 return false;
2219
2220 return strcmp(kp.ki_comm, name) == 0;
2221 }
2222 #elif defined(HAVE_KVM_H)
2223 static bool
2224 pid_is_cmd(pid_t pid, const char *name)
2225 {
2226 kvm_t *kd;
2227 struct kinfo_proc *kp;
2228 char *process_name;
2229 bool res = false;
2230
2231 kd = ssd_kvm_open();
2232 kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
2233 if (kp == NULL)
2234 goto cleanup;
2235
2236 #if defined(OS_FreeBSD)
2237 process_name = kp->ki_comm;
2238 #elif defined(OS_OpenBSD)
2239 process_name = kp->p_comm;
2240 #elif defined(OS_DragonFlyBSD)
2241 process_name = kp->kp_comm;
2242 #else
2243 process_name = kp->kp_proc.p_comm;
2244 #endif
2245
2246 res = (strcmp(name, process_name) == 0);
2247
2248 cleanup:
2249 kvm_close(kd);
2250
2251 return res;
2252 }
2253 #endif
2254
2255 #if defined(OS_Hurd)
2256 static bool
2257 pid_is_running(pid_t pid)
2258 {
2259 return get_proc_stat(pid, 0) != NULL;
2260 }
2261 #else /* !OS_Hurd */
2262 static bool
2263 pid_is_running(pid_t pid)
2264 {
2265 if (kill(pid, 0) == 0 || errno == EPERM)
2266 return true;
2267 else if (errno == ESRCH)
2268 return false;
2269 else
2270 fatale("error checking pid %u status", pid);
2271 }
2272 #endif
2273
2274 static enum status_code
2275 pid_check(pid_t pid)
2276 {
2277 if (execname && !pid_is_exec(pid, &exec_stat))
2278 return STATUS_DEAD;
2279 if (match_ppid > 0 && !pid_is_child(pid, match_ppid))
2280 return STATUS_DEAD;
2281 if (userspec && !pid_is_user(pid, user_id))
2282 return STATUS_DEAD;
2283 if (cmdname && !pid_is_cmd(pid, cmdname))
2284 return STATUS_DEAD;
2285 if (action != ACTION_STOP && !pid_is_running(pid))
2286 return STATUS_DEAD;
2287
2288 pid_list_push(&found, pid);
2289
2290 return STATUS_OK;
2291 }
2292
2293 static enum status_code
2294 do_pidfile(const char *name)
2295 {
2296 FILE *f;
2297 static pid_t pid = 0;
2298
2299 if (pid)
2300 return pid_check(pid);
2301
2302 f = fopen(name, "r");
2303 if (f) {
2304 enum status_code pid_status;
2305
2306 /* If we are only matching on the pidfile, and it is owned by
2307 * a non-root user, then this is a security risk, and the
2308 * contents cannot be trusted, because the daemon might have
2309 * been compromised.
2310 *
2311 * If the pidfile is world-writable we refuse to parse it.
2312 *
2313 * If we got /dev/null specified as the pidfile, we ignore the
2314 * checks, as this is being used to run processes no matter
2315 * what. */
2316 if (strcmp(name, "/dev/null") != 0) {
2317 struct stat st;
2318 int fd = fileno(f);
2319
2320 if (fstat(fd, &st) < 0)
2321 fatale("cannot stat pidfile %s", name);
2322
2323 if (match_mode == MATCH_PIDFILE &&
2324 ((st.st_uid != getuid() && st.st_uid != 0) ||
2325 (st.st_gid != getgid() && st.st_gid != 0)))
2326 fatal("matching only on non-root pidfile %s is insecure", name);
2327 if (st.st_mode & 0002)
2328 fatal("matching on world-writable pidfile %s is insecure", name);
2329
2330 }
2331
2332 if (fscanf(f, "%d", &pid) == 1)
2333 pid_status = pid_check(pid);
2334 else
2335 pid_status = STATUS_UNKNOWN;
2336 fclose(f);
2337
2338 if (pid_status == STATUS_DEAD)
2339 return STATUS_DEAD_PIDFILE;
2340 else
2341 return pid_status;
2342 } else if (errno == ENOENT)
2343 return STATUS_DEAD;
2344 else
2345 fatale("unable to open pidfile %s", name);
2346 }
2347
2348 #if defined(OS_Linux) || defined(OS_Solaris) || defined(OS_AIX)
2349 static enum status_code
2350 do_procinit(void)
2351 {
2352 DIR *procdir;
2353 struct dirent *entry;
2354 int foundany;
2355 pid_t pid;
2356 enum status_code prog_status = STATUS_DEAD;
2357
2358 procdir = opendir("/proc");
2359 if (!procdir)
2360 fatale("unable to opendir /proc");
2361
2362 foundany = 0;
2363 while ((entry = readdir(procdir)) != NULL) {
2364 enum status_code pid_status;
2365
2366 if (sscanf(entry->d_name, "%d", &pid) != 1)
2367 continue;
2368 foundany++;
2369
2370 pid_status = pid_check(pid);
2371 if (pid_status < prog_status)
2372 prog_status = pid_status;
2373 }
2374 closedir(procdir);
2375 if (foundany == 0)
2376 fatal("nothing in /proc - not mounted?");
2377
2378 return prog_status;
2379 }
2380 #elif defined(OS_Hurd)
2381 static int
2382 check_proc_stat(struct proc_stat *ps)
2383 {
2384 pid_check(proc_stat_pid(ps));
2385 return 0;
2386 }
2387
2388 static enum status_code
2389 do_procinit(void)
2390 {
2391 if (!procset)
2392 init_procset();
2393
2394 proc_stat_list_for_each(procset, check_proc_stat);
2395
2396 if (found)
2397 return STATUS_OK;
2398 else
2399 return STATUS_DEAD;
2400 }
2401 #elif defined(OS_Darwin)
2402 static enum status_code
2403 do_procinit(void)
2404 {
2405 pid_t *pid_buf;
2406 int i, npids, pid_bufsize;
2407 enum status_code prog_status = STATUS_DEAD;
2408
2409 npids = proc_listallpids(NULL, 0);
2410 if (npids == 0)
2411 return STATUS_UNKNOWN;
2412
2413 /* Try to avoid sudden changes in number of PIDs. */
2414 npids += 4096;
2415 pid_bufsize = sizeof(pid_t) * npids;
2416 pid_buf = xmalloc(pid_bufsize);
2417
2418 npids = proc_listallpids(pid_buf, pid_bufsize);
2419 if (npids == 0)
2420 return STATUS_UNKNOWN;
2421
2422 for (i = 0; i < npids; i++) {
2423 enum status_code pid_status;
2424
2425 pid_status = pid_check(pid_buf[i]);
2426 if (pid_status < prog_status)
2427 prog_status = pid_status;
2428 }
2429
2430 free(pid_buf);
2431
2432 return prog_status;
2433 }
2434 #elif defined(OS_HPUX)
2435 static enum status_code
2436 do_procinit(void)
2437 {
2438 struct pst_status pst[10];
2439 int i, count;
2440 int idx = 0;
2441 enum status_code prog_status = STATUS_DEAD;
2442
2443 while ((count = pstat_getproc(pst, sizeof(pst[0]), 10, idx)) > 0) {
2444 enum status_code pid_status;
2445
2446 for (i = 0; i < count; i++) {
2447 pid_status = pid_check(pst[i].pst_pid);
2448 if (pid_status < prog_status)
2449 prog_status = pid_status;
2450 }
2451 idx = pst[count - 1].pst_idx + 1;
2452 }
2453
2454 return prog_status;
2455 }
2456 #elif defined(OS_FreeBSD)
2457 static enum status_code
2458 do_procinit(void)
2459 {
2460 struct kinfo_proc *kp;
2461 int rc, mib[3];
2462 size_t len = 0;
2463 int nentries, i;
2464 enum status_code prog_status = STATUS_DEAD;
2465
2466 mib[0] = CTL_KERN;
2467 mib[1] = KERN_PROC;
2468 mib[2] = KERN_PROC_PROC;
2469
2470 rc = sysctl(mib, 3, NULL, &len, NULL, 0);
2471 if (rc != 0 && errno != ESRCH)
2472 return STATUS_UNKNOWN;
2473 if (len == 0)
2474 return STATUS_UNKNOWN;
2475
2476 kp = xmalloc(len);
2477 rc = sysctl(mib, 3, kp, &len, NULL, 0);
2478 if (rc != 0 && errno != ESRCH)
2479 return STATUS_UNKNOWN;
2480 if (len == 0)
2481 return STATUS_UNKNOWN;
2482 nentries = len / sizeof(*kp);
2483
2484 for (i = 0; i < nentries; i++) {
2485 enum status_code pid_status;
2486
2487 pid_status = pid_check(kp[i].ki_pid);
2488 if (pid_status < prog_status)
2489 prog_status = pid_status;
2490 }
2491
2492 free(kp);
2493
2494 return prog_status;
2495 }
2496 #elif defined(HAVE_KVM_H)
2497 static enum status_code
2498 do_procinit(void)
2499 {
2500 kvm_t *kd;
2501 int nentries, i;
2502 struct kinfo_proc *kp;
2503 enum status_code prog_status = STATUS_DEAD;
2504
2505 kd = ssd_kvm_open();
2506 kp = ssd_kvm_get_procs(kd, KERN_PROC_ALL, 0, &nentries);
2507
2508 for (i = 0; i < nentries; i++) {
2509 enum status_code pid_status;
2510 pid_t pid;
2511
2512 #if defined(OS_FreeBSD)
2513 pid = kp[i].ki_pid;
2514 #elif defined(OS_OpenBSD)
2515 pid = kp[i].p_pid;
2516 #elif defined(OS_DragonFlyBSD)
2517 pid = kp[i].kp_pid;
2518 #else
2519 pid = kp[i].kp_proc.p_pid;
2520 #endif
2521
2522 pid_status = pid_check(pid);
2523 if (pid_status < prog_status)
2524 prog_status = pid_status;
2525 }
2526
2527 kvm_close(kd);
2528
2529 return prog_status;
2530 }
2531 #endif
2532
2533 static enum status_code
2534 do_findprocs(void)
2535 {
2536 pid_list_free(&found);
2537
2538 if (match_pid > 0)
2539 return pid_check(match_pid);
2540 else if (pidfile)
2541 return do_pidfile(pidfile);
2542 else
2543 return do_procinit();
2544 }
2545
2546 static int
2547 do_start(int argc, char **argv)
2548 {
2549 int devnull_fd = -1;
2550 int output_fd = -1;
2551 gid_t rgid;
2552 uid_t ruid;
2553
2554 do_findprocs();
2555
2556 if (found) {
2557 info("%s already running.\n", execname ? execname : "process");
2558 return exitnodo;
2559 }
2560 if (testmode && quietmode <= 0) {
2561 printf("Would start %s ", startas);
2562 while (argc-- > 0)
2563 printf("%s ", *argv++);
2564 if (changeuser != NULL) {
2565 printf(" (as user %s[%d]", changeuser, runas_uid);
2566 if (changegroup != NULL)
2567 printf(", and group %s[%d])", changegroup, runas_gid);
2568 else
2569 printf(")");
2570 }
2571 if (changeroot != NULL)
2572 printf(" in directory %s", changeroot);
2573 if (nicelevel)
2574 printf(", and add %i to the priority", nicelevel);
2575 if (proc_sched)
2576 printf(", with scheduling policy %s with priority %i",
2577 proc_sched->policy_name, proc_sched->priority);
2578 if (io_sched)
2579 printf(", with IO scheduling class %s with priority %i",
2580 io_sched->policy_name, io_sched->priority);
2581 printf(".\n");
2582 }
2583 if (testmode)
2584 return 0;
2585 debug("Starting %s...\n", startas);
2586 *--argv = startas;
2587 if (umask_value >= 0)
2588 umask(umask_value);
2589 if (background)
2590 /* Ok, we need to detach this process. */
2591 daemonize();
2592 else if (mpidfile && pidfile != NULL)
2593 /* User wants _us_ to make the pidfile, but detach themself! */
2594 write_pidfile(pidfile, getpid());
2595 if (background && close_io) {
2596 devnull_fd = open("/dev/null", O_RDONLY);
2597 if (devnull_fd < 0)
2598 fatale("unable to open '%s'", "/dev/null");
2599 }
2600 if (background && output_io) {
2601 output_fd = open(output_io, O_CREAT | O_WRONLY | O_APPEND, 0664);
2602 if (output_fd < 0)
2603 fatale("unable to open '%s'", output_io);
2604 }
2605 if (nicelevel) {
2606 errno = 0;
2607 if ((nice(nicelevel) == -1) && (errno != 0))
2608 fatale("unable to alter nice level by %i", nicelevel);
2609 }
2610 if (proc_sched)
2611 set_proc_schedule(proc_sched);
2612 if (io_sched)
2613 set_io_schedule(io_sched);
2614 if (changeroot != NULL) {
2615 if (chdir(changeroot) < 0)
2616 fatale("unable to chdir() to %s", changeroot);
2617 if (chroot(changeroot) < 0)
2618 fatale("unable to chroot() to %s", changeroot);
2619 }
2620 if (chdir(changedir) < 0)
2621 fatale("unable to chdir() to %s", changedir);
2622
2623 rgid = getgid();
2624 ruid = getuid();
2625 if (changegroup != NULL) {
2626 if (rgid != (gid_t)runas_gid)
2627 if (setgid(runas_gid))
2628 fatale("unable to set gid to %d", runas_gid);
2629 }
2630 if (changeuser != NULL) {
2631 /* We assume that if our real user and group are the same as
2632 * the ones we should switch to, the supplementary groups
2633 * will be already in place. */
2634 if (rgid != (gid_t)runas_gid || ruid != (uid_t)runas_uid)
2635 if (initgroups(changeuser, runas_gid))
2636 fatale("unable to set initgroups() with gid %d",
2637 runas_gid);
2638
2639 if (ruid != (uid_t)runas_uid)
2640 if (setuid(runas_uid))
2641 fatale("unable to set uid to %s", changeuser);
2642 }
2643
2644 if (background && output_fd >= 0) {
2645 dup2(output_fd, 1); /* stdout */
2646 dup2(output_fd, 2); /* stderr */
2647 }
2648 if (background && close_io) {
2649 int i;
2650
2651 dup2(devnull_fd, 0); /* stdin */
2652
2653 /* Now close all extra fds. */
2654 for (i = get_open_fd_max() - 1; i >= 3; --i)
2655 close(i);
2656 }
2657 execv(startas, argv);
2658 fatale("unable to start %s", startas);
2659 }
2660
2661 static void
2662 do_stop(int sig_num, int *n_killed, int *n_notkilled)
2663 {
2664 struct pid_list *p;
2665
2666 do_findprocs();
2667
2668 *n_killed = 0;
2669 *n_notkilled = 0;
2670
2671 if (!found)
2672 return;
2673
2674 pid_list_free(&killed);
2675
2676 for (p = found; p; p = p->next) {
2677 if (testmode) {
2678 info("Would send signal %d to %d.\n", sig_num, p->pid);
2679 (*n_killed)++;
2680 } else if (kill(p->pid, sig_num) == 0) {
2681 pid_list_push(&killed, p->pid);
2682 (*n_killed)++;
2683 } else {
2684 if (sig_num)
2685 warning("failed to kill %d: %s\n",
2686 p->pid, strerror(errno));
2687 (*n_notkilled)++;
2688 }
2689 }
2690 }
2691
2692 static void
2693 do_stop_summary(int retry_nr)
2694 {
2695 struct pid_list *p;
2696
2697 if (quietmode >= 0 || !killed)
2698 return;
2699
2700 printf("Stopped %s (pid", what_stop);
2701 for (p = killed; p; p = p->next)
2702 printf(" %d", p->pid);
2703 putchar(')');
2704 if (retry_nr > 0)
2705 printf(", retry #%d", retry_nr);
2706 printf(".\n");
2707 }
2708
2709 static void LIBCOMPAT_ATTR_PRINTF(1)
2710 set_what_stop(const char *format, ...)
2711 {
2712 va_list arglist;
2713 int rc;
2714
2715 va_start(arglist, format);
2716 rc = vasprintf(&what_stop, format, arglist);
2717 va_end(arglist);
2718
2719 if (rc < 0)
2720 fatale("cannot allocate formatted string");
2721 }
2722
2723 /*
2724 * We want to keep polling for the processes, to see if they've exited, or
2725 * until the timeout expires.
2726 *
2727 * This is a somewhat complicated algorithm to try to ensure that we notice
2728 * reasonably quickly when all the processes have exited, but don't spend
2729 * too much CPU time polling. In particular, on a fast machine with
2730 * quick-exiting daemons we don't want to delay system shutdown too much,
2731 * whereas on a slow one, or where processes are taking some time to exit,
2732 * we want to increase the polling interval.
2733 *
2734 * The algorithm is as follows: we measure the elapsed time it takes to do
2735 * one poll(), and wait a multiple of this time for the next poll. However,
2736 * if that would put us past the end of the timeout period we wait only as
2737 * long as the timeout period, but in any case we always wait at least
2738 * MIN_POLL_INTERVAL (20ms). The multiple (‘ratio’) starts out as 2, and
2739 * increases by 1 for each poll to a maximum of 10; so we use up to between
2740 * 30% and 10% of the machine's resources (assuming a few reasonable things
2741 * about system performance).
2742 */
2743 static bool
2744 do_stop_timeout(int timeout, int *n_killed, int *n_notkilled)
2745 {
2746 struct timespec stopat, before, after, interval, maxinterval;
2747 int rc, ratio;
2748
2749 timespec_gettime(&stopat);
2750 stopat.tv_sec += timeout;
2751 ratio = 1;
2752 for (;;) {
2753 timespec_gettime(&before);
2754 if (timespec_cmp(&before, &stopat, >))
2755 return false;
2756
2757 do_stop(0, n_killed, n_notkilled);
2758 if (!*n_killed)
2759 return true;
2760
2761 timespec_gettime(&after);
2762
2763 if (!timespec_cmp(&after, &stopat, <))
2764 return false;
2765
2766 if (ratio < 10)
2767 ratio++;
2768
2769 timespec_sub(&stopat, &after, &maxinterval);
2770 timespec_sub(&after, &before, &interval);
2771 timespec_mul(&interval, ratio);
2772
2773 if (interval.tv_sec < 0 || interval.tv_nsec < 0)
2774 interval.tv_sec = interval.tv_nsec = 0;
2775
2776 if (timespec_cmp(&interval, &maxinterval, >))
2777 interval = maxinterval;
2778
2779 if (interval.tv_sec == 0 &&
2780 interval.tv_nsec <= MIN_POLL_INTERVAL)
2781 interval.tv_nsec = MIN_POLL_INTERVAL;
2782
2783 rc = pselect(0, NULL, NULL, NULL, &interval, NULL);
2784 if (rc < 0 && errno != EINTR)
2785 fatale("select() failed for pause");
2786 }
2787 }
2788
2789 static int
2790 finish_stop_schedule(bool anykilled)
2791 {
2792 if (rpidfile && pidfile && !testmode)
2793 remove_pidfile(pidfile);
2794
2795 if (anykilled)
2796 return 0;
2797
2798 info("No %s found running; none killed.\n", what_stop);
2799
2800 return exitnodo;
2801 }
2802
2803 static int
2804 run_stop_schedule(void)
2805 {
2806 int position, n_killed, n_notkilled, value, retry_nr;
2807 bool anykilled;
2808
2809 if (testmode) {
2810 if (schedule != NULL) {
2811 info("Ignoring --retry in test mode\n");
2812 schedule = NULL;
2813 }
2814 }
2815
2816 if (cmdname)
2817 set_what_stop("%s", cmdname);
2818 else if (execname)
2819 set_what_stop("%s", execname);
2820 else if (pidfile)
2821 set_what_stop("process in pidfile '%s'", pidfile);
2822 else if (match_pid > 0)
2823 set_what_stop("process with pid %d", match_pid);
2824 else if (match_ppid > 0)
2825 set_what_stop("process(es) with parent pid %d", match_ppid);
2826 else if (userspec)
2827 set_what_stop("process(es) owned by '%s'", userspec);
2828 else
2829 BUG("no match option, please report");
2830
2831 anykilled = false;
2832 retry_nr = 0;
2833
2834 if (schedule == NULL) {
2835 do_stop(signal_nr, &n_killed, &n_notkilled);
2836 do_stop_summary(0);
2837 if (n_notkilled > 0)
2838 info("%d pids were not killed\n", n_notkilled);
2839 if (n_killed)
2840 anykilled = true;
2841 return finish_stop_schedule(anykilled);
2842 }
2843
2844 for (position = 0; position < schedule_length; position++) {
2845 reposition:
2846 value = schedule[position].value;
2847 n_notkilled = 0;
2848
2849 switch (schedule[position].type) {
2850 case sched_goto:
2851 position = value;
2852 goto reposition;
2853 case sched_signal:
2854 do_stop(value, &n_killed, &n_notkilled);
2855 do_stop_summary(retry_nr++);
2856 if (!n_killed)
2857 return finish_stop_schedule(anykilled);
2858 else
2859 anykilled = true;
2860 continue;
2861 case sched_timeout:
2862 if (do_stop_timeout(value, &n_killed, &n_notkilled))
2863 return finish_stop_schedule(anykilled);
2864 else
2865 continue;
2866 default:
2867 BUG("schedule[%d].type value %d is not valid",
2868 position, schedule[position].type);
2869 }
2870 }
2871
2872 info("Program %s, %d process(es), refused to die.\n",
2873 what_stop, n_killed);
2874
2875 return 2;
2876 }
2877
2878 int
2879 main(int argc, char **argv)
2880 {
2881 progname = argv[0];
2882
2883 parse_options(argc, argv);
2884 setup_options();
2885
2886 argc -= optind;
2887 argv += optind;
2888
2889 if (action == ACTION_START)
2890 return do_start(argc, argv);
2891 else if (action == ACTION_STOP)
2892 return run_stop_schedule();
2893 else if (action == ACTION_STATUS)
2894 return do_findprocs();
2895
2896 return 0;
2897 }
|