klibc, klibc-utils-static: add some read options to dash
authorThomas Kunze <thommycheck@gmx.de>
Fri, 4 Apr 2008 20:30:47 +0000 (20:30 +0000)
committerThomas Kunze <thommycheck@gmx.de>
Fri, 4 Apr 2008 20:30:47 +0000 (20:30 +0000)
packages/klibc/files/dash_readopt.patch [new file with mode: 0644]
packages/klibc/klibc-common.inc
packages/klibc/klibc-utils-static_1.5.bb
packages/klibc/klibc_1.5.bb

diff --git a/packages/klibc/files/dash_readopt.patch b/packages/klibc/files/dash_readopt.patch
new file mode 100644 (file)
index 0000000..49bc087
--- /dev/null
@@ -0,0 +1,105 @@
+Index: klibc-1.5/usr/dash/miscbltin.c
+===================================================================
+--- klibc-1.5.orig/usr/dash/miscbltin.c        2008-03-27 20:38:09.354564817 +0100
++++ klibc-1.5/usr/dash/miscbltin.c     2008-04-04 18:05:32.063364195 +0200
+@@ -46,6 +46,7 @@
+ #include <ctype.h>
+ #include <stdint.h>
+ #include <time.h>             /* strtotimeval() */
++#include <termios.h>
+ #include "shell.h"
+ #include "options.h"
+@@ -83,6 +84,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;
+@@ -90,11 +96,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))
+@@ -118,6 +131,23 @@
+               sh_error("arg count");
+       if ((ifs = bltinlookup("IFS")) == NULL)
+               ifs = defifs;
++      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;
+       startword = 1;
+       backslash = 0;
+@@ -133,13 +163,15 @@
+               ts.tv_sec += t0.tv_sec;
+       }
+       STARTSTACKSTR(p);
+-      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! */
+                       }
+@@ -156,6 +188,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! */
+                       }
+               }
+@@ -191,7 +225,9 @@
+ put:
+                       STPUTC(c, p);
+               }
+-      }
++      } while (!n_flag || --nchars);
++      if (n_flag || silent)
++              tcsetattr(0, TCSANOW, &old_tty);
+       STACKSTRNUL(p);
+       /* Remove trailing blanks */
+       while ((char *)stackblock() <= --p && strchr(ifs, *p) != NULL)
index 41859d3..5e890b3 100644 (file)
@@ -8,6 +8,7 @@ SRC_URI = "${KERNELORG_MIRROR}/pub/linux/libs/klibc/Stable/klibc-${PV}.tar.bz2 \
           file://fstype-sane-vfat-and-jffs2-for-1.5.patch;patch=1 \
           file://modprobe.patch;patch=1 \
           file://losetup.patch;patch=1 \
+          file://dash_readopt.patch;patch=1 \
           "
 S = "${WORKDIR}/klibc-${PV}"
 PACKAGE_ARCH = "${MACHINE_ARCH}"
index c6f5448..f0429e3 100644 (file)
@@ -1,6 +1,6 @@
 require klibc-common.inc
 
-PR = "r8"
+PR = "r9"
 
 # We only want the static utils. klibc build both. So we install only what we want.                            
 do_install() {
index 925dcd0..967f88f 100644 (file)
@@ -1,2 +1,2 @@
 require klibc.inc
-PR = "r6"
+PR = "r7"