|
|
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.