celix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bpe...@apache.org
Subject svn commit: r1636411 - /celix/trunk/shell_tui/private/src/shell_tui.c
Date Mon, 03 Nov 2014 18:02:45 GMT
Author: bpetri
Date: Mon Nov  3 18:02:45 2014
New Revision: 1636411

URL: http://svn.apache.org/r1636411
Log:
CELIX-178: Applied provided patch to prevent hanging fgets.

Modified:
    celix/trunk/shell_tui/private/src/shell_tui.c

Modified: celix/trunk/shell_tui/private/src/shell_tui.c
URL: http://svn.apache.org/viewvc/celix/trunk/shell_tui/private/src/shell_tui.c?rev=1636411&r1=1636410&r2=1636411&view=diff
==============================================================================
--- celix/trunk/shell_tui/private/src/shell_tui.c (original)
+++ celix/trunk/shell_tui/private/src/shell_tui.c Mon Nov  3 18:02:45 2014
@@ -26,6 +26,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/time.h>
+#include <sys/select.h>
 
 #include <apr_general.h>
 #include <apr_thread_proc.h>
@@ -55,28 +57,38 @@ static void *APR_THREAD_FUNC shellTui_ru
 	shell_tui_activator_pt act = (shell_tui_activator_pt) data;
 
 	char in[256];
+	char dline[256];
 	bool needPrompt = true;
+
+	fd_set rfds;
+	struct timeval tv;
+
 	while (act->running) {
-		char * dline = NULL;
 		char * line = NULL;
 		if (needPrompt) {
 			printf("-> ");
+			fflush(stdout);
 			needPrompt = false;
 		}
-		fgets(in, 256, stdin);
-		needPrompt = true;
-		dline = strdup(in);
-		line = utils_stringTrim(dline);
-		if (strlen(line) == 0) {
-		    free(dline);
-			continue;
-		}
-		if (act->shell == NULL) {
-		    free(dline);
-			continue;
+		FD_ZERO(&rfds);
+		FD_SET(0, &rfds);
+
+		tv.tv_sec = 1;
+		tv.tv_usec = 0;
+
+		if(select(1, &rfds, NULL, NULL, &tv)){
+			fgets(in, 256, stdin);
+			needPrompt = true;
+			memset(dline,0,256);
+			strncpy(dline,in,256);
+
+			line = utils_stringTrim(dline);
+			if ( (strlen(line) == 0) || (act->shell == NULL) ){
+				continue;
+			}
+
+			act->shell->executeCommand(act->shell->shell, line, shellTui_write, shellTui_write);
 		}
-		act->shell->executeCommand(act->shell->shell, line, shellTui_write, shellTui_write);
-		free(dline);
 	}
 	apr_thread_exit(thd, APR_SUCCESS);
 	return NULL;



Mime
View raw message