From: Todd C. Miller Date: Mon, 15 Feb 1993 18:57:44 +0000 (+0000) Subject: Initial revision X-Git-Tag: SUDO_1_3_0~126 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b2abb3f5c0af3c8751d826ba8e504d5d7855af25;p=sudo Initial revision --- b2abb3f5c0af3c8751d826ba8e504d5d7855af25 diff --git a/getpass.c b/getpass.c new file mode 100644 index 000000000..839d45469 --- /dev/null +++ b/getpass.c @@ -0,0 +1,77 @@ +#ifdef BROKEN_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 */ + +#include +#include +#ifdef sgi +#include +#endif +#include +#include +#include + +char * +getpass(prompt) + char *prompt; +{ + struct sgttyb ttyb; + register int ch; + register char *p; + FILE *fp, *outfp; + long omask; + int fd_tmp; + int svflagval; +#define PASSWD_LEN 8 + static char buf[PASSWD_LEN + 1]; + + /* + * read and write to /dev/tty if possible; else read from + * stdin and write to stderr. + */ + fd_tmp = open("/dev/tty", O_RDWR); + if (fd_tmp < 0 || (outfp = fp = fdopen(fd_tmp, "r+")) == NULL) { + outfp = stderr; + fp = stdin; + } + + (void)ioctl(fileno(fp), TIOCGETP, &ttyb); + svflagval = ttyb.sg_flags; + ttyb.sg_flags &= ~ECHO; + omask = sigblock(sigmask(SIGINT)); + (void)ioctl(fileno(fp), TIOCSETP, &ttyb); + + fprintf(outfp, "%s", prompt); + 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); + + ttyb.sg_flags = svflagval; + (void)ioctl(fileno(fp), TIOCSETP, &ttyb); + (void)sigsetmask(omask); + if (fp != stdin) + (void)fclose(fp); + return(buf); +} +#endif