diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-08-09 13:52:36 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-08-09 13:52:36 +0200 |
commit | 1f41c885fcafc67c9e957b74ab9d223e09ff949a (patch) | |
tree | 4fc87e316812afabb48a72fee3ce8edaba1c9986 /shell/hush.c | |
parent | 3bef5d89b0c667e9fb7d1d9b44ba9b30d4d084e4 (diff) | |
download | busybox-w32-1f41c885fcafc67c9e957b74ab9d223e09ff949a.tar.gz busybox-w32-1f41c885fcafc67c9e957b74ab9d223e09ff949a.tar.bz2 busybox-w32-1f41c885fcafc67c9e957b74ab9d223e09ff949a.zip |
hush: implement -d DELIM option for 'read'
The POSIX standard only requires the 'read' builtin to handle '-r':
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html
However, Bash introduced the option '-d <DELIM>' to override IFS for
just one invocation, and it is quite useful.
We already support this in ash, let's add it to hush, too.
function old new delta
builtin_read 263 284 +21
.rodata 163587 163589 +2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 23/0) Total: 23 bytes
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/shell/hush.c b/shell/hush.c index 8dc531657..af3b95b86 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -352,6 +352,7 @@ | |||
352 | #define BASH_SOURCE ENABLE_HUSH_BASH_COMPAT | 352 | #define BASH_SOURCE ENABLE_HUSH_BASH_COMPAT |
353 | #define BASH_HOSTNAME_VAR ENABLE_HUSH_BASH_COMPAT | 353 | #define BASH_HOSTNAME_VAR ENABLE_HUSH_BASH_COMPAT |
354 | #define BASH_TEST2 (ENABLE_HUSH_BASH_COMPAT && ENABLE_HUSH_TEST) | 354 | #define BASH_TEST2 (ENABLE_HUSH_BASH_COMPAT && ENABLE_HUSH_TEST) |
355 | #define BASH_READ_D ENABLE_HUSH_BASH_COMPAT | ||
355 | 356 | ||
356 | 357 | ||
357 | /* Build knobs */ | 358 | /* Build knobs */ |
@@ -9434,13 +9435,20 @@ static int FAST_FUNC builtin_read(char **argv) | |||
9434 | char *opt_p = NULL; | 9435 | char *opt_p = NULL; |
9435 | char *opt_t = NULL; | 9436 | char *opt_t = NULL; |
9436 | char *opt_u = NULL; | 9437 | char *opt_u = NULL; |
9438 | char *opt_d = NULL; /* optimized out if !BASH */ | ||
9437 | const char *ifs; | 9439 | const char *ifs; |
9438 | int read_flags; | 9440 | int read_flags; |
9439 | 9441 | ||
9440 | /* "!": do not abort on errors. | 9442 | /* "!": do not abort on errors. |
9441 | * Option string must start with "sr" to match BUILTIN_READ_xxx | 9443 | * Option string must start with "sr" to match BUILTIN_READ_xxx |
9442 | */ | 9444 | */ |
9443 | read_flags = getopt32(argv, "!srn:p:t:u:", &opt_n, &opt_p, &opt_t, &opt_u); | 9445 | read_flags = getopt32(argv, |
9446 | #if BASH_READ_D | ||
9447 | "!srn:p:t:u:d:", &opt_n, &opt_p, &opt_t, &opt_u, &opt_d | ||
9448 | #else | ||
9449 | "!srn:p:t:u:", &opt_n, &opt_p, &opt_t, &opt_u | ||
9450 | #endif | ||
9451 | ); | ||
9444 | if (read_flags == (uint32_t)-1) | 9452 | if (read_flags == (uint32_t)-1) |
9445 | return EXIT_FAILURE; | 9453 | return EXIT_FAILURE; |
9446 | argv += optind; | 9454 | argv += optind; |
@@ -9454,7 +9462,8 @@ static int FAST_FUNC builtin_read(char **argv) | |||
9454 | opt_n, | 9462 | opt_n, |
9455 | opt_p, | 9463 | opt_p, |
9456 | opt_t, | 9464 | opt_t, |
9457 | opt_u | 9465 | opt_u, |
9466 | opt_d | ||
9458 | ); | 9467 | ); |
9459 | 9468 | ||
9460 | if ((uintptr_t)r == 1 && errno == EINTR) { | 9469 | if ((uintptr_t)r == 1 && errno == EINTR) { |