diff options
| author | 2021-01-11 05:07:45 +0100 | |
|---|---|---|
| committer | 2021-01-11 05:07:45 +0100 | |
| commit | 4b3847cc977c4c4fd9973abb772d9dba64911b70 (patch) | |
| tree | 2656f8bc03f050a3716a49b5edb78469dc0528ac | |
| parent | 1a701545aae73cd060c31fd5a2d818ac558a5b96 (diff) | |
| download | usbmuxd-4b3847cc977c4c4fd9973abb772d9dba64911b70.tar.gz usbmuxd-4b3847cc977c4c4fd9973abb772d9dba64911b70.tar.bz2 | |
Add option to allow changing the location of or disabling the pidfile
| -rw-r--r-- | src/main.c | 96 |
1 files changed, 59 insertions, 37 deletions
| @@ -54,7 +54,8 @@ | |||
| 54 | #include "conf.h" | 54 | #include "conf.h" |
| 55 | 55 | ||
| 56 | static const char *socket_path = "/var/run/usbmuxd"; | 56 | static const char *socket_path = "/var/run/usbmuxd"; |
| 57 | static const char *lockfile = "/var/run/usbmuxd.pid"; | 57 | #define DEFAULT_LOCKFILE "/var/run/usbmuxd.pid" |
| 58 | static const char *lockfile = DEFAULT_LOCKFILE; | ||
| 58 | 59 | ||
| 59 | // Global state used in other files | 60 | // Global state used in other files |
| 60 | int should_exit; | 61 | int should_exit; |
| @@ -519,6 +520,8 @@ static void usage() | |||
| 519 | printf(" -S, --socket ADDR:PORT | PATH Specify source ADDR and PORT or a UNIX\n"); | 520 | printf(" -S, --socket ADDR:PORT | PATH Specify source ADDR and PORT or a UNIX\n"); |
| 520 | printf(" \t\tsocket PATH to use for the listening socket.\n"); | 521 | printf(" \t\tsocket PATH to use for the listening socket.\n"); |
| 521 | printf(" \t\tDefault: %s\n", socket_path); | 522 | printf(" \t\tDefault: %s\n", socket_path); |
| 523 | printf(" -P, --pidfile PATH\tSpecify a different location for the pid file, or pass\n"); | ||
| 524 | printf(" \t\tNONE to disable. Default: %s\n", DEFAULT_LOCKFILE); | ||
| 522 | printf(" -x, --exit\t\tNotify a running instance to exit if there are no devices\n"); | 525 | printf(" -x, --exit\t\tNotify a running instance to exit if there are no devices\n"); |
| 523 | printf(" \t\tconnected (sends SIGUSR1 to running instance) and exit.\n"); | 526 | printf(" \t\tconnected (sends SIGUSR1 to running instance) and exit.\n"); |
| 524 | printf(" -X, --force-exit\tNotify a running instance to exit even if there are still\n"); | 527 | printf(" -X, --force-exit\tNotify a running instance to exit even if there are still\n"); |
| @@ -547,6 +550,7 @@ static void parse_opts(int argc, char **argv) | |||
| 547 | {"systemd", no_argument, NULL, 's'}, | 550 | {"systemd", no_argument, NULL, 's'}, |
| 548 | #endif | 551 | #endif |
| 549 | {"socket", required_argument, NULL, 'S'}, | 552 | {"socket", required_argument, NULL, 'S'}, |
| 553 | {"pidfile", required_argument, NULL, 'P'}, | ||
| 550 | {"exit", no_argument, NULL, 'x'}, | 554 | {"exit", no_argument, NULL, 'x'}, |
| 551 | {"force-exit", no_argument, NULL, 'X'}, | 555 | {"force-exit", no_argument, NULL, 'X'}, |
| 552 | {"logfile", required_argument, NULL, 'l'}, | 556 | {"logfile", required_argument, NULL, 'l'}, |
| @@ -556,11 +560,11 @@ static void parse_opts(int argc, char **argv) | |||
| 556 | int c; | 560 | int c; |
| 557 | 561 | ||
| 558 | #ifdef HAVE_SYSTEMD | 562 | #ifdef HAVE_SYSTEMD |
| 559 | const char* opts_spec = "hfvVuU:xXsnzl:pS:"; | 563 | const char* opts_spec = "hfvVuU:xXsnzl:pS:P:"; |
| 560 | #elif HAVE_UDEV | 564 | #elif HAVE_UDEV |
| 561 | const char* opts_spec = "hfvVuU:xXnzl:pS:"; | 565 | const char* opts_spec = "hfvVuU:xXnzl:pS:P:"; |
| 562 | #else | 566 | #else |
| 563 | const char* opts_spec = "hfvVU:xXnzl:pS:"; | 567 | const char* opts_spec = "hfvVU:xXnzl:pS:P:"; |
| 564 | #endif | 568 | #endif |
| 565 | 569 | ||
| 566 | while (1) { | 570 | while (1) { |
| @@ -615,6 +619,18 @@ static void parse_opts(int argc, char **argv) | |||
| 615 | } | 619 | } |
| 616 | listen_addr = optarg; | 620 | listen_addr = optarg; |
| 617 | break; | 621 | break; |
| 622 | case 'P': | ||
| 623 | if (!*optarg || *optarg == '-') { | ||
| 624 | usbmuxd_log(LL_FATAL, "ERROR: --pidfile requires an argument"); | ||
| 625 | usage(); | ||
| 626 | exit(2); | ||
| 627 | } | ||
| 628 | if (!strcmp(optarg, "NONE")) { | ||
| 629 | lockfile = NULL; | ||
| 630 | } else { | ||
| 631 | lockfile = optarg; | ||
| 632 | } | ||
| 633 | break; | ||
| 618 | case 'x': | 634 | case 'x': |
| 619 | opt_exit = 1; | 635 | opt_exit = 1; |
| 620 | exit_signal = SIGUSR1; | 636 | exit_signal = SIGUSR1; |
| @@ -676,19 +692,21 @@ int main(int argc, char *argv[]) | |||
| 676 | set_signal_handlers(); | 692 | set_signal_handlers(); |
| 677 | signal(SIGPIPE, SIG_IGN); | 693 | signal(SIGPIPE, SIG_IGN); |
| 678 | 694 | ||
| 679 | res = lfd = open(lockfile, O_WRONLY|O_CREAT, 0644); | 695 | if (lockfile) { |
| 680 | if(res == -1) { | 696 | res = lfd = open(lockfile, O_WRONLY|O_CREAT, 0644); |
| 681 | usbmuxd_log(LL_FATAL, "Could not open lockfile"); | 697 | if(res == -1) { |
| 682 | goto terminate; | 698 | usbmuxd_log(LL_FATAL, "Could not open lockfile"); |
| 699 | goto terminate; | ||
| 700 | } | ||
| 701 | lock.l_type = F_WRLCK; | ||
| 702 | lock.l_whence = SEEK_SET; | ||
| 703 | lock.l_start = 0; | ||
| 704 | lock.l_len = 0; | ||
| 705 | lock.l_pid = 0; | ||
| 706 | fcntl(lfd, F_GETLK, &lock); | ||
| 707 | close(lfd); | ||
| 683 | } | 708 | } |
| 684 | lock.l_type = F_WRLCK; | 709 | if (lockfile && lock.l_type != F_UNLCK) { |
| 685 | lock.l_whence = SEEK_SET; | ||
| 686 | lock.l_start = 0; | ||
| 687 | lock.l_len = 0; | ||
| 688 | lock.l_pid = 0; | ||
| 689 | fcntl(lfd, F_GETLK, &lock); | ||
| 690 | close(lfd); | ||
| 691 | if (lock.l_type != F_UNLCK) { | ||
| 692 | if (opt_exit) { | 710 | if (opt_exit) { |
| 693 | if (lock.l_pid && !kill(lock.l_pid, 0)) { | 711 | if (lock.l_pid && !kill(lock.l_pid, 0)) { |
| 694 | usbmuxd_log(LL_NOTICE, "Sending signal %d to instance with pid %d", exit_signal, lock.l_pid); | 712 | usbmuxd_log(LL_NOTICE, "Sending signal %d to instance with pid %d", exit_signal, lock.l_pid); |
| @@ -724,7 +742,9 @@ int main(int argc, char *argv[]) | |||
| 724 | goto terminate; | 742 | goto terminate; |
| 725 | } | 743 | } |
| 726 | } | 744 | } |
| 727 | unlink(lockfile); | 745 | if (lockfile) { |
| 746 | unlink(lockfile); | ||
| 747 | } | ||
| 728 | 748 | ||
| 729 | if (opt_exit) { | 749 | if (opt_exit) { |
| 730 | usbmuxd_log(LL_NOTICE, "No running instance found, none killed. Exiting."); | 750 | usbmuxd_log(LL_NOTICE, "No running instance found, none killed. Exiting."); |
| @@ -739,26 +759,28 @@ int main(int argc, char *argv[]) | |||
| 739 | } | 759 | } |
| 740 | } | 760 | } |
| 741 | 761 | ||
| 742 | // now open the lockfile and place the lock | 762 | if (lockfile) { |
| 743 | res = lfd = open(lockfile, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644); | 763 | // now open the lockfile and place the lock |
| 744 | if(res < 0) { | 764 | res = lfd = open(lockfile, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644); |
| 745 | usbmuxd_log(LL_FATAL, "Could not open lockfile"); | 765 | if(res < 0) { |
| 746 | goto terminate; | 766 | usbmuxd_log(LL_FATAL, "Could not open pidfile '%s'", lockfile); |
| 747 | } | 767 | goto terminate; |
| 748 | lock.l_type = F_WRLCK; | 768 | } |
| 749 | lock.l_whence = SEEK_SET; | 769 | lock.l_type = F_WRLCK; |
| 750 | lock.l_start = 0; | 770 | lock.l_whence = SEEK_SET; |
| 751 | lock.l_len = 0; | 771 | lock.l_start = 0; |
| 752 | if ((res = fcntl(lfd, F_SETLK, &lock)) < 0) { | 772 | lock.l_len = 0; |
| 753 | usbmuxd_log(LL_FATAL, "Lockfile locking failed!"); | 773 | if ((res = fcntl(lfd, F_SETLK, &lock)) < 0) { |
| 754 | goto terminate; | 774 | usbmuxd_log(LL_FATAL, "Locking pidfile '%s' failed!", lockfile); |
| 755 | } | 775 | goto terminate; |
| 756 | sprintf(pids, "%d", getpid()); | 776 | } |
| 757 | if ((size_t)(res = write(lfd, pids, strlen(pids))) != strlen(pids)) { | 777 | sprintf(pids, "%d", getpid()); |
| 758 | usbmuxd_log(LL_FATAL, "Could not write pidfile!"); | 778 | if ((size_t)(res = write(lfd, pids, strlen(pids))) != strlen(pids)) { |
| 759 | if(res >= 0) | 779 | usbmuxd_log(LL_FATAL, "Could not write pidfile!"); |
| 760 | res = -2; | 780 | if(res >= 0) |
| 761 | goto terminate; | 781 | res = -2; |
| 782 | goto terminate; | ||
| 783 | } | ||
| 762 | } | 784 | } |
| 763 | 785 | ||
| 764 | // set number of file descriptors to higher value | 786 | // set number of file descriptors to higher value |
