summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-02-10 00:46:27 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-02-10 00:46:27 +0000
commitf0fef8e21fd0459b75b3e5faf318634e5befbdaf (patch)
treed9451e3904a1b2e84bce6b183ccaca719b78ff51 /apps
parent9768bf44e8f274eecc92f4eefbf0496f32649196 (diff)
downloadpx4-nuttx-f0fef8e21fd0459b75b3e5faf318634e5befbdaf.tar.gz
px4-nuttx-f0fef8e21fd0459b75b3e5faf318634e5befbdaf.tar.bz2
px4-nuttx-f0fef8e21fd0459b75b3e5faf318634e5befbdaf.zip
Fix a readline bug. If a NUL is received, it would return end-of-file
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5633 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps')
-rw-r--r--apps/ChangeLog.txt5
-rw-r--r--apps/examples/cdcacm/Kconfig1
-rw-r--r--apps/examples/ftpc/ftpc_main.c11
-rw-r--r--apps/examples/usbterm/usbterm_main.c9
-rw-r--r--apps/include/readline.h6
-rw-r--r--apps/nshlib/nsh_consolemain.c2
-rw-r--r--apps/nshlib/nsh_session.c11
-rw-r--r--apps/system/readline/readline.c22
8 files changed, 37 insertions, 30 deletions
diff --git a/apps/ChangeLog.txt b/apps/ChangeLog.txt
index 5b61a1277..a22d2184a 100644
--- a/apps/ChangeLog.txt
+++ b/apps/ChangeLog.txt
@@ -517,3 +517,8 @@
match NuttX name change.
* apps/examples/ostest/restart.c: Add a test case to verify
task_restart().
+ * apps/system/readline.c: readline() now returns EOF on any failure
+ (instead of a negated errno value). This is because the underlying
+ read is based on logic similar to getc. The value zero was being
+ confused with a NUL. So if a NUL was received, the NSH session
+ would terminate because it thought it was the end of file.
diff --git a/apps/examples/cdcacm/Kconfig b/apps/examples/cdcacm/Kconfig
index 1e0b3f3ed..78fea4d0d 100644
--- a/apps/examples/cdcacm/Kconfig
+++ b/apps/examples/cdcacm/Kconfig
@@ -6,6 +6,7 @@
config EXAMPLES_CDCACM
bool "CDC/ACM example"
default n
+ depends on CDCACM
---help---
Enable the USB CDC/ACM class driver example
diff --git a/apps/examples/ftpc/ftpc_main.c b/apps/examples/ftpc/ftpc_main.c
index 866a69cdb..deba62c1c 100644
--- a/apps/examples/ftpc/ftpc_main.c
+++ b/apps/examples/ftpc/ftpc_main.c
@@ -1,7 +1,7 @@
/****************************************************************************
* examples/ftpc/ftpc_main.c
*
- * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2011-2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -431,14 +431,13 @@ int ftpc_main(int argc, char **argv, char **envp)
ret = readline(g_line, CONFIG_FTPC_LINELEN, stdin, stdout);
/* Readline normally returns the number of characters read,
- * but will return 0 on end of file or a negative value
- * if an error occurs. Either will cause the session to
- * terminate.
+ * but will return EOF on end of file or if an error occurs.
+ * Either will cause the session to terminate.
*/
- if (ret <= 0)
+ if (ret == EOF)
{
- printf("ERROR: readline failed: %d\n", ret);
+ printf("ERROR: readline failed: %d\n", errno);
return 1;
}
#endif
diff --git a/apps/examples/usbterm/usbterm_main.c b/apps/examples/usbterm/usbterm_main.c
index 69301dfcd..747a52978 100644
--- a/apps/examples/usbterm/usbterm_main.c
+++ b/apps/examples/usbterm/usbterm_main.c
@@ -1,7 +1,7 @@
/****************************************************************************
* examples/usbterm/usbterm_main.c
*
- * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2011-2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -325,12 +325,11 @@ int usbterm_main(int argc, char *argv[])
ret = readline(g_usbterm.outbuffer, CONFIG_EXAMPLES_USBTERM_BUFLEN, stdin, stdout);
/* Readline normally returns the number of characters read,
- * but will return 0 on end of file or a negative value
- * if an error occurs. Either will cause the session to
- * terminate.
+ * but will return EOF on end of file or if an error occurs. Either
+ * will cause the session to terminate.
*/
- if (ret <= 0)
+ if (ret == EOF)
{
printf("ERROR: readline failed: %d\n", ret);
return 1;
diff --git a/apps/include/readline.h b/apps/include/readline.h
index 647778210..6da6f3fd7 100644
--- a/apps/include/readline.h
+++ b/apps/include/readline.h
@@ -1,7 +1,7 @@
/****************************************************************************
* apps/include/readline.h
*
- * Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2011, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -85,8 +85,8 @@ extern "C" {
*
* Returned values:
* On success, the (positive) number of bytes transferred is returned.
- * A length of zero would indicated an end of file condition. An failure,
- * a negated errno value is returned.
+ * EOF is returned to indicate either an end of file condition or a
+ * failure.
*
**************************************************************************/
diff --git a/apps/nshlib/nsh_consolemain.c b/apps/nshlib/nsh_consolemain.c
index 8be44f7aa..27e9d6db9 100644
--- a/apps/nshlib/nsh_consolemain.c
+++ b/apps/nshlib/nsh_consolemain.c
@@ -42,8 +42,6 @@
#include <stdio.h>
#include <assert.h>
-#include <apps/readline.h>
-
#include "nsh.h"
#include "nsh_console.h"
diff --git a/apps/nshlib/nsh_session.c b/apps/nshlib/nsh_session.c
index 8079b2de5..0c5249672 100644
--- a/apps/nshlib/nsh_session.c
+++ b/apps/nshlib/nsh_session.c
@@ -129,11 +129,13 @@ int nsh_session(FAR struct console_stdio_s *pstate)
fputs(g_nshprompt, pstate->cn_outstream);
fflush(pstate->cn_outstream);
- /* Get the next line of input */
+ /* Get the next line of input. readline() returns EOF on end-of-file
+ * or any read failure.
+ */
ret = readline(pstate->cn_line, CONFIG_NSH_LINELEN,
INSTREAM(pstate), OUTSTREAM(pstate));
- if (ret > 0)
+ if (ret != EOF)
{
/* Parse process the command */
@@ -142,9 +144,8 @@ int nsh_session(FAR struct console_stdio_s *pstate)
}
/* Readline normally returns the number of characters read,
- * but will return 0 on end of file or a negative value
- * if an error occurs. Either will cause the session to
- * terminate.
+ * but will return EOF on end of file or if an error occurs.
+ * EOF will cause the session to terminate.
*/
else
diff --git a/apps/system/readline/readline.c b/apps/system/readline/readline.c
index bac7eee8c..1fb30e840 100644
--- a/apps/system/readline/readline.c
+++ b/apps/system/readline/readline.c
@@ -1,7 +1,7 @@
/****************************************************************************
* apps/system/readline/readline.c
*
- * Copyright (C) 2007-2008, 2011-2012 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007-2008, 2011-2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -136,9 +136,9 @@ static inline int readline_rawgetc(int infd)
if (nread == 0)
{
- /* Return zero on end-of-file */
+ /* Return EOF on end-of-file */
- return 0;
+ return EOF;
}
/* Check if an error occurred */
@@ -152,7 +152,9 @@ static inline int readline_rawgetc(int infd)
int errcode = errno;
if (errcode != EINTR)
{
- return -errcode;
+ /* Return EOF on any errors that we cannot handle */
+
+ return EOF;
}
}
}
@@ -233,8 +235,8 @@ static inline void readline_consolewrite(int outfd, FAR const char *buffer, size
*
* Returned values:
* On success, the (positive) number of bytes transferred is returned.
- * A length of zero would indicate an end of file condition. On failure,
- * a negated errno value is returned.
+ * EOF is returned to indicate either an end of file condition or a
+ * failure.
*
**************************************************************************/
@@ -281,13 +283,15 @@ ssize_t readline(FAR char *buf, int buflen, FILE *instream, FILE *outstream)
for(;;)
{
- /* Get the next character */
+ /* Get the next character. readline_rawgetc() returns EOF on any
+ * errors or at the end of file.
+ */
int ch = readline_rawgetc(infd);
/* Check for end-of-file or read error */
- if (ch <= 0)
+ if (ch == EOF)
{
/* Did we already received some data? */
@@ -302,7 +306,7 @@ ssize_t readline(FAR char *buf, int buflen, FILE *instream, FILE *outstream)
return nch;
}
- return ch;
+ return EOF;
}
/* Are we processing a VT100 escape sequence */