diff options
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/shell/hush.c b/shell/hush.c index 4c8814a01..3c19bceaa 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -10500,40 +10500,29 @@ static int FAST_FUNC builtin_type(char **argv) static int FAST_FUNC builtin_read(char **argv) { const char *r; - char *opt_n = NULL; - char *opt_p = NULL; - char *opt_t = NULL; - char *opt_u = NULL; - char *opt_d = NULL; /* optimized out if !BASH */ - const char *ifs; - int read_flags; + struct builtin_read_params params; + + memset(¶ms, 0, sizeof(params)); /* "!": do not abort on errors. * Option string must start with "sr" to match BUILTIN_READ_xxx */ - read_flags = getopt32(argv, + params.read_flags = getopt32(argv, #if BASH_READ_D - "!srn:p:t:u:d:", &opt_n, &opt_p, &opt_t, &opt_u, &opt_d + "!srn:p:t:u:d:", ¶ms.opt_n, ¶ms.opt_p, ¶ms.opt_t, ¶ms.opt_u, ¶ms.opt_d #else - "!srn:p:t:u:", &opt_n, &opt_p, &opt_t, &opt_u + "!srn:p:t:u:", ¶ms.opt_n, ¶ms.opt_p, ¶ms.opt_t, ¶ms.opt_u #endif ); - if (read_flags == (uint32_t)-1) + if ((uint32_t)params.read_flags == (uint32_t)-1) return EXIT_FAILURE; argv += optind; - ifs = get_local_var_value("IFS"); /* can be NULL */ + params.argv = argv; + params.setvar = set_local_var_from_halves; + params.ifs = get_local_var_value("IFS"); /* can be NULL */ again: - r = shell_builtin_read(set_local_var_from_halves, - argv, - ifs, - read_flags, - opt_n, - opt_p, - opt_t, - opt_u, - opt_d - ); + r = shell_builtin_read(¶ms); if ((uintptr_t)r == 1 && errno == EINTR) { unsigned sig = check_and_run_traps(); |