All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/3 v2] common: add possibility for readline_into_buffer timeout
Date: Tue, 17 Jan 2012 08:13:05 +0100	[thread overview]
Message-ID: <1326784385-4759-1-git-send-email-hs@denx.de> (raw)
In-Reply-To: <1326614022-24014-2-git-send-email-hs@denx.de>

add possibility to add a timeout when reading a line
into a buffer.

Signed-off-by: Heiko Schocher <hs@denx.de>
Cc: Mike Frysinger <vapier@gentoo.org>

---
- changes for v2:
  - add comments from Mike Frysinger <vapier@gentoo.org>:
    - remove useless inner parens
    - rework timeout handling in readline_into_buffer():
      use endtick(), drop CONIG_SYS_HZ usage

 common/cmd_nvedit.c |    2 +-
 common/main.c       |   20 ++++++++++++++++----
 common/menu.c       |    3 ++-
 include/common.h    |    3 ++-
 4 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index 63afc82..20080dc 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -502,7 +502,7 @@ int do_env_edit(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	else
 		buffer[0] = '\0';
 
-	readline_into_buffer("edit: ", buffer);
+	readline_into_buffer("edit: ", buffer, 0);
 
 	return setenv(argv[1], buffer);
 }
diff --git a/common/main.c b/common/main.c
index e96c95a..248744b 100644
--- a/common/main.c
+++ b/common/main.c
@@ -685,7 +685,8 @@ static void cread_add_str(char *str, int strsize, int insert, unsigned long *num
 	}
 }
 
-static int cread_line(const char *const prompt, char *buf, unsigned int *len)
+static int cread_line(const char *const prompt, char *buf, unsigned int *len,
+		int timeout)
 {
 	unsigned long num = 0;
 	unsigned long eol_num = 0;
@@ -695,6 +696,7 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len)
 	int esc_len = 0;
 	char esc_save[8];
 	int init_len = strlen(buf);
+	int first = 1;
 
 	if (init_len)
 		cread_add_str(buf, init_len, 1, &num, &eol_num, buf, *len);
@@ -707,6 +709,16 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len)
 			WATCHDOG_RESET();
 		}
 #endif
+		if (first && timeout) {
+			uint64_t etime = endtick(timeout);
+
+			while (!tstc()) {	/* while no incoming data */
+				if (get_ticks() >= etime)
+					return -2;	/* timed out */
+				WATCHDOG_RESET();
+			}
+			first = 0;
+		}
 
 		ichar = getcmd_getch();
 
@@ -922,11 +934,11 @@ int readline (const char *const prompt)
 	 */
 	console_buffer[0] = '\0';
 
-	return readline_into_buffer(prompt, console_buffer);
+	return readline_into_buffer(prompt, console_buffer, 0);
 }
 
 
-int readline_into_buffer (const char *const prompt, char * buffer)
+int readline_into_buffer(const char *const prompt, char *buffer, int timeout)
 {
 	char *p = buffer;
 #ifdef CONFIG_CMDLINE_EDITING
@@ -949,7 +961,7 @@ int readline_into_buffer (const char *const prompt, char * buffer)
 		if (prompt)
 			puts (prompt);
 
-		rc = cread_line(prompt, p, &len);
+		rc = cread_line(prompt, p, &len, timeout);
 		return rc < 0 ? rc : len;
 
 	} else {
diff --git a/common/menu.c b/common/menu.c
index 5e0817c..3b1e0d0 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -222,7 +222,8 @@ static inline int menu_interactive_choice(struct menu *m, void **choice)
 
 		menu_display(m);
 
-		readret = readline_into_buffer("Enter choice: ", cbuf);
+		readret = readline_into_buffer("Enter choice: ", cbuf,
+				m->timeout);
 
 		if (readret >= 0) {
 			choice_item = menu_item_by_key(m, cbuf);
diff --git a/include/common.h b/include/common.h
index 3df1def..7a9b3a2 100644
--- a/include/common.h
+++ b/include/common.h
@@ -265,7 +265,8 @@ int	run_command	(const char *cmd, int flag);
 int run_command2(const char *cmd, int flag);
 #endif
 int	readline	(const char *const prompt);
-int	readline_into_buffer	(const char *const prompt, char * buffer);
+int	readline_into_buffer(const char *const prompt, char *buffer,
+			int timeout);
 int	parse_line (char *, char *[]);
 void	init_cmd_timeout(void);
 void	reset_cmd_timeout(void);
-- 
1.7.7.4

  parent reply	other threads:[~2012-01-17  7:13 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-15  7:53 [U-Boot] [PATCH 0/3] common, menu: enhancements Heiko Schocher
2012-01-15  7:53 ` [U-Boot] [PATCH 1/3] common: add possibility for readline_into_buffer timeout Heiko Schocher
2012-01-15 17:35   ` Mike Frysinger
2012-01-16  6:43     ` Heiko Schocher
2012-01-17  7:13   ` Heiko Schocher [this message]
2012-01-17 19:14     ` [U-Boot] [PATCH 1/3 v2] " Mike Frysinger
2012-02-17 21:33     ` Stephan Linz
2012-02-17 23:18       ` Mike Frysinger
2012-01-15  7:53 ` [U-Boot] [PATCH 2/3] common, menu: add statusline support Heiko Schocher
2012-01-15 17:36   ` Mike Frysinger
2012-01-16  6:54     ` Heiko Schocher
2012-01-17  7:13   ` [U-Boot] [PATCH 2/3 v2] " Heiko Schocher
2012-01-17 19:14     ` Mike Frysinger
2012-01-15  7:53 ` [U-Boot] [PATCH 3/3] common, menu: show menu on startup if CONFIG_MENU_SHOW is defined Heiko Schocher
2012-01-15 17:38   ` Mike Frysinger
2012-01-16  6:55     ` Heiko Schocher
2012-01-17  7:13   ` [U-Boot] [PATCH 3/3 v2] " Heiko Schocher
2012-01-17 12:55     ` Jason Hobbs
2012-01-18  6:05     ` [U-Boot] [PATCH 3/3 v3] " Heiko Schocher

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1326784385-4759-1-git-send-email-hs@denx.de \
    --to=hs@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.