[BusyBox-cvs] r9837 - in trunk/busybox/shell: .

solar at busybox.net solar at busybox.net
Wed Feb 9 21:07:31 UTC 2005


Author: solar
Date: 2005-02-09 14:07:23 -0700 (Wed, 09 Feb 2005)
New Revision: 9837

Log:
- add ash read -t timeout support. initial code provided by Tim Yamin on Oct/21/2004 on the busybox mailing list. Edited his code a little to keep syntax highlighers happy and make it optional when CONFIG_ASH_TIMEOUT is defined
Modified:
   trunk/busybox/shell/Config.in
   trunk/busybox/shell/ash.c


Changeset:
Modified: trunk/busybox/shell/Config.in
===================================================================
--- trunk/busybox/shell/Config.in	2005-02-09 19:40:19 UTC (rev 9836)
+++ trunk/busybox/shell/Config.in	2005-02-09 21:07:23 UTC (rev 9837)
@@ -53,6 +53,17 @@
 	help
 	  Enable job control in the ash shell.
 
+config CONFIG_ASH_TIMEOUT
+        bool "  Enable read timeout support."
+        default n
+        depends on CONFIG_ASH_JOB_CONTROL
+        help
+          This option provides read -t <seconds> support.
+
+	  read builtin which allows the function to pass control back 
+	  if no character input is read from the terminal within a set
+	  number of seconds.
+
 config CONFIG_ASH_ALIAS
 	bool "  Enable alias support"
 	default y

Modified: trunk/busybox/shell/ash.c
===================================================================
--- trunk/busybox/shell/ash.c	2005-02-09 19:40:19 UTC (rev 9836)
+++ trunk/busybox/shell/ash.c	2005-02-09 21:07:23 UTC (rev 9837)
@@ -12583,17 +12583,34 @@
 	char *prompt;
 	const char *ifs;
 	char *p;
+#if defined(CONFIG_ASH_TIMEOUT) && JOBS
+	fd_set set;
+	int timeout;
+	struct timeval timeout_struct;
+	struct termios tty, old_tty;
+#endif
 	int startword;
 	int status;
 	int i;
 
 	rflag = 0;
 	prompt = NULL;
-	while ((i = nextopt("p:r")) != '\0') {
+#if defined(CONFIG_ASH_TIMEOUT) && JOBS
+	timeout = 0;
+
+	while ((i = nextopt("p:rt:")) != '\0')
+#else
+	while ((i = nextopt("p:r")) != '\0')
+#endif
+	{
 		if (i == 'p')
 			prompt = optionarg;
+		else if (i == 'r')
+			rflag = 1;
+#if defined(CONFIG_ASH_TIMEOUT) && JOBS
 		else
-			rflag = 1;
+			timeout = atoi(optionarg);
+#endif
 	}
 	if (prompt && isatty(0)) {
 		out2str(prompt);
@@ -12602,11 +12619,54 @@
 		error("arg count");
 	if ((ifs = bltinlookup("IFS")) == NULL)
 		ifs = defifs;
+#if defined(CONFIG_ASH_TIMEOUT) && JOBS
+	c = 0;
+#endif
 	status = 0;
 	startword = 1;
 	backslash = 0;
+
 	STARTSTACKSTR(p);
-	for (;;) {
+#if defined(CONFIG_ASH_TIMEOUT) && JOBS
+	if (timeout > 0) {
+		tcgetattr(0, &tty);
+		old_tty = tty;
+
+		/* cfmakeraw(...) disables too much; we just do this instead. */
+		tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
+		tcsetattr(0, TCSANOW, &tty);
+
+		FD_ZERO (&set);
+		FD_SET (0, &set);
+
+		timeout_struct.tv_sec = timeout;
+		timeout_struct.tv_usec = 0;
+
+		i = select (FD_SETSIZE, &set, NULL, NULL, &timeout_struct);
+		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); /* Keep reading... */
+		}
+		tcsetattr(0, TCSANOW, &old_tty);
+
+		/* Echo the character so the user knows it was read...
+		   Yes, this can be done by setting the ECHO flag, but that
+		   echoes ^D and other control characters at this state */
+		if(c != 0)
+			write(1, &c, 1);
+
+	} else
+		i = 1;
+
+	for (;i == 1;)
+#else
+	for (;;)
+#endif
+	{
 		if (read(0, &c, 1) != 1) {
 			status = 1;
 			break;




More information about the busybox-cvs mailing list