projects
/
silc.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
ca4ecac
)
Handle EAGAIN and EINTR correctly in silc_get_input in case of error
author
Pekka Riikonen
<priikone@silcnet.org>
Sat, 30 Aug 2008 12:08:03 +0000
(15:08 +0300)
committer
Pekka Riikonen
<priikone@silcnet.org>
Sat, 30 Aug 2008 12:08:03 +0000
(15:08 +0300)
lib/silcutil/silcutil.c
patch
|
blob
|
history
diff --git
a/lib/silcutil/silcutil.c
b/lib/silcutil/silcutil.c
index 5d656b78881324c70aa4d0a4c50e234e4d365ad0..0cb176e7739ba60576e78c86edd08030a0e33f63 100644
(file)
--- a/
lib/silcutil/silcutil.c
+++ b/
lib/silcutil/silcutil.c
@@
-557,13
+557,18
@@
char *silc_get_input(const char *prompt, SilcBool echo_off)
printf("%s", prompt);
fflush(stdout);
printf("%s", prompt);
fflush(stdout);
+ read_again1:
if ((read(fd, input, sizeof(input))) < 0) {
if ((read(fd, input, sizeof(input))) < 0) {
+ if (errno == EAGAIN || errno == EINTR)
+ goto read_again1;
fprintf(stderr, "silc: %s\n", strerror(errno));
fprintf(stderr, "silc: %s\n", strerror(errno));
+ signal(SIGINT, SIG_DFL);
tcsetattr(fd, TCSANOW, &to_old);
return NULL;
}
if (strlen(input) <= 1) {
tcsetattr(fd, TCSANOW, &to_old);
return NULL;
}
if (strlen(input) <= 1) {
+ signal(SIGINT, SIG_DFL);
tcsetattr(fd, TCSANOW, &to_old);
return NULL;
}
tcsetattr(fd, TCSANOW, &to_old);
return NULL;
}
@@
-591,11
+596,19
@@
char *silc_get_input(const char *prompt, SilcBool echo_off)
printf("%s", prompt);
fflush(stdout);
printf("%s", prompt);
fflush(stdout);
+ signal(SIGINT, SIG_IGN);
+
+ read_again2:
if ((read(fd, input, sizeof(input))) < 0) {
if ((read(fd, input, sizeof(input))) < 0) {
+ if (errno == EAGAIN || errno == EINTR)
+ goto read_again2;
fprintf(stderr, "silc: %s\n", strerror(errno));
fprintf(stderr, "silc: %s\n", strerror(errno));
+ signal(SIGINT, SIG_DFL);
return NULL;
}
return NULL;
}
+ signal(SIGINT, SIG_DFL);
+
if (strlen(input) <= 1)
return NULL;
if (strlen(input) <= 1)
return NULL;