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