Applied, thank you.

On Tue, Jul 1, 2025 at 10:47 AM Ron Yorston <[email protected]> wrote:
>
> Make the read built-in more compatible with bash:
>
> - Return an exit code of 142 on timeout.
>
> - When the timeout expires before a newline is detected in the
>   input bash captures the partial input.  This behaviour is new
>   since bash version 4.4.  BusyBox shells had the pre-4.4 behaviour
>   where the input was lost.
>
> Update the tests to suit and fix a couple of compiler errors in
> the testsuite.
>
> function                                             old     new   delta
> builtin_read                                         154     174     +20
> readcmd                                              213     228     +15
> shell_builtin_read                                  1364    1370      +6
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 3/0 up/down: 41/0)               Total: 41 bytes
>
> v2: Check for errors other than EINTR.  Thanks to Harald van Dijk
>     for pointing out my misplaced faith in comments.
>
> Signed-off-by: Ron Yorston <[email protected]>
> ---
>  shell/ash.c                          |  3 +++
>  shell/ash_test/ash-read/read_t.right |  8 ++++----
>  shell/ash_test/ash-read/read_t.tests | 18 +++++++++---------
>  shell/ash_test/printenv.c            |  4 +---
>  shell/ash_test/recho.c               |  2 +-
>  shell/hush.c                         |  3 +++
>  shell/shell_common.c                 | 10 +++++++---
>  7 files changed, 28 insertions(+), 20 deletions(-)
>
> diff --git a/shell/ash.c b/shell/ash.c
> index 9173b8608..60b782e41 100644
> --- a/shell/ash.c
> +++ b/shell/ash.c
> @@ -14395,6 +14395,9 @@ readcmd(int argc UNUSED_PARAM, char **argv 
> UNUSED_PARAM)
>                         goto again;
>         }
>
> +       if ((uintptr_t)r == 2)
> +               return 128 + SIGALRM;
> +
>         if ((uintptr_t)r > 1)
>                 ash_msg_and_raise_error(r);
>
> 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 @@
> -><
> -><
> ->test<
> ->test<
> +>te:142<
> +>:142<
> +>test:0<
> +>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 @@
> -# bash 3.2 outputs:
> +# bash 5.2 outputs:
>
> -# ><
> -{ echo -n 'te'; sleep 2; echo 'st'; }   | (read -t 1 reply; echo ">$reply<")
> -# ><
> -{               sleep 2; echo 'test'; } | (read -t 1 reply; echo ">$reply<")
> -# >test<
> -{ echo -n 'te'; sleep 1; echo 'st'; }   | (read -t 2 reply; echo ">$reply<")
> -# >test<
> -{               sleep 1; echo 'test'; } | (read -t 2 reply; echo ">$reply<")
> +# >te:142<
> +{ echo -n 'te'; sleep 2; echo 'st'; }   | (read -t 1 reply; echo 
> ">$reply:$?<")
> +# >:142<
> +{               sleep 2; echo 'test'; } | (read -t 1 reply; echo 
> ">$reply:$?<")
> +# >test:0<
> +{ echo -n 'te'; sleep 1; echo 'st'; }   | (read -t 2 reply; echo 
> ">$reply:$?<")
> +# >test:0<
> +{               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 @@
>  extern char **environ;
>
>  int
> -main (argc, argv)
> -     int argc;
> -     char **argv;
> +main (int argc, char **argv)
>  {
>    register char **envp, *eval;
>    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 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>
> -void strprint();
> +void strprint(char *);
>
>  int main(int argc, char **argv)
>  {
> diff --git a/shell/hush.c b/shell/hush.c
> index 4a97293cc..9f94bfdec 100644
> --- a/shell/hush.c
> +++ b/shell/hush.c
> @@ -11175,6 +11175,9 @@ static int FAST_FUNC builtin_read(char **argv)
>                         goto again;
>         }
>
> +       if ((uintptr_t)r == 2)
> +               return 128 + SIGALRM;
> +
>         if ((uintptr_t)r > 1) {
>                 bb_simple_error_msg(r);
>                 r = (char*)(uintptr_t)1;
> 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)
>                          * 32-bit unix time wrapped (year 2038+).
>                          */
>                         if (timeout <= 0) { /* already late? */
> -                               retval = (const char *)(uintptr_t)1;
> -                               goto ret;
> +                               retval = (const char *)(uintptr_t)2;
> +                               break;
>                         }
>                 }
>
> @@ -217,8 +217,12 @@ shell_builtin_read(struct builtin_read_params *params)
>                 pfd[0].events = POLLIN;
>  //TODO race with a signal arriving just before the poll!
>                 if (poll(pfd, 1, timeout) <= 0) {
> -                       /* timed out, or EINTR */
> +                       /* timed out, or some error */
>                         err = errno;
> +                       if (!err) {
> +                               retval = (const char *)(uintptr_t)2;
> +                               break;
> +                       }
>                         retval = (const char *)(uintptr_t)1;
>                         goto ret;
>                 }
> --
> 2.50.0
>
> _______________________________________________
> busybox mailing list
> [email protected]
> https://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
[email protected]
https://lists.busybox.net/mailman/listinfo/busybox

Reply via email to