Some info about what the command does. Allow the use of any file 
descriptor for the tty.

diff -urwN busybox-1.10.0.orig/shell/ash.c busybox-1.10.0/shell/ash.c
--- busybox-1.10.0.orig/shell/ash.c     2008-03-21 21:31:45.000000000 -0400
+++ busybox-1.10.0/shell/ash.c  2008-03-24 11:48:49.000000000 -0400
@@ -11672,8 +11672,14 @@
 #endif
 
 /*
- * The read builtin.  The -e option causes backslashes to escape the
- * following character.
+ * The read builtin. Options:
+ *             -r                      Cause backslashes to escape the 
following character.
+ *             -s                      Turn off echo on the terminal
+ *             -n NCHARS               Read until we get a specified number of 
characters, or
+ *                                     a newline, whichever comes first.
+ *             -p PROMPT               Display a prompt.
+ *             -t SECONDS              Allow user only a specified number of 
seconds to enter text.
+ *             -u FD                   Read from an alternate file descriptor.
  *
  * This uses unbuffered input, which may be avoidable in some cases.
  */
@@ -11690,6 +11696,7 @@
        int startword;
        int status;
        int i;
+       int fd = 0;
 #if ENABLE_ASH_READ_NCHARS
        int n_flag = 0;
        int nchars = 0;
@@ -11706,13 +11713,13 @@
        rflag = 0;
        prompt = NULL;
 #if ENABLE_ASH_READ_NCHARS && ENABLE_ASH_READ_TIMEOUT
-       while ((i = nextopt("p:rt:n:s")) != '\0')
+       while ((i = nextopt("p:u:rt:n:s")) != '\0')
 #elif ENABLE_ASH_READ_NCHARS
-       while ((i = nextopt("p:rn:s")) != '\0')
+       while ((i = nextopt("p:u:rn:s")) != '\0')
 #elif ENABLE_ASH_READ_TIMEOUT
-       while ((i = nextopt("p:rt:")) != '\0')
+       while ((i = nextopt("p:u:rt:")) != '\0')
 #else
-       while ((i = nextopt("p:r")) != '\0')
+       while ((i = nextopt("p:u:r")) != '\0')
 #endif
        {
                switch (i) {
@@ -11760,11 +11767,16 @@
                case 'r':
                        rflag = 1;
                        break;
+               case 'u':
+                       fd = strtol(optionarg, &p, 10);
+                       if (*p)
+                               ash_msg_and_raise_error("invalid file 
descriptor");
+                       break;
                default:
                        break;
                }
        }
-       if (prompt && isatty(0)) {
+       if (prompt && isatty(fd)) {
                out2str(prompt);
        }
        ap = argptr;
@@ -11775,7 +11787,7 @@
                ifs = defifs;
 #if ENABLE_ASH_READ_NCHARS
        if (n_flag || silent) {
-               if (tcgetattr(0, &tty) != 0) {
+               if (tcgetattr(fd, &tty) != 0) {
                        /* Not a tty */
                        n_flag = 0;
                        silent = 0;
@@ -11788,21 +11800,21 @@
                        if (silent) {
                                tty.c_lflag &= ~(ECHO | ECHOK | ECHONL);
                        }
-                       tcsetattr(0, TCSANOW, &tty);
+                       tcsetattr(fd, TCSANOW, &tty);
                }
        }
 #endif
 #if ENABLE_ASH_READ_TIMEOUT
        if (ts.tv_sec || ts.tv_usec) {
                FD_ZERO(&set);
-               FD_SET(0, &set);
+               FD_SET(fd, &set);
 
                /* poll-based wait produces bigger code, using select */
                i = select(1, &set, NULL, NULL, &ts);
                if (!i) { /* timed out! */
 #if ENABLE_ASH_READ_NCHARS
                        if (n_flag)
-                               tcsetattr(0, TCSANOW, &old_tty);
+                               tcsetattr(fd, TCSANOW, &old_tty);
 #endif
                        return 1;
                }
@@ -11813,7 +11825,7 @@
        backslash = 0;
        STARTSTACKSTR(p);
        do {
-               if (nonblock_safe_read(0, &c, 1) != 1) {
+               if (nonblock_safe_read(fd, &c, 1) != 1) {
                        status = 1;
                        break;
                }
@@ -11855,7 +11867,7 @@
 
 #if ENABLE_ASH_READ_NCHARS
        if (n_flag || silent)
-               tcsetattr(0, TCSANOW, &old_tty);
+               tcsetattr(fd, TCSANOW, &old_tty);
 #endif
 
        STACKSTRNUL(p);
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to