diff options
Diffstat (limited to 'recipes/klibc/klibc-1.5.23/dash_readopt.patch')
-rw-r--r-- | recipes/klibc/klibc-1.5.23/dash_readopt.patch | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/recipes/klibc/klibc-1.5.23/dash_readopt.patch b/recipes/klibc/klibc-1.5.23/dash_readopt.patch new file mode 100644 index 0000000000..3be1be04fb --- /dev/null +++ b/recipes/klibc/klibc-1.5.23/dash_readopt.patch @@ -0,0 +1,111 @@ +Patch was imported from the OpenEmbedded git server +(git://git.openembedded.org/openembedded) +as of commit id ad67a97e8fbfb03a68088a6ca6ad87b086c88094 +Signed-off-by: Thomas Kunze <thommycheck@gmx.de> +Minor adjustments tracking upstream changes +Signed-off-by: Andrea Adami <andrea.adami@gmail.com> + +diff -uNr klibc-1.5.22.orig//usr/dash/miscbltin.c klibc-1.5.22/usr/dash/miscbltin.c +--- klibc-1.5.22.orig//usr/dash/miscbltin.c 2011-06-11 02:08:49.000000000 +0200 ++++ klibc-1.5.22/usr/dash/miscbltin.c 2011-06-11 13:55:32.000000000 +0200 +@@ -46,6 +46,7 @@ + #include <ctype.h> + #include <inttypes.h> + #include <time.h> /* strtotimeval() */ ++#include <termios.h> + + #include "shell.h" + #include "options.h" +@@ -149,6 +150,11 @@ + int timeout; + int i; + fd_set set; ++ int n_flag = 0; ++ unsigned int nchars = 0; ++ int silent = 0; ++ struct termios tty, old_tty; ++ + struct timeval ts, t0, t1, to; + + ts.tv_sec = ts.tv_usec = 0; +@@ -156,11 +162,18 @@ + rflag = 0; + timeout = 0; + prompt = NULL; +- while ((i = nextopt("p:rt:")) != '\0') { ++ while ((i = nextopt("p:rt:n:s")) != '\0') { + switch(i) { + case 'p': + prompt = optionarg; + break; ++ case 'n': ++ nchars = strtoul(optionarg, NULL, 10); ++ n_flag = nchars; /* just a flag "nchars is nonzero" */ ++ break; ++ case 's': ++ silent = 1; ++ break; + case 't': + p = strtotimeval(optionarg, &ts); + if (*p || (!ts.tv_sec && !ts.tv_usec)) +@@ -182,6 +197,24 @@ + } + if (*(ap = argptr) == NULL) + sh_error("arg count"); ++ if (n_flag || silent) { ++ if (tcgetattr(0, &tty) != 0) { ++ /* Not a tty */ ++ n_flag = 0; ++ silent = 0; ++ } else { ++ old_tty = tty; ++ if (n_flag) { ++ tty.c_lflag &= ~ICANON; ++ tty.c_cc[VMIN] = nchars < 256 ? nchars : 255; ++ } ++ if (silent) { ++ tty.c_lflag &= ~(ECHO | ECHOK | ECHONL); ++ } ++ tcsetattr(0, TCSANOW, &tty); ++ } ++ } ++ + + status = 0; + if (timeout) { +@@ -200,12 +231,14 @@ + goto start; + +- for (;;) { ++ do { + if (timeout) { + gettimeofday(&t1, NULL); + if (t1.tv_sec > ts.tv_sec || + (t1.tv_sec == ts.tv_sec && + t1.tv_usec >= ts.tv_usec)) { + status = 1; ++ if (n_flag) ++ tcsetattr(0, TCSANOW, &old_tty); + break; /* Timeout! */ + } + +@@ -222,6 +255,8 @@ + FD_SET(0, &set); + if (select(1, &set, NULL, NULL, &to) != 1) { + status = 1; ++ if (n_flag) ++ tcsetattr(0, TCSANOW, &old_tty); + break; /* Timeout! */ + } + } +@@ -263,6 +298,9 @@ + newloc = startloc - 1; + } +- } ++ } while (!n_flag || --nchars); ++ if (n_flag || silent) ++ tcsetattr(0, TCSANOW, &old_tty); ++ + out: + recordregion(startloc, p - (char *)stackblock(), 0); + STACKSTRNUL(p); |