diff options
author | Ron Yorston <rmy@pobox.com> | 2020-07-25 12:48:13 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2020-07-25 12:48:13 +0100 |
commit | cfa888eb571d92d4de02b406f0dad15e4fa26d19 (patch) | |
tree | 177dec576bd63de16c3ae18f1b6982b3b15b92a0 | |
parent | 2974f8f44cdb029f040cc2a975592daf965817af (diff) | |
download | busybox-w32-cfa888eb571d92d4de02b406f0dad15e4fa26d19.tar.gz busybox-w32-cfa888eb571d92d4de02b406f0dad15e4fa26d19.tar.bz2 busybox-w32-cfa888eb571d92d4de02b406f0dad15e4fa26d19.zip |
win32: code shrink kill(2)
- Drop exit_code argument from kill_SIGTERM_by_handle()
- Pass signal number rather than exit code to other functions
- Merge kill_SIGKILL() and kill_SIGTEST()
Saves 112 bytes.
-rw-r--r-- | coreutils/timeout.c | 2 | ||||
-rw-r--r-- | include/mingw.h | 2 | ||||
-rw-r--r-- | win32/process.c | 48 |
3 files changed, 19 insertions, 33 deletions
diff --git a/coreutils/timeout.c b/coreutils/timeout.c index 1a9660183..06c134a37 100644 --- a/coreutils/timeout.c +++ b/coreutils/timeout.c | |||
@@ -52,7 +52,7 @@ HANDLE child = INVALID_HANDLE_VALUE; | |||
52 | static void kill_child(void) | 52 | static void kill_child(void) |
53 | { | 53 | { |
54 | if (child != INVALID_HANDLE_VALUE) { | 54 | if (child != INVALID_HANDLE_VALUE) { |
55 | kill_SIGTERM_by_handle(child, 128+SIGTERM); | 55 | kill_SIGTERM_by_handle(child); |
56 | } | 56 | } |
57 | } | 57 | } |
58 | #endif | 58 | #endif |
diff --git a/include/mingw.h b/include/mingw.h index c75b06330..a67b161c7 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
@@ -502,7 +502,7 @@ int mingw_execve(const char *cmd, char *const *argv, char *const *envp); | |||
502 | #define has_dos_drive_prefix(path) (isalpha(*(path)) && (path)[1] == ':') | 502 | #define has_dos_drive_prefix(path) (isalpha(*(path)) && (path)[1] == ':') |
503 | #define is_absolute_path(path) ((path)[0] == '/' || (path)[0] == '\\' || has_dos_drive_prefix(path)) | 503 | #define is_absolute_path(path) ((path)[0] == '/' || (path)[0] == '\\' || has_dos_drive_prefix(path)) |
504 | 504 | ||
505 | int kill_SIGTERM_by_handle(HANDLE process, int exit_code); | 505 | int kill_SIGTERM_by_handle(HANDLE process); |
506 | 506 | ||
507 | #define find_mount_point(n, s) find_mount_point(n) | 507 | #define find_mount_point(n, s) find_mount_point(n) |
508 | 508 | ||
diff --git a/win32/process.c b/win32/process.c index 6224ce362..ac63a9c58 100644 --- a/win32/process.c +++ b/win32/process.c | |||
@@ -624,9 +624,9 @@ void FAST_FUNC read_cmdline(char *buf, int col, unsigned pid, const char *comm) | |||
624 | * of the indicated process. Zero indicates the current process; negative | 624 | * of the indicated process. Zero indicates the current process; negative |
625 | * indicates the process with process ID -pid. | 625 | * indicates the process with process ID -pid. |
626 | */ | 626 | */ |
627 | typedef int (*kill_callback)(pid_t pid, int exit_code); | 627 | typedef int (*kill_callback)(pid_t pid, int sig); |
628 | 628 | ||
629 | static int kill_pids(pid_t pid, int exit_code, kill_callback killer) | 629 | static int kill_pids(pid_t pid, int sig, kill_callback killer) |
630 | { | 630 | { |
631 | DWORD pids[16384]; | 631 | DWORD pids[16384]; |
632 | int max_len = sizeof(pids) / sizeof(*pids), i, len, ret = 0; | 632 | int max_len = sizeof(pids) / sizeof(*pids), i, len, ret = 0; |
@@ -684,7 +684,7 @@ static int kill_pids(pid_t pid, int exit_code, kill_callback killer) | |||
684 | 684 | ||
685 | for (i = len - 1; i >= 0; i--) { | 685 | for (i = len - 1; i >= 0; i--) { |
686 | SetLastError(0); | 686 | SetLastError(0); |
687 | if (killer(pids[i], exit_code)) { | 687 | if (killer(pids[i], sig)) { |
688 | errno = err_win_to_posix(); | 688 | errno = err_win_to_posix(); |
689 | ret = -1; | 689 | ret = -1; |
690 | } | 690 | } |
@@ -725,14 +725,14 @@ static inline int process_architecture_matches_current(HANDLE process) | |||
725 | * http://www.drdobbs.com/a-safer-alternative-to-terminateprocess/184416547 | 725 | * http://www.drdobbs.com/a-safer-alternative-to-terminateprocess/184416547 |
726 | * | 726 | * |
727 | */ | 727 | */ |
728 | int kill_SIGTERM_by_handle(HANDLE process, int exit_code) | 728 | int kill_SIGTERM_by_handle(HANDLE process) |
729 | { | 729 | { |
730 | DWORD code; | 730 | DWORD code; |
731 | int ret = 0; | 731 | int ret = 0; |
732 | 732 | ||
733 | if (GetExitCodeProcess(process, &code) && code == STILL_ACTIVE) { | 733 | if (GetExitCodeProcess(process, &code) && code == STILL_ACTIVE) { |
734 | DECLARE_PROC_ADDR(DWORD, ExitProcess, LPVOID); | 734 | DECLARE_PROC_ADDR(DWORD, ExitProcess, LPVOID); |
735 | PVOID arg = (PVOID)(intptr_t)exit_code; | 735 | PVOID arg = (PVOID)(intptr_t)(128 + SIGTERM); |
736 | DWORD thread_id; | 736 | DWORD thread_id; |
737 | HANDLE thread; | 737 | HANDLE thread; |
738 | 738 | ||
@@ -754,7 +754,7 @@ int kill_SIGTERM_by_handle(HANDLE process, int exit_code) | |||
754 | return ret; | 754 | return ret; |
755 | } | 755 | } |
756 | 756 | ||
757 | static int kill_SIGTERM(pid_t pid, int exit_code) | 757 | static int kill_SIGTERM(pid_t pid, int sig UNUSED_PARAM) |
758 | { | 758 | { |
759 | HANDLE process; | 759 | HANDLE process; |
760 | 760 | ||
@@ -765,52 +765,38 @@ static int kill_SIGTERM(pid_t pid, int exit_code) | |||
765 | return -1; | 765 | return -1; |
766 | } | 766 | } |
767 | 767 | ||
768 | return kill_SIGTERM_by_handle(process, exit_code); | 768 | return kill_SIGTERM_by_handle(process); |
769 | } | 769 | } |
770 | 770 | ||
771 | /* | 771 | /* |
772 | * This way of terminating processes is not gentle: they get no chance to | 772 | * This way of terminating processes is not gentle: they get no chance to |
773 | * clean up after themselves (closing file handles, removing .lock files, | 773 | * clean up after themselves (closing file handles, removing .lock files, |
774 | * terminating spawned processes (if any), etc). | 774 | * terminating spawned processes (if any), etc). |
775 | * | ||
776 | * If the signal isn't SIGKILL just check if the target process exists. | ||
775 | */ | 777 | */ |
776 | static int kill_SIGKILL(pid_t pid, int exit_code) | 778 | static int kill_SIGKILL(pid_t pid, int sig) |
777 | { | 779 | { |
778 | HANDLE process; | 780 | HANDLE process; |
779 | int ret; | 781 | int ret = 0; |
780 | 782 | ||
781 | if (!(process=OpenProcess(PROCESS_TERMINATE, FALSE, pid))) { | 783 | if (!(process=OpenProcess(PROCESS_TERMINATE, FALSE, pid))) { |
782 | return -1; | 784 | return -1; |
783 | } | 785 | } |
784 | 786 | ||
785 | ret = !TerminateProcess(process, exit_code); | 787 | if (sig == SIGKILL) |
788 | ret = !TerminateProcess(process, 128 + SIGKILL); | ||
786 | CloseHandle(process); | 789 | CloseHandle(process); |
787 | 790 | ||
788 | return ret; | 791 | return ret; |
789 | } | 792 | } |
790 | 793 | ||
791 | static int kill_SIGTEST(pid_t pid, int exit_code UNUSED_PARAM) | ||
792 | { | ||
793 | HANDLE process; | ||
794 | |||
795 | if (!(process=OpenProcess(PROCESS_TERMINATE, FALSE, pid))) { | ||
796 | return -1; | ||
797 | } | ||
798 | |||
799 | CloseHandle(process); | ||
800 | return 0; | ||
801 | } | ||
802 | |||
803 | int kill(pid_t pid, int sig) | 794 | int kill(pid_t pid, int sig) |
804 | { | 795 | { |
805 | if (sig == SIGTERM) { | 796 | if (sig == SIGTERM) |
806 | return kill_pids(pid, 128+sig, kill_SIGTERM); | 797 | return kill_pids(pid, sig, kill_SIGTERM); |
807 | } | 798 | else if (sig == SIGKILL || sig == 0) |
808 | else if (sig == SIGKILL) { | 799 | return kill_pids(pid, sig, kill_SIGKILL); |
809 | return kill_pids(pid, 128+sig, kill_SIGKILL); | ||
810 | } | ||
811 | else if (sig == 0) { | ||
812 | return kill_pids(pid, 128+sig, kill_SIGTEST); | ||
813 | } | ||
814 | 800 | ||
815 | errno = EINVAL; | 801 | errno = EINVAL; |
816 | return -1; | 802 | return -1; |