Merge branch 'topic/mm-fixes' of git://208.110.73.182/silc into silc.1.1.branch
[silc.git] / lib / silcutil / silcutil.c
index daea86c3dfe2e7a769c0d9a0fb4ed62741733ea0..0cb176e7739ba60576e78c86edd08030a0e33f63 100644 (file)
@@ -116,11 +116,13 @@ int silc_parse_userfqdn(const char *string,
 {
   SilcUInt32 tlen;
 
-  if (!user || !fqdn)
+  if (!user && !fqdn)
     return 0;
 
-  memset(user, 0, user_size);
-  memset(fqdn, 0, fqdn_size);
+  if (user)
+    memset(user, 0, user_size);
+  if (user)
+    memset(fqdn, 0, fqdn_size);
 
   if (!string)
     return 0;
@@ -555,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;
     }
@@ -589,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;