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
This commit is contained in:
patacongo 2012-08-12 17:37:04 +00:00
parent 9dbb75f034
commit 19580c73bf
2 changed files with 48 additions and 6 deletions

View File

@ -274,3 +274,5 @@
no arguments outputs a short list of commands. With -v lists all no arguments outputs a short list of commands. With -v lists all
command line details. And command name can be added to just get command line details. And command name can be added to just get
help on one command. help on one command.
* system/readline.c: If character input/output is interrupted by a
signal, then readline() will try the read/write again.

View File

@ -103,13 +103,34 @@ static inline int readline_rawgetc(int infd)
char buffer; char buffer;
ssize_t nread; ssize_t nread;
nread = read(infd, &buffer, 1); /* Loop until we successfully read a character (or until an unexpected
if (nread < 1) * error occurs).
{ */
/* Return EOF if the end of file (0) or error (-1) occurs */
return EOF; do
{
/* 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.
*/
if (nread == 0 || errno != EINTR)
{
return EOF;
}
}
} }
while (nread < 1);
/* On success, returnt he character that was read */
return (int)buffer; return (int)buffer;
} }
@ -121,7 +142,26 @@ static inline int readline_rawgetc(int infd)
static inline void readline_consoleputc(int ch, int outfd) static inline void readline_consoleputc(int ch, int outfd)
{ {
char buffer = ch; 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 #endif