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