diff options
| author | Ron Yorston <rmy@pobox.com> | 2023-05-23 10:57:56 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2023-05-23 10:57:56 +0100 |
| commit | c2eb45989fcd59617884dc853743b5cc94b15935 (patch) | |
| tree | 6a74f1a55758e74d77fb8ec705a930a4f2010c4e /miscutils | |
| parent | 20b6a57af64506a4152b145b031aad2946a37ca8 (diff) | |
| download | busybox-w32-c2eb45989fcd59617884dc853743b5cc94b15935.tar.gz busybox-w32-c2eb45989fcd59617884dc853743b5cc94b15935.tar.bz2 busybox-w32-c2eb45989fcd59617884dc853743b5cc94b15935.zip | |
drop: changes to ctrl-c handling
Use the new kill_child_ctrl_handler() function:
- Ctrl-C can be used to terminate non-console applications.
- Ctrl-C in an interactive cmd.exe or PowerShell session won't
cause drop to terminate.
Also:
- Use getopt32() to process options.
- Update usage messages.
Adds 96-160 bytes.
Diffstat (limited to 'miscutils')
| -rw-r--r-- | miscutils/drop.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/miscutils/drop.c b/miscutils/drop.c index 342de41d6..6b8e0f183 100644 --- a/miscutils/drop.c +++ b/miscutils/drop.c | |||
| @@ -36,21 +36,21 @@ | |||
| 36 | //kbuild:lib-$(CONFIG_PDROP) += drop.o | 36 | //kbuild:lib-$(CONFIG_PDROP) += drop.o |
| 37 | 37 | ||
| 38 | //usage:#define drop_trivial_usage | 38 | //usage:#define drop_trivial_usage |
| 39 | //usage: "[COMMAND | -c [ARG...]]" | 39 | //usage: "[COMMAND [ARG...] | -c CMD_STRING [ARG...]]" |
| 40 | //usage:#define drop_full_usage "\n\n" | 40 | //usage:#define drop_full_usage "\n\n" |
| 41 | //usage: "Drop elevated privileges and run a command. If no COMMAND\n" | 41 | //usage: "Drop elevated privileges and run a command. If no command\n" |
| 42 | //usage: "is provided run the BusyBox shell.\n" | 42 | //usage: "is provided run the BusyBox shell.\n" |
| 43 | 43 | ||
| 44 | //usage:#define cdrop_trivial_usage | 44 | //usage:#define cdrop_trivial_usage |
| 45 | //usage: "[COMMAND | /c [ARG...]]" | 45 | //usage: "[COMMAND [ARG...] | -c CMD_STRING [ARG...]]" |
| 46 | //usage:#define cdrop_full_usage "\n\n" | 46 | //usage:#define cdrop_full_usage "\n\n" |
| 47 | //usage: "Drop elevated privileges and run a command. If no COMMAND\n" | 47 | //usage: "Drop elevated privileges and run a command. If no command\n" |
| 48 | //usage: "is provided run cmd.exe.\n" | 48 | //usage: "is provided run cmd.exe.\n" |
| 49 | 49 | ||
| 50 | //usage:#define pdrop_trivial_usage | 50 | //usage:#define pdrop_trivial_usage |
| 51 | //usage: "[COMMAND | -c [ARG...]]" | 51 | //usage: "[COMMAND [ARG...] | -c CMD_STRING [ARG...]]" |
| 52 | //usage:#define pdrop_full_usage "\n\n" | 52 | //usage:#define pdrop_full_usage "\n\n" |
| 53 | //usage: "Drop elevated privileges and run a command. If no COMMAND\n" | 53 | //usage: "Drop elevated privileges and run a command. If no command\n" |
| 54 | //usage: "is provided run PowerShell.\n" | 54 | //usage: "is provided run PowerShell.\n" |
| 55 | 55 | ||
| 56 | #include "libbb.h" | 56 | #include "libbb.h" |
| @@ -108,12 +108,16 @@ int drop_main(int argc, char **argv) | |||
| 108 | TIL.Label.Attributes = SE_GROUP_INTEGRITY; | 108 | TIL.Label.Attributes = SE_GROUP_INTEGRITY; |
| 109 | if (SetTokenInformation(token, TokenIntegrityLevel, &TIL, | 109 | if (SetTokenInformation(token, TokenIntegrityLevel, &TIL, |
| 110 | sizeof(TOKEN_MANDATORY_LABEL))) { | 110 | sizeof(TOKEN_MANDATORY_LABEL))) { |
| 111 | char **a = argv + 1; | 111 | char *opt_command = NULL; |
| 112 | const char *arg; | 112 | char **a; |
| 113 | char *exe, *cmd; | 113 | const char *opt, *arg; |
| 114 | char *exe, *cmd, *q; | ||
| 114 | 115 | ||
| 115 | if (argc == 1 || strcmp(argv[1], "-c") == 0 | 116 | getopt32(argv, "c:", &opt_command); |
| 116 | IF_CDROP(|| strcmp(argv[1], "/c") == 0)) { | 117 | a = argv + optind; |
| 118 | opt = "-c"; | ||
| 119 | |||
| 120 | if (argc == 1 || opt_command) { | ||
| 117 | switch (*applet_name) { | 121 | switch (*applet_name) { |
| 118 | #if ENABLE_PDROP | 122 | #if ENABLE_PDROP |
| 119 | case 'p': | 123 | case 'p': |
| @@ -123,6 +127,7 @@ int drop_main(int argc, char **argv) | |||
| 123 | #endif | 127 | #endif |
| 124 | #if ENABLE_CDROP | 128 | #if ENABLE_CDROP |
| 125 | case 'c': | 129 | case 'c': |
| 130 | opt = "/c"; | ||
| 126 | arg = "cmd.exe"; | 131 | arg = "cmd.exe"; |
| 127 | exe = find_first_executable(arg); | 132 | exe = find_first_executable(arg); |
| 128 | break; | 133 | break; |
| @@ -161,10 +166,16 @@ int drop_main(int argc, char **argv) | |||
| 161 | 166 | ||
| 162 | slash_to_bs(exe); | 167 | slash_to_bs(exe); |
| 163 | cmd = quote_arg(arg); | 168 | cmd = quote_arg(arg); |
| 169 | if (opt_command) { | ||
| 170 | cmd = xappendword(cmd, opt); | ||
| 171 | q = quote_arg(opt_command); | ||
| 172 | cmd = xappendword(cmd, q); | ||
| 173 | free(q); | ||
| 174 | } | ||
| 164 | 175 | ||
| 165 | // Build the command line | 176 | // Build the command line |
| 166 | while (*a) { | 177 | while (*a) { |
| 167 | char *q = quote_arg(*a++); | 178 | q = quote_arg(*a++); |
| 168 | cmd = xappendword(cmd, q); | 179 | cmd = xappendword(cmd, q); |
| 169 | free(q); | 180 | free(q); |
| 170 | } | 181 | } |
| @@ -186,6 +197,8 @@ int drop_main(int argc, char **argv) | |||
| 186 | bb_error_msg_and_die("can't execute '%s'", exe); | 197 | bb_error_msg_and_die("can't execute '%s'", exe); |
| 187 | } | 198 | } |
| 188 | 199 | ||
| 200 | kill_child_ctrl_handler(pi.dwProcessId); | ||
| 201 | SetConsoleCtrlHandler(kill_child_ctrl_handler, TRUE); | ||
| 189 | WaitForSingleObject(pi.hProcess, INFINITE); | 202 | WaitForSingleObject(pi.hProcess, INFINITE); |
| 190 | if (GetExitCodeProcess(pi.hProcess, &code)) { | 203 | if (GetExitCodeProcess(pi.hProcess, &code)) { |
| 191 | return (int)code; | 204 | return (int)code; |
