diff options
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 5 | ||||
| -rw-r--r-- | shell/ash_test/ash-read/read_ifs2.right | 9 | ||||
| -rwxr-xr-x | shell/ash_test/ash-read/read_ifs2.tests | 9 | ||||
| -rw-r--r-- | shell/ash_test/ash-read/read_t.right | 8 | ||||
| -rwxr-xr-x | shell/ash_test/ash-read/read_t.tests | 18 | ||||
| -rw-r--r-- | shell/ash_test/printenv.c | 4 | ||||
| -rw-r--r-- | shell/ash_test/recho.c | 2 | ||||
| -rw-r--r-- | shell/hush.c | 5 | ||||
| -rw-r--r-- | shell/hush_test/hush-read/read_t.right | 8 | ||||
| -rwxr-xr-x | shell/hush_test/hush-read/read_t.tests | 18 | ||||
| -rw-r--r-- | shell/shell_common.c | 10 |
11 files changed, 63 insertions, 33 deletions
diff --git a/shell/ash.c b/shell/ash.c index 9173b8608..92b1df5f8 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -14395,6 +14395,11 @@ readcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |||
| 14395 | goto again; | 14395 | goto again; |
| 14396 | } | 14396 | } |
| 14397 | 14397 | ||
| 14398 | if ((uintptr_t)r == 2) /* -t SEC timeout? */ | ||
| 14399 | /* bash: "The exit status is greater than 128 if the timeout is exceeded." */ | ||
| 14400 | /* The actual value observed with bash 5.2.15: */ | ||
| 14401 | return 128 + SIGALRM; | ||
| 14402 | |||
| 14398 | if ((uintptr_t)r > 1) | 14403 | if ((uintptr_t)r > 1) |
| 14399 | ash_msg_and_raise_error(r); | 14404 | ash_msg_and_raise_error(r); |
| 14400 | 14405 | ||
diff --git a/shell/ash_test/ash-read/read_ifs2.right b/shell/ash_test/ash-read/read_ifs2.right new file mode 100644 index 000000000..797137dae --- /dev/null +++ b/shell/ash_test/ash-read/read_ifs2.right | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | |X|Y:Z:| | ||
| 2 | |X|Y:Z| | ||
| 3 | |X|Y| | ||
| 4 | |X|Y| | ||
| 5 | |X|| | ||
| 6 | |X|| | ||
| 7 | ||| | ||
| 8 | Whitespace should be trimmed too: | ||
| 9 | |X|Y| | ||
diff --git a/shell/ash_test/ash-read/read_ifs2.tests b/shell/ash_test/ash-read/read_ifs2.tests new file mode 100755 index 000000000..f01a68978 --- /dev/null +++ b/shell/ash_test/ash-read/read_ifs2.tests | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | echo "X:Y:Z:" | (IFS=": " read x y; echo "|$x|$y|") | ||
| 2 | echo "X:Y:Z" | (IFS=": " read x y; echo "|$x|$y|") | ||
| 3 | echo "X:Y:" | (IFS=": " read x y; echo "|$x|$y|") | ||
| 4 | echo "X:Y" | (IFS=": " read x y; echo "|$x|$y|") | ||
| 5 | echo "X:" | (IFS=": " read x y; echo "|$x|$y|") | ||
| 6 | echo "X" | (IFS=": " read x y; echo "|$x|$y|") | ||
| 7 | echo "" | (IFS=": " read x y; echo "|$x|$y|") | ||
| 8 | echo Whitespace should be trimmed too: | ||
| 9 | echo "X:Y : " | (IFS=": " read x y; echo "|$x|$y|") | ||
diff --git a/shell/ash_test/ash-read/read_t.right b/shell/ash_test/ash-read/read_t.right index 04126cbe6..3eedae275 100644 --- a/shell/ash_test/ash-read/read_t.right +++ b/shell/ash_test/ash-read/read_t.right | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | >< | 1 | >te:142< |
| 2 | >< | 2 | >:142< |
| 3 | >test< | 3 | >test:0< |
| 4 | >test< | 4 | >test:0< |
diff --git a/shell/ash_test/ash-read/read_t.tests b/shell/ash_test/ash-read/read_t.tests index d65f1aeaa..9fbeec517 100755 --- a/shell/ash_test/ash-read/read_t.tests +++ b/shell/ash_test/ash-read/read_t.tests | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | # bash 3.2 outputs: | 1 | # bash 5.2 outputs: |
| 2 | 2 | ||
| 3 | # >< | 3 | # >te:142< |
| 4 | { echo -n 'te'; sleep 2; echo 'st'; } | (read -t 1 reply; echo ">$reply<") | 4 | { echo -n 'te'; sleep 2; echo 'st'; } | (read -t 1 reply; echo ">$reply:$?<") |
| 5 | # >< | 5 | # >:142< |
| 6 | { sleep 2; echo 'test'; } | (read -t 1 reply; echo ">$reply<") | 6 | { sleep 2; echo 'test'; } | (read -t 1 reply; echo ">$reply:$?<") |
| 7 | # >test< | 7 | # >test:0< |
| 8 | { echo -n 'te'; sleep 1; echo 'st'; } | (read -t 2 reply; echo ">$reply<") | 8 | { echo -n 'te'; sleep 1; echo 'st'; } | (read -t 2 reply; echo ">$reply:$?<") |
| 9 | # >test< | 9 | # >test:0< |
| 10 | { sleep 1; echo 'test'; } | (read -t 2 reply; echo ">$reply<") | 10 | { sleep 1; echo 'test'; } | (read -t 2 reply; echo ">$reply:$?<") |
diff --git a/shell/ash_test/printenv.c b/shell/ash_test/printenv.c index c86308d3b..f0f41984d 100644 --- a/shell/ash_test/printenv.c +++ b/shell/ash_test/printenv.c | |||
| @@ -31,9 +31,7 @@ | |||
| 31 | extern char **environ; | 31 | extern char **environ; |
| 32 | 32 | ||
| 33 | int | 33 | int |
| 34 | main (argc, argv) | 34 | main (int argc, char **argv) |
| 35 | int argc; | ||
| 36 | char **argv; | ||
| 37 | { | 35 | { |
| 38 | register char **envp, *eval; | 36 | register char **envp, *eval; |
| 39 | int len; | 37 | int len; |
diff --git a/shell/ash_test/recho.c b/shell/ash_test/recho.c index 42a5feafd..7e96b14cc 100644 --- a/shell/ash_test/recho.c +++ b/shell/ash_test/recho.c | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | #include <stdio.h> | 27 | #include <stdio.h> |
| 28 | #include <stdlib.h> | 28 | #include <stdlib.h> |
| 29 | 29 | ||
| 30 | void strprint(); | 30 | void strprint(char *); |
| 31 | 31 | ||
| 32 | int main(int argc, char **argv) | 32 | int main(int argc, char **argv) |
| 33 | { | 33 | { |
diff --git a/shell/hush.c b/shell/hush.c index 4a97293cc..37cfecc08 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
| @@ -11175,6 +11175,11 @@ static int FAST_FUNC builtin_read(char **argv) | |||
| 11175 | goto again; | 11175 | goto again; |
| 11176 | } | 11176 | } |
| 11177 | 11177 | ||
| 11178 | if ((uintptr_t)r == 2) /* -t SEC timeout? */ | ||
| 11179 | /* bash: "The exit status is greater than 128 if the timeout is exceeded." */ | ||
| 11180 | /* The actual value observed with bash 5.2.15: */ | ||
| 11181 | return 128 + SIGALRM; | ||
| 11182 | |||
| 11178 | if ((uintptr_t)r > 1) { | 11183 | if ((uintptr_t)r > 1) { |
| 11179 | bb_simple_error_msg(r); | 11184 | bb_simple_error_msg(r); |
| 11180 | r = (char*)(uintptr_t)1; | 11185 | r = (char*)(uintptr_t)1; |
diff --git a/shell/hush_test/hush-read/read_t.right b/shell/hush_test/hush-read/read_t.right index 04126cbe6..3eedae275 100644 --- a/shell/hush_test/hush-read/read_t.right +++ b/shell/hush_test/hush-read/read_t.right | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | >< | 1 | >te:142< |
| 2 | >< | 2 | >:142< |
| 3 | >test< | 3 | >test:0< |
| 4 | >test< | 4 | >test:0< |
diff --git a/shell/hush_test/hush-read/read_t.tests b/shell/hush_test/hush-read/read_t.tests index d65f1aeaa..9fbeec517 100755 --- a/shell/hush_test/hush-read/read_t.tests +++ b/shell/hush_test/hush-read/read_t.tests | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | # bash 3.2 outputs: | 1 | # bash 5.2 outputs: |
| 2 | 2 | ||
| 3 | # >< | 3 | # >te:142< |
| 4 | { echo -n 'te'; sleep 2; echo 'st'; } | (read -t 1 reply; echo ">$reply<") | 4 | { echo -n 'te'; sleep 2; echo 'st'; } | (read -t 1 reply; echo ">$reply:$?<") |
| 5 | # >< | 5 | # >:142< |
| 6 | { sleep 2; echo 'test'; } | (read -t 1 reply; echo ">$reply<") | 6 | { sleep 2; echo 'test'; } | (read -t 1 reply; echo ">$reply:$?<") |
| 7 | # >test< | 7 | # >test:0< |
| 8 | { echo -n 'te'; sleep 1; echo 'st'; } | (read -t 2 reply; echo ">$reply<") | 8 | { echo -n 'te'; sleep 1; echo 'st'; } | (read -t 2 reply; echo ">$reply:$?<") |
| 9 | # >test< | 9 | # >test:0< |
| 10 | { sleep 1; echo 'test'; } | (read -t 2 reply; echo ">$reply<") | 10 | { sleep 1; echo 'test'; } | (read -t 2 reply; echo ">$reply:$?<") |
diff --git a/shell/shell_common.c b/shell/shell_common.c index e5c2cefb3..9a03f7265 100644 --- a/shell/shell_common.c +++ b/shell/shell_common.c | |||
| @@ -204,8 +204,8 @@ shell_builtin_read(struct builtin_read_params *params) | |||
| 204 | * 32-bit unix time wrapped (year 2038+). | 204 | * 32-bit unix time wrapped (year 2038+). |
| 205 | */ | 205 | */ |
| 206 | if (timeout <= 0) { /* already late? */ | 206 | if (timeout <= 0) { /* already late? */ |
| 207 | retval = (const char *)(uintptr_t)1; | 207 | retval = (const char *)(uintptr_t)2; |
| 208 | goto ret; | 208 | break; |
| 209 | } | 209 | } |
| 210 | } | 210 | } |
| 211 | 211 | ||
| @@ -217,8 +217,12 @@ shell_builtin_read(struct builtin_read_params *params) | |||
| 217 | pfd[0].events = POLLIN; | 217 | pfd[0].events = POLLIN; |
| 218 | //TODO race with a signal arriving just before the poll! | 218 | //TODO race with a signal arriving just before the poll! |
| 219 | if (poll(pfd, 1, timeout) <= 0) { | 219 | if (poll(pfd, 1, timeout) <= 0) { |
| 220 | /* timed out, or EINTR */ | 220 | /* timed out, or some error */ |
| 221 | err = errno; | 221 | err = errno; |
| 222 | if (!err) { | ||
| 223 | retval = (const char *)(uintptr_t)2; | ||
| 224 | break; | ||
| 225 | } | ||
| 222 | retval = (const char *)(uintptr_t)1; | 226 | retval = (const char *)(uintptr_t)1; |
| 223 | goto ret; | 227 | goto ret; |
| 224 | } | 228 | } |
