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:
parent
9dbb75f034
commit
19580c73bf
@ -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.
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user