You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
2.8 KiB
124 lines
2.8 KiB
'read -t' support, forward-ported from Gentoo Busybox 1.1.3.
|
|
Used during the LiveCD boot when prompting for a keymap.
|
|
|
|
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
|
|
|
|
diff -Nuar --exclude '*.orig' busybox-1.7.4/shell/ash.c busybox-1.7.4+gentoo/shell/ash.c
|
|
--- busybox-1.7.4/shell/ash.c 2007-11-03 16:06:35.000000000 -0700
|
|
+++ busybox-1.7.4+gentoo/shell/ash.c 2008-03-11 10:21:28.000000000 -0700
|
|
@@ -11485,11 +11485,13 @@
|
|
int startword;
|
|
int status;
|
|
int i;
|
|
+#if ENABLE_ASH_READ_NCHARS || ENABLE_ASH_READ_TIMEOUT
|
|
+ struct termios tty, old_tty;
|
|
+#endif
|
|
#if ENABLE_ASH_READ_NCHARS
|
|
int nch_flag = 0;
|
|
int nchars = 0;
|
|
int silent = 0;
|
|
- struct termios tty, old_tty;
|
|
#endif
|
|
#if ENABLE_ASH_READ_TIMEOUT
|
|
fd_set set;
|
|
@@ -11566,44 +11568,74 @@
|
|
ifs = bltinlookup("IFS");
|
|
if (ifs == NULL)
|
|
ifs = defifs;
|
|
-#if ENABLE_ASH_READ_NCHARS
|
|
+#if ENABLE_ASH_READ_NCHARS || ENABLE_ASH_READ_TIMEOUT
|
|
+#if ENABLE_ASH_READ_NCHARS && ENABLE_ASH_READ_TIMEOUT
|
|
+ if (nch_flag || silent || ts.tv_sec || ts.tv_usec) {
|
|
+#elif ENABLE_ASH_READ_TIMEOUT
|
|
+ if (ts.tv_sec || ts.tv_usec) {
|
|
+#elif ENABLE_ASH_READ_NCHARS
|
|
if (nch_flag || silent) {
|
|
+#endif
|
|
tcgetattr(0, &tty);
|
|
old_tty = tty;
|
|
- if (nch_flag) {
|
|
+#if ENABLE_ASH_READ_NCHARS && ENABLE_ASH_READ_TIMEOUT
|
|
+ if (nch_flag || ts.tv_sec || ts.tv_usec)
|
|
+#elif ENABLE_ASH_READ_TIMEOUT
|
|
+ if (ts.tv_sec || ts.tv_usec)
|
|
+#elif ENABLE_ASH_READ_NCHARS
|
|
+ if (nch_flag)
|
|
+#endif
|
|
tty.c_lflag &= ~ICANON;
|
|
- tty.c_cc[VMIN] = nchars;
|
|
- }
|
|
- if (silent) {
|
|
- tty.c_lflag &= ~(ECHO|ECHOK|ECHONL);
|
|
|
|
- }
|
|
+
|
|
+#if ENABLE_ASH_READ_NCHARS
|
|
+ if (silent)
|
|
+ tty.c_lflag &= ~(ECHO|ECHOK|ECHONL);
|
|
+#endif
|
|
tcsetattr(0, TCSANOW, &tty);
|
|
}
|
|
#endif
|
|
+ i = 1;
|
|
+ STARTSTACKSTR(p);
|
|
#if ENABLE_ASH_READ_TIMEOUT
|
|
if (ts.tv_sec || ts.tv_usec) {
|
|
FD_ZERO(&set);
|
|
FD_SET(0, &set);
|
|
|
|
i = select(FD_SETSIZE, &set, NULL, NULL, &ts);
|
|
- if (!i) {
|
|
+ if (i == 1)
|
|
+ {
|
|
+ read(0, &c, 1);
|
|
+ if(c == '\n' || c == 4) /* Handle newlines and EOF */
|
|
+ i = 0; /* Don't read further... */
|
|
+ else
|
|
+ STPUTC(c, p); /* Ok, keep reading... */
|
|
+ }
|
|
#if ENABLE_ASH_READ_NCHARS
|
|
- if (nch_flag)
|
|
- tcsetattr(0, TCSANOW, &old_tty);
|
|
+ if (!silent && !nch_flag)
|
|
#endif
|
|
- return 1;
|
|
+ tcsetattr(0, TCSANOW, &old_tty);
|
|
+
|
|
+#if ENABLE_ASH_READ_NCHARS
|
|
+ if(i == 0)
|
|
+ {
|
|
+ nchars = 0;
|
|
+ nch_flag = 1;
|
|
+ } else
|
|
+ {
|
|
+ if (nch_flag)
|
|
+ nchars--;
|
|
}
|
|
+#endif
|
|
}
|
|
#endif
|
|
status = 0;
|
|
startword = 1;
|
|
backslash = 0;
|
|
- STARTSTACKSTR(p);
|
|
#if ENABLE_ASH_READ_NCHARS
|
|
while (!nch_flag || nchars--)
|
|
#else
|
|
- for (;;)
|
|
+ for (;i > 0;)
|
|
#endif
|
|
{
|
|
if (read(0, &c, 1) != 1) {
|
|
@@ -11640,8 +11672,10 @@
|
|
}
|
|
}
|
|
#if ENABLE_ASH_READ_NCHARS
|
|
- if (nch_flag || silent)
|
|
+ if (silent || nch_flag)
|
|
tcsetattr(0, TCSANOW, &old_tty);
|
|
+ if (!silent && nch_flag)
|
|
+ printf("\n");
|
|
#endif
|
|
|
|
STACKSTRNUL(p);
|