aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2025-11-23 10:05:39 +0000
committerRon Yorston <rmy@pobox.com>2025-11-23 10:05:39 +0000
commit42c3b212d9f9fe964401ed45b1cfd4b67066fb80 (patch)
tree19659110ea526aab81af21a3684af86e9ec91508 /shell
parent18ad143f86ded661ae4d2bef0e3a36490e786963 (diff)
downloadbusybox-w32-master.tar.gz
busybox-w32-master.tar.bz2
busybox-w32-master.zip
ash: allow ctrl-c to interrupt read in minttyHEADmaster
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.c39
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