1: #include <stdio.h> 2: #include <signal.h> 3: #include <sgtty.h> 4: 5: char * 6: getpass(prompt) 7: char *prompt; 8: { 9: struct sgttyb ttyb; 10: int flags; 11: register char *p; 12: register c; 13: FILE *fi; 14: static char pbuf[9]; 15: int (*signal())(); 16: int (*sig)(); 17: 18: if ((fi = fopen("/dev/tty", "r")) == NULL) 19: fi = stdin; 20: else 21: setbuf(fi, (char *)NULL); 22: sig = signal(SIGINT, SIG_IGN); 23: gtty(fileno(fi), &ttyb); 24: flags = ttyb.sg_flags; 25: ttyb.sg_flags &= ~ECHO; 26: stty(fileno(fi), &ttyb); 27: fprintf(stderr, prompt); 28: for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) { 29: if (p < &pbuf[8]) 30: *p++ = c; 31: } 32: *p = '\0'; 33: fprintf(stderr, "\n"); 34: ttyb.sg_flags = flags; 35: stty(fileno(fi), &ttyb); 36: signal(SIGINT, sig); 37: if (fi != stdin) 38: fclose(fi); 39: return(pbuf); 40: }