summaryrefslogtreecommitdiff
path: root/lib/libedit
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2009-02-15 21:24:13 +0000
committerchristos <christos@NetBSD.org>2009-02-15 21:24:13 +0000
commit6ed9cd5e693fe9353e2cb8e9673d01c2dd1d051d (patch)
tree0bd2888885926de047c332debd5d9d9007e02683 /lib/libedit
parentb16648eaeb7bb968fc20a3b816709e171b41b667 (diff)
don't restart on EINTR, instead return NULL immediately. From Anon Ymous
Diffstat (limited to 'lib/libedit')
-rw-r--r--lib/libedit/el.h3
-rw-r--r--lib/libedit/read.c33
2 files changed, 26 insertions, 10 deletions
diff --git a/lib/libedit/el.h b/lib/libedit/el.h
index f8394974ead..a8e29919450 100644
--- a/lib/libedit/el.h
+++ b/lib/libedit/el.h
@@ -1,4 +1,4 @@
-/* $NetBSD: el.h,v 1.17 2006/12/15 22:13:33 christos Exp $ */
+/* $NetBSD: el.h,v 1.18 2009/02/15 21:24:13 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -115,6 +115,7 @@ struct editline {
FILE *el_errfile; /* Stdio stuff */
int el_infd; /* Input file descriptor */
int el_flags; /* Various flags. */
+ int el_errno; /* Local copy of errno */
coord_t el_cursor; /* Cursor location */
char **el_display; /* Real screen image = what is there */
char **el_vdisplay; /* Virtual screen image = what we see */
diff --git a/lib/libedit/read.c b/lib/libedit/read.c
index ed20b5e6d47..14fa7377f18 100644
--- a/lib/libedit/read.c
+++ b/lib/libedit/read.c
@@ -1,4 +1,4 @@
-/* $NetBSD: read.c,v 1.43 2009/02/05 19:15:44 christos Exp $ */
+/* $NetBSD: read.c,v 1.44 2009/02/15 21:24:13 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: read.c,v 1.43 2009/02/05 19:15:44 christos Exp $");
+__RCSID("$NetBSD: read.c,v 1.44 2009/02/15 21:24:13 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -51,7 +51,7 @@ __RCSID("$NetBSD: read.c,v 1.43 2009/02/05 19:15:44 christos Exp $");
#include <stdlib.h>
#include "el.h"
-#define OKCMD -1
+#define OKCMD -1 /* must be -1! */
private int read__fixio(int, int);
private int read_preread(EditLine *);
@@ -172,7 +172,7 @@ read__fixio(int fd __attribute__((__unused__)), int e)
return (e ? 0 : -1);
case EINTR:
- return (0);
+ return (-1);
default:
return (-1);
@@ -237,9 +237,12 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
el_action_t cmd;
int num;
+ el->el_errno = 0;
do {
- if ((num = el_getc(el, ch)) != 1) /* if EOF or error */
+ if ((num = el_getc(el, ch)) != 1) { /* if EOF or error */
+ el->el_errno = errno;
return (num);
+ }
#ifdef KANJI
if ((*ch & 0200)) {
@@ -412,7 +415,7 @@ el_gets(EditLine *el, int *nread)
char *cp = el->el_line.buffer;
size_t idx;
- while ((*el->el_read.read_char)(el, cp) == 1) {
+ while ((num = (*el->el_read.read_char)(el, cp)) == 1) {
/* make sure there is space for next character */
if (cp + 1 >= el->el_line.limit) {
idx = (cp - el->el_line.buffer);
@@ -426,12 +429,14 @@ el_gets(EditLine *el, int *nread)
if (cp[-1] == '\r' || cp[-1] == '\n')
break;
}
+ if (num == -1 && errno == EINTR)
+ cp = el->el_line.buffer;
el->el_line.cursor = el->el_line.lastchar = cp;
*cp = '\0';
if (nread)
*nread = el->el_line.cursor - el->el_line.buffer;
- return (el->el_line.buffer);
+ return (*nread ? el->el_line.buffer : NULL);
}
@@ -456,6 +461,7 @@ el_gets(EditLine *el, int *nread)
if (el->el_flags & EDIT_DISABLED) {
char *cp;
size_t idx;
+
if ((el->el_flags & UNBUFFERED) == 0)
cp = el->el_line.buffer;
else
@@ -463,7 +469,7 @@ el_gets(EditLine *el, int *nread)
term__flush(el);
- while ((*el->el_read.read_char)(el, cp) == 1) {
+ while ((num = (*el->el_read.read_char)(el, cp)) == 1) {
/* make sure there is space next character */
if (cp + 1 >= el->el_line.limit) {
idx = (cp - el->el_line.buffer);
@@ -480,12 +486,14 @@ el_gets(EditLine *el, int *nread)
if (crlf)
break;
}
+ if (num == -1 && errno == EINTR)
+ cp = el->el_line.buffer;
el->el_line.cursor = el->el_line.lastchar = cp;
*cp = '\0';
if (nread)
*nread = el->el_line.cursor - el->el_line.buffer;
- return (el->el_line.buffer);
+ return (*nread ? el->el_line.buffer : NULL);
}
for (num = OKCMD; num == OKCMD;) { /* while still editing this
@@ -501,6 +509,13 @@ el_gets(EditLine *el, int *nread)
#endif /* DEBUG_READ */
break;
}
+ if (el->el_errno == EINTR) {
+ el->el_line.buffer[0] = '\0';
+ el->el_line.lastchar =
+ el->el_line.cursor = el->el_line.buffer;
+ num = 0;
+ break;
+ }
if ((unsigned int)cmdnum >= (unsigned int)el->el_map.nfunc) { /* BUG CHECK command */
#ifdef DEBUG_EDIT
(void) fprintf(el->el_errfile,