|
|
1.1 root 1: /*
2: * Copyright (c) 1988 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted provided
6: * that: (1) source distributions retain this entire copyright notice and
7: * comment, and (2) distributions including binaries display the following
8: * acknowledgement: ``This product includes software developed by the
9: * University of California, Berkeley and its contributors'' in the
10: * documentation or other materials provided with the distribution and in
11: * all advertising materials mentioning features or use of this software.
12: * Neither the name of the University nor the names of its contributors may
13: * be used to endorse or promote products derived from this software without
14: * specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #if defined(LIBC_SCCS) && !defined(lint)
21: static char sccsid[] = "@(#)getpass.c 5.7 (Berkeley) 6/17/90";
22: #endif /* LIBC_SCCS and not lint */
23:
24: #include <sys/termios.h>
25: #include <sys/signal.h>
26: #include <stdio.h>
27: #include <pwd.h>
28:
29: char *
30: getpass(prompt)
31: char *prompt;
32: {
33: struct termios term;
34: register int ch;
35: register char *p;
36: FILE *fp, *outfp;
37: long omask;
38: int echo;
39: static char buf[_PASSWORD_LEN + 1];
40:
41: /*
42: * read and write to /dev/tty if possible; else read from
43: * stdin and write to stderr.
44: */
45: if ((outfp = fp = fopen("/dev/tty", "w+")) == NULL) {
46: outfp = stderr;
47: fp = stdin;
48: }
49: /*
50: * note - blocking signals isn't necessarily the
51: * right thing, but we leave it for now.
52: */
53: omask = sigblock(sigmask(SIGINT)|sigmask(SIGTSTP));
54: (void)tcgetattr(fileno(fp), &term);
55: if (echo = (term.c_lflag & ECHO)) {
56: term.c_lflag &= ~ECHO;
57: term.c_cflag |= CIGNORE;
58: (void)tcsetattr(fileno(fp), TCSAFLUSH, &term);
59: }
60: (void)fputs(prompt, outfp);
61: rewind(outfp); /* implied flush */
62: for (p = buf; (ch = getc(fp)) != EOF && ch != '\n';)
63: if (p < buf + _PASSWORD_LEN)
64: *p++ = ch;
65: *p = '\0';
66: (void)write(fileno(outfp), "\n", 1);
67: if (echo) {
68: term.c_lflag |= ECHO;
69: term.c_cflag |= CIGNORE;
70: tcsetattr(fileno(fp), TCSAFLUSH, &term);
71: }
72: (void)sigsetmask(omask);
73: if (fp != stdin)
74: (void)fclose(fp);
75: return(buf);
76: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.