diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-08-12 17:37:04 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-08-12 17:37:04 +0000 |
commit | 4d7cbe088ed6ea14adc0672b339f1e0df4650f00 (patch) | |
tree | b8701e6c319c085758d39c4dd7d08c380fc2088a /apps | |
parent | 66fcc36c58e7670ef627985cc37ac99dc747c02f (diff) | |
download | nuttx-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')
-rwxr-xr-x | apps/ChangeLog.txt | 2 | ||||
-rw-r--r-- | apps/system/readline/readline.c | 50 |
2 files changed, 47 insertions, 5 deletions
diff --git a/apps/ChangeLog.txt b/apps/ChangeLog.txt index 1bb2a08b5..37d05bacd 100755 --- a/apps/ChangeLog.txt +++ b/apps/ChangeLog.txt @@ -274,3 +274,5 @@ no arguments outputs a short list of commands. With -v lists all command line details. And command name can be added to just get help on one command. + * system/readline.c: If character input/output is interrupted by a + signal, then readline() will try the read/write again. 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 |