]> granicus.if.org Git - curl/commitdiff
fixed NetWare CLIB implementation of getpass_r()
authorGunter Knauf <gk@gknw.de>
Fri, 6 Jul 2007 14:58:59 +0000 (14:58 +0000)
committerGunter Knauf <gk@gknw.de>
Fri, 6 Jul 2007 14:58:59 +0000 (14:58 +0000)
src/getpass.c

index 244b29b9e81c896942d5adb0f9a6cd58c94c4496..26d7433ea8ce6554f61816de48042f7b52f80168 100644 (file)
@@ -136,18 +136,27 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
 #include <nwconio.h>
 char *getpass_r(const char *prompt, char *buffer, size_t buflen)
 {
-  int i = 0;
-  int c;
+  size_t i = 0;
 
   printf("%s", prompt);
   do {
-    c = getch();
-    if (c != 13) {
-      buffer[i] = c;
-      i++;
-      printf("%s", "*");
+    buffer[i++] = getch();
+    if (buffer[i-1] == '\b') {
+      /* remove this letter and if this is not the first key,
+         remove the previous one as well */
+      if (i > 1) {   
+        printf("\b \b");
+        i = i - 2;
+      } else {
+        RingTheBell();
+        i = i - 1;
+      }
+    } else if (buffer[i-1] != 13) {
+      putchar('*');
     }
-  } while ((c != 13) && (i < buflen));
+  } while ((buffer[i-1] != 13) && (i < buflen));
+  buffer[i-1] = 0;
+  printf("\r\n");
   return buffer;
 }
 #endif /* __NOVELL_LIBC__ */