start-stop-daemon.c (66807B)
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 }