1*26559Sdonn #if defined(LIBC_SCCS) && !defined(lint) 2*26559Sdonn static char sccsid[] = "@(#)getpass.c 5.2 (Berkeley) 03/09/86"; 3*26559Sdonn #endif LIBC_SCCS and not lint 422094Smckusick 52017Swnj #include <stdio.h> 62017Swnj #include <signal.h> 72017Swnj #include <sgtty.h> 82017Swnj 92017Swnj char * 102017Swnj getpass(prompt) 112017Swnj char *prompt; 122017Swnj { 132017Swnj struct sgttyb ttyb; 142017Swnj int flags; 152017Swnj register char *p; 162017Swnj register c; 172017Swnj FILE *fi; 182017Swnj static char pbuf[9]; 192017Swnj int (*signal())(); 202017Swnj int (*sig)(); 212017Swnj 222017Swnj if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL) 232017Swnj fi = stdin; 242017Swnj else 252017Swnj setbuf(fi, (char *)NULL); 262017Swnj sig = signal(SIGINT, SIG_IGN); 2716497Sralph ioctl(fileno(fi), TIOCGETP, &ttyb); 282017Swnj flags = ttyb.sg_flags; 292017Swnj ttyb.sg_flags &= ~ECHO; 3016497Sralph ioctl(fileno(fi), TIOCSETP, &ttyb); 313919Sroot fprintf(stderr, "%s", prompt); fflush(stderr); 322017Swnj for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) { 332017Swnj if (p < &pbuf[8]) 342017Swnj *p++ = c; 352017Swnj } 362017Swnj *p = '\0'; 373919Sroot fprintf(stderr, "\n"); fflush(stderr); 382017Swnj ttyb.sg_flags = flags; 3916497Sralph ioctl(fileno(fi), TIOCSETP, &ttyb); 402017Swnj signal(SIGINT, sig); 412017Swnj if (fi != stdin) 422017Swnj fclose(fi); 432017Swnj return(pbuf); 442017Swnj } 45