From 103986117eb70b715d462b4d520a1f0912b8f90f Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sat, 30 Aug 2008 15:08:03 +0300 Subject: [PATCH] Handle EAGAIN and EINTR correctly in silc_get_input in case of error --- lib/silcutil/silcutil.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/silcutil/silcutil.c b/lib/silcutil/silcutil.c index 5d656b78..0cb176e7 100644 --- 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); + read_again1: if ((read(fd, input, sizeof(input))) < 0) { + if (errno == EAGAIN || errno == EINTR) + goto read_again1; fprintf(stderr, "silc: %s\n", strerror(errno)); + signal(SIGINT, SIG_DFL); tcsetattr(fd, TCSANOW, &to_old); return NULL; } if (strlen(input) <= 1) { + signal(SIGINT, SIG_DFL); 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); + signal(SIGINT, SIG_IGN); + + read_again2: if ((read(fd, input, sizeof(input))) < 0) { + if (errno == EAGAIN || errno == EINTR) + goto read_again2; fprintf(stderr, "silc: %s\n", strerror(errno)); + signal(SIGINT, SIG_DFL); return NULL; } + signal(SIGINT, SIG_DFL); + if (strlen(input) <= 1) return NULL; -- 2.24.0