summaryrefslogtreecommitdiff
path: root/apps/system/readline/readline.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/system/readline/readline.c')
-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