Handle EAGAIN and EINTR correctly in silc_get_input in case of error
authorPekka Riikonen <priikone@silcnet.org>
Sat, 30 Aug 2008 12:08:03 +0000 (15:08 +0300)
committerPekka Riikonen <priikone@silcnet.org>
Sat, 30 Aug 2008 12:08:03 +0000 (15:08 +0300)
lib/silcutil/silcutil.c

index 5d656b78881324c70aa4d0a4c50e234e4d365ad0..0cb176e7739ba60576e78c86edd08030a0e33f63 100644 (file)
@@ -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;