1*16497Sralph /* @(#)getpass.c 4.3 (Berkeley) 05/16/84 */ 22017Swnj #include <stdio.h> 32017Swnj #include <signal.h> 42017Swnj #include <sgtty.h> 52017Swnj 62017Swnj char * 72017Swnj getpass(prompt) 82017Swnj char *prompt; 92017Swnj { 102017Swnj struct sgttyb ttyb; 112017Swnj int flags; 122017Swnj register char *p; 132017Swnj register c; 142017Swnj FILE *fi; 152017Swnj static char pbuf[9]; 162017Swnj int (*signal())(); 172017Swnj int (*sig)(); 182017Swnj 192017Swnj if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL) 202017Swnj fi = stdin; 212017Swnj else 222017Swnj setbuf(fi, (char *)NULL); 232017Swnj sig = signal(SIGINT, SIG_IGN); 24*16497Sralph ioctl(fileno(fi), TIOCGETP, &ttyb); 252017Swnj flags = ttyb.sg_flags; 262017Swnj ttyb.sg_flags &= ~ECHO; 27*16497Sralph ioctl(fileno(fi), TIOCSETP, &ttyb); 283919Sroot fprintf(stderr, "%s", prompt); fflush(stderr); 292017Swnj for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) { 302017Swnj if (p < &pbuf[8]) 312017Swnj *p++ = c; 322017Swnj } 332017Swnj *p = '\0'; 343919Sroot fprintf(stderr, "\n"); fflush(stderr); 352017Swnj ttyb.sg_flags = flags; 36*16497Sralph ioctl(fileno(fi), TIOCSETP, &ttyb); 372017Swnj signal(SIGINT, sig); 382017Swnj if (fi != stdin) 392017Swnj fclose(fi); 402017Swnj return(pbuf); 412017Swnj } 42