|
|
1.1 root 1: /*
2: * Coherent I/O Library.
3: * getpass -- get a password from the controlling
4: * terminal with echo suppressed.
5: */
6:
7: #include <stdio.h>
8: #include <sgtty.h>
9: #include <signal.h>
10:
11: #define NPASS 50 /* Characters in a password */
12:
13: static char tty[] = "/dev/tty";
14: static struct sgttyb sg;
15: static int omode;
16: static FILE *ifp;
17: static FILE *ofp;
18: static int (*ofunc)();
19:
20: char *
21: getpass(pp)
22: char *pp;
23: {
24: static char passwd[NPASS+1];
25: char *p;
26: int c;
27: int reset();
28:
29: if ((ofp = fopen(tty, "r+w")) != NULL)
30: ifp = ofp;
31: else {
32: ifp = stdin;
33: ofp = stderr;
34: }
35: if ((ofunc = signal(SIGINT, reset)) != SIG_IGN)
36: signal(SIGINT, reset);
37: ioctl(fileno(ofp), TIOCGETP, &sg);
38: omode = sg.sg_flags;
39: sg.sg_flags &= ~ECHO;
40: ioctl(fileno(ofp), TIOCSETP, &sg);
41: while (*pp)
42: putc(*pp++, ofp);
43: p = passwd;
44: while ((c=getc(ifp))!=EOF && c!='\n') {
45: if (p < &passwd[NPASS])
46: *p++ = c;
47: }
48: while (p < &passwd[NPASS])
49: *p++ = '\0';
50: reset();
51: if (ifp != stdin)
52: fclose(ifp);
53: signal(SIGINT, ofunc);
54: return (c==EOF ? NULL : passwd);
55: }
56:
57: /*
58: * Reset echo on and signal catching.
59: */
60: static
61: reset()
62: {
63: signal(SIGINT, ofunc);
64: sg.sg_flags = omode;
65: ioctl(fileno(ofp), TIOCSETP, &sg);
66: if (omode & ECHO)
67: putc('\n', ofp);
68: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.