1 #define _POSIX_SOURCE 2 #define _RESEARCH_SOURCE 3 #include <stdio.h> 4 #include <signal.h> 5 #include <libv.h> 6 7 char * 8 getpass(char *prompt) 9 { 10 int c; 11 char *p; 12 FILE *fi; 13 static char pbuf[9]; 14 void (*sig)(int); 15 16 if ((fi = fopen("/dev/cons", "r")) == NULL) 17 fi = stdin; 18 else 19 setbuf(fi, NULL); 20 sig = signal(SIGINT, SIG_IGN); 21 tty_echooff(fileno(fi)); 22 fprintf(stderr, "%s", prompt); 23 fflush(stderr); 24 25 for (p = pbuf; (c = getc(fi)) != '\n' && c != EOF; ) 26 if (c == ('u' & 037)) 27 p = pbuf; 28 else if (c == '\b') { 29 if (p > pbuf) 30 p--; 31 } else if (p < &pbuf[8]) 32 *p++ = c; 33 *p = '\0'; 34 35 fprintf(stderr, "\n"); 36 fflush(stderr); 37 tty_echoon(fileno(fi)); 38 signal(SIGINT, sig); 39 if (fi != stdin) 40 fclose(fi); 41 return(pbuf); 42 } 43