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