13e12c5d1SDavid du Colombier #define _POSIX_SOURCE 23e12c5d1SDavid du Colombier #define _RESEARCH_SOURCE 33e12c5d1SDavid du Colombier #include <stdio.h> 43e12c5d1SDavid du Colombier #include <signal.h> 5*bad30d5dSDavid du Colombier #include <limits.h> 63e12c5d1SDavid du Colombier #include <libv.h> 73e12c5d1SDavid du Colombier 83e12c5d1SDavid du Colombier char * getpass(char * prompt)93e12c5d1SDavid du Colombiergetpass(char *prompt) 103e12c5d1SDavid du Colombier { 111dce3b00SDavid du Colombier int c; 121dce3b00SDavid du Colombier char *p; 133e12c5d1SDavid du Colombier FILE *fi; 14*bad30d5dSDavid du Colombier static char pbuf[PASS_MAX]; 153e12c5d1SDavid du Colombier void (*sig)(int); 163e12c5d1SDavid du Colombier 173e12c5d1SDavid du Colombier if ((fi = fopen("/dev/cons", "r")) == NULL) 183e12c5d1SDavid du Colombier fi = stdin; 193e12c5d1SDavid du Colombier else 201dce3b00SDavid du Colombier setbuf(fi, NULL); 213e12c5d1SDavid du Colombier sig = signal(SIGINT, SIG_IGN); 223e12c5d1SDavid du Colombier tty_echooff(fileno(fi)); 231dce3b00SDavid du Colombier fprintf(stderr, "%s", prompt); 241dce3b00SDavid du Colombier fflush(stderr); 251dce3b00SDavid du Colombier 261dce3b00SDavid du Colombier for (p = pbuf; (c = getc(fi)) != '\n' && c != EOF; ) 271dce3b00SDavid du Colombier if (c == ('u' & 037)) 281dce3b00SDavid du Colombier p = pbuf; 291dce3b00SDavid du Colombier else if (c == '\b') { 301dce3b00SDavid du Colombier if (p > pbuf) 311dce3b00SDavid du Colombier p--; 32*bad30d5dSDavid du Colombier } else if (p < &pbuf[sizeof(pbuf)-1]) 333e12c5d1SDavid du Colombier *p++ = c; 343e12c5d1SDavid du Colombier *p = '\0'; 351dce3b00SDavid du Colombier 361dce3b00SDavid du Colombier fprintf(stderr, "\n"); 371dce3b00SDavid du Colombier fflush(stderr); 383e12c5d1SDavid du Colombier tty_echoon(fileno(fi)); 393e12c5d1SDavid du Colombier signal(SIGINT, sig); 403e12c5d1SDavid du Colombier if (fi != stdin) 413e12c5d1SDavid du Colombier fclose(fi); 423e12c5d1SDavid du Colombier return(pbuf); 433e12c5d1SDavid du Colombier } 44