From: Pekka Riikonen Date: Sat, 30 Aug 2008 12:08:03 +0000 (+0300) Subject: Handle EAGAIN and EINTR correctly in silc_get_input in case of error X-Git-Tag: silc.client.1.1.5~2 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=103986117eb70b715d462b4d520a1f0912b8f90f Handle EAGAIN and EINTR correctly in silc_get_input in case of error --- 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;