Am Dienstag 06 November 2007 schrieb walter harms:
> hi list,
> does the ash have an idle timeout ?
>
> (if not it would be a nice enhancement :)

Attached is a patch which adds this functionality to
ash (configurable via environment variable TMOUT).

Thomas


--- ash.c.orig	2007-12-14 09:18:05.000000000 +0100
+++ ash.c	2007-12-14 09:23:51.000000000 +0100
@@ -10856,6 +10856,17 @@
 	return exitstatus;
 }
 
+#if ENABLE_ASH_IDLE_TIMEOUT
+static volatile int timed_out;
+
+static void alrm_catcher(int i)
+{
+	printf ("\007timed out waiting for input: auto-logout\n");
+	timed_out = 1;
+	return;
+}
+#endif
+
 /*
  * Read and execute commands.  "Top" is nonzero for the top level command
  * loop; it turns on prompting if the shell is interactive.
@@ -10867,11 +10878,30 @@
 	struct stackmark smark;
 	int inter;
 	int numeof = 0;
+#if ENABLE_ASH_IDLE_TIMEOUT
+	void *old_alrm;
+	int tmout_len;
+	char *tmout_var;	/* timeout value for auto-logout */
+#endif
 
 	TRACE(("cmdloop(%d) called\n", top));
 	for (;;) {
 		int skip;
 
+#if ENABLE_ASH_IDLE_TIMEOUT
+		timed_out = 0;
+		tmout_var = NULL;
+		tmout_len = 0;
+		old_alrm  = (void *)SIG_IGN;
+		if (iflag) {
+			if ((tmout_var = lookupvar("TMOUT")) != NULL
+					&& (tmout_len = atoi(tmout_var)) > 0) {
+				signal(SIGALRM, alrm_catcher);
+				alarm(tmout_len);
+			}
+		}
+#endif
+
 		setstackmark(&smark);
 #if JOBS
 		if (jobctl)
@@ -10885,6 +10915,15 @@
 #endif
 		}
 		n = parsecmd(inter);
+#if ENABLE_ASH_IDLE_TIMEOUT
+		if (iflag && timed_out)
+			break;
+		if (iflag && tmout_var && (tmout_len > 0))
+		{
+			alarm(0);
+			signal(SIGALRM, old_alrm);
+		}
+#endif
 		/* showtree(n); DEBUG */
 		if (n == NEOF) {
 			if (!top || numeof >= 50)
_______________________________________________
busybox mailing list
busybox@busybox.net
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to