diff options
| author | Ron Yorston <rmy@pobox.com> | 2025-11-23 10:05:39 +0000 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2025-11-23 10:05:39 +0000 |
| commit | 42c3b212d9f9fe964401ed45b1cfd4b67066fb80 (patch) | |
| tree | 19659110ea526aab81af21a3684af86e9ec91508 /shell | |
| parent | 18ad143f86ded661ae4d2bef0e3a36490e786963 (diff) | |
| download | busybox-w32-master.tar.gz busybox-w32-master.tar.bz2 busybox-w32-master.zip | |
The command 'read -t 10' couldn't be interrupted by ctrl-c
when ash was running in the mintty terminal emulator.
This issue was introduced by commits 8e6991733 and b2901ce8e
which fixed other problems with the 'read' builtin.
Rearrange the code to avoid calling poll(2) in an interactive
shell on Windows.
(GitHub issue #547)
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/shell_common.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/shell/shell_common.c b/shell/shell_common.c index 657f0df8f..197f41658 100644 --- a/shell/shell_common.c +++ b/shell/shell_common.c | |||
| @@ -222,24 +222,6 @@ shell_builtin_read(struct builtin_read_params *params) | |||
| 222 | pfd->events = POLLIN; | 222 | pfd->events = POLLIN; |
| 223 | 223 | ||
| 224 | #if ENABLE_PLATFORM_MINGW32 | 224 | #if ENABLE_PLATFORM_MINGW32 |
| 225 | /* Don't poll if timeout is -1, it hurts performance. The | ||
| 226 | * caution above about interrupts isn't relevant on Windows | ||
| 227 | * where Ctrl-C causes an event, not a signal. | ||
| 228 | */ | ||
| 229 | if (timeout >= 0) | ||
| 230 | #endif | ||
| 231 | /* test bb_got_signal, then poll(), atomically wrt signals */ | ||
| 232 | if (check_got_signal_and_poll(pfd, timeout) <= 0) { | ||
| 233 | /* timed out, or some error */ | ||
| 234 | err = errno; | ||
| 235 | if (!err) { /* timed out */ | ||
| 236 | retval = (const char *)(uintptr_t)2; | ||
| 237 | break; | ||
| 238 | } | ||
| 239 | retval = (const char *)(uintptr_t)1; | ||
| 240 | goto ret; | ||
| 241 | } | ||
| 242 | #if ENABLE_PLATFORM_MINGW32 | ||
| 243 | if (isatty(fd)) { | 225 | if (isatty(fd)) { |
| 244 | int64_t key; | 226 | int64_t key; |
| 245 | 227 | ||
| @@ -272,13 +254,32 @@ shell_builtin_read(struct builtin_read_params *params) | |||
| 272 | /* echo input if not in silent mode */ | 254 | /* echo input if not in silent mode */ |
| 273 | console_write(buffer + bufpos, 1); | 255 | console_write(buffer + bufpos, 1); |
| 274 | } | 256 | } |
| 275 | } else | 257 | } else { |
| 258 | /* Don't poll if timeout is -1, it hurts performance. The | ||
| 259 | * caution above about interrupts isn't relevant on Windows | ||
| 260 | * where Ctrl-C causes an event, not a signal. | ||
| 261 | */ | ||
| 262 | if (timeout >= 0) | ||
| 276 | #endif | 263 | #endif |
| 264 | /* test bb_got_signal, then poll(), atomically wrt signals */ | ||
| 265 | if (check_got_signal_and_poll(pfd, timeout) <= 0) { | ||
| 266 | /* timed out, or some error */ | ||
| 267 | err = errno; | ||
| 268 | if (!err) { /* timed out */ | ||
| 269 | retval = (const char *)(uintptr_t)2; | ||
| 270 | break; | ||
| 271 | } | ||
| 272 | retval = (const char *)(uintptr_t)1; | ||
| 273 | goto ret; | ||
| 274 | } | ||
| 277 | if (read(fd, &buffer[bufpos], 1) != 1) { | 275 | if (read(fd, &buffer[bufpos], 1) != 1) { |
| 278 | err = errno; | 276 | err = errno; |
| 279 | retval = (const char *)(uintptr_t)1; | 277 | retval = (const char *)(uintptr_t)1; |
| 280 | break; | 278 | break; |
| 281 | } | 279 | } |
| 280 | #if ENABLE_PLATFORM_MINGW32 | ||
| 281 | } | ||
| 282 | #endif | ||
| 282 | 283 | ||
| 283 | c = buffer[bufpos]; | 284 | c = buffer[bufpos]; |
| 284 | #if ENABLE_PLATFORM_MINGW32 | 285 | #if ENABLE_PLATFORM_MINGW32 |
