summaryrefslogtreecommitdiff
path: root/apps/system/readline
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-08-12 17:37:04 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-08-12 17:37:04 +0000
commit4d7cbe088ed6ea14adc0672b339f1e0df4650f00 (patch)
treeb8701e6c319c085758d39c4dd7d08c380fc2088a /apps/system/readline
parent66fcc36c58e7670ef627985cc37ac99dc747c02f (diff)
downloadnuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.tar.gz
nuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.tar.bz2
nuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.zip
drivers/serial/serial.c open, read, write, and poll methods will not return a short transfer or an EINTR error if a signal is received while waiting (only)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5022 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/system/readline')
-rw-r--r--apps/system/readline/readline.c50
1 files changed, 45 insertions, 5 deletions
diff --git a/apps/system/readline/readline.c b/apps/system/readline/readline.c
index f7fa6a635..bdd39e67b 100644
--- a/apps/system/readline/readline.c
+++ b/apps/system/readline/readline.c
@@ -103,13 +103,34 @@ static inline int readline_rawgetc(int infd)
char buffer;
ssize_t nread;
- nread = read(infd, &buffer, 1);
- if (nread < 1)
+ /* Loop until we successfully read a character (or until an unexpected
+ * error occurs).
+ */
+
+ do
{
- /* Return EOF if the end of file (0) or error (-1) occurs */
+ /* Read one character from the incoming stream */
+
+ nread = read(infd, &buffer, 1);
+
+ /* Return EOF if the end of file (0) or error (-1) occurs. */
+
+ if (nread < 1)
+ {
+ /* EINTR is not really an error; it simply means that a signal we
+ * received while watiing for intput.
+ */
- return EOF;
+ if (nread == 0 || errno != EINTR)
+ {
+ return EOF;
+ }
+ }
}
+ while (nread < 1);
+
+ /* On success, returnt he character that was read */
+
return (int)buffer;
}
@@ -121,7 +142,26 @@ static inline int readline_rawgetc(int infd)
static inline void readline_consoleputc(int ch, int outfd)
{
char buffer = ch;
- (void)write(outfd, &buffer, 1);
+ ssize_t nwritten;
+
+ /* Loop until we successfully write a character (or until an unexpected
+ * error occurs).
+ */
+
+ do
+ {
+ /* Write the character to the outgoing stream */
+
+ nwritten = write(outfd, &buffer, 1);
+
+ /* Check for irrecoverable write errors. */
+
+ if (nwritten < 0 && errno != EINTR)
+ {
+ break;
+ }
+ }
+ while (nwritten < 1);
}
#endif