aboutsummaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-08-09 13:52:36 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-08-09 13:52:36 +0200
commit1f41c885fcafc67c9e957b74ab9d223e09ff949a (patch)
tree4fc87e316812afabb48a72fee3ce8edaba1c9986 /shell/hush.c
parent3bef5d89b0c667e9fb7d1d9b44ba9b30d4d084e4 (diff)
downloadbusybox-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.c13
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) {