|
|
1.1 ! root 1: /* @(#)getpass.c 1.4 */ ! 2: /* 3.0 SID # 1.4 */ ! 3: /*LINTLIBRARY*/ ! 4: #include <stdio.h> ! 5: #include <signal.h> ! 6: #include <termio.h> ! 7: ! 8: extern void setbuf(); ! 9: extern FILE *fopen(); ! 10: extern int fclose(), fprintf(), findiop(); ! 11: extern int kill(), ioctl(), getpid(); ! 12: static int intrupt; ! 13: ! 14: char * ! 15: getpass(prompt) ! 16: char *prompt; ! 17: { ! 18: struct termio ttyb; ! 19: unsigned short flags; ! 20: register char *p; ! 21: register int c; ! 22: FILE *fi; ! 23: static char pbuf[128]; ! 24: int (*sig)(), catch(); ! 25: ! 26: if((fi = fopen("/dev/tty", "r")) == NULL) ! 27: return((char*)NULL); ! 28: else ! 29: setbuf(fi, (char*)NULL); ! 30: sig = signal(SIGINT, catch); ! 31: intrupt = 0; ! 32: (void) ioctl(fileno(fi), TCGETA, &ttyb); ! 33: flags = ttyb.c_lflag; ! 34: ttyb.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); ! 35: (void) ioctl(fileno(fi), TCSETAF, &ttyb); ! 36: (void) fputs(prompt, stderr); ! 37: for(p=pbuf; !intrupt && (c = getc(fi)) != '\n' && c != EOF; ) { ! 38: if(p < &pbuf[127]) ! 39: *p++ = c; ! 40: } ! 41: *p = '\0'; ! 42: (void) putc('\n', stderr); ! 43: ttyb.c_lflag = flags; ! 44: (void) ioctl(fileno(fi), TCSETA, &ttyb); ! 45: (void) signal(SIGINT, sig); ! 46: if(fi != stdin) ! 47: (void) fclose(fi); ! 48: if(intrupt) ! 49: (void) kill(getpid(), SIGINT); ! 50: return(pbuf); ! 51: } ! 52: ! 53: static int ! 54: catch() ! 55: { ! 56: ++intrupt; ! 57: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.