1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
/* getpass */
/*
* Copyright (c) 1988 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getpass.c based on 5.3 (Berkeley) 9/22/88";
#endif /* LIBC_SCCS and not lint */
#if defined(__NetBSD__)
#define USE_OLD_TTY
#endif
/* >>> Craig Metz */
#if defined(LINUX)
#define SVR3
#endif
/* <<< Craig Metz */
#if defined(SOLARIS) || defined(hpux)
#include <signal.h>
#include <sgtty.h>
#include <sys/ioctl.h>
#else
#ifdef SVR3
#include <termio.h>
#else
#include <sys/ioctl.h>
#endif
#include <sys/signal.h>
#endif
#include <stdio.h>
char *
getpass(prompt)
char *prompt;
{
#ifdef SVR3
struct termio term_struct;
tcflag_t svflagval;
#else
struct sgttyb ttyb;
int svflagval;
#endif
register int ch;
register char *p;
FILE *fp, *outfp;
#ifdef SOLARIS
sigset_t maskset;
#else
long omask;
#endif
#define PASSWD_LEN 128
static char buf[PASSWD_LEN + 1];
/*
* read and write to /dev/tty if possible; else read from
* stdin and write to stderr.
*/
if ((outfp = fp = fopen("/dev/tty", "w+")) == NULL) {
outfp = stderr;
fp = stdin;
}
#ifdef SVR3
(void)ioctl(fileno(fp), TCGETA, &term_struct);
svflagval = term_struct.c_lflag;
term_struct.c_lflag &= ~ECHO;
#else
(void)ioctl(fileno(fp), TIOCGETP, &ttyb);
svflagval = ttyb.sg_flags;
ttyb.sg_flags &= ~ECHO;
#endif
#ifdef SOLARIS
if (sigprocmask(0, (sigset_t *)0, &maskset) || sighold(SIGINT)) {
perror("Can't block SIGINT in getpass() ");
exit(1);
}
#else
omask = sigblock(sigmask(SIGINT));
#endif
#ifdef SVR3
(void)ioctl(fileno(fp), TCSETA, &term_struct);
#else
(void)ioctl(fileno(fp), TIOCSETP, &ttyb);
#endif
fputs(prompt, outfp);
rewind(outfp); /* implied flush */
for (p = buf; (ch = getc(fp)) != EOF && ch != '\n';)
if (p < buf + PASSWD_LEN)
*p++ = ch;
*p = '\0';
(void)write(fileno(outfp), "\n", 1);
#ifdef SVR3
term_struct.c_lflag = svflagval;
(void)ioctl(fileno(fp), TCSETA, &term_struct);
#else
ttyb.sg_flags = svflagval;
(void)ioctl(fileno(fp), TIOCSETP, &ttyb);
#endif
#ifdef SOLARIS
if (sigprocmask(SIG_SETMASK, &maskset, (sigset_t *)0)) {
perror("Can't restore signal mask in getpass() ");
exit(1);
}
#else
(void)sigsetmask(omask);
#endif
if (fp != stdin)
(void)fclose(fp);
return(buf);
}
|