1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*	$NetBSD: getpass.c,v 1.15 2003/08/07 16:42:50 agc Exp $	*/
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 1988, 1993
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Redistribution and use in source and binary forms, with or without
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * modification, are permitted provided that the following conditions
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * are met:
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    documentation and/or other materials provided with the distribution.
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    may be used to endorse or promote products derived from this software
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *    without specific prior written permission.
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SUCH DAMAGE.
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if 0
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <sys/cdefs.h>
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if defined(LIBC_SCCS) && !defined(lint)
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if 0
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic char sccsid[] = "@(#)getpass.c	8.1 (Berkeley) 6/4/93";
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project__RCSID("$NetBSD: getpass.c,v 1.15 2003/08/07 16:42:50 agc Exp $");
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* LIBC_SCCS and not lint */
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "namespace.h"
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <assert.h>
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <paths.h>
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <pwd.h>
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <signal.h>
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <stdio.h>
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <termios.h>
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <unistd.h>
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if 0
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef __weak_alias
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project__weak_alias(getpass,_getpass)
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar *
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectgetpass(prompt)
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	const char *prompt;
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct termios term;
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	int ch;
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char *p;
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	FILE *fp, *outfp;
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	int echo;
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	static char buf[_PASSWORD_LEN + 1];
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	sigset_t oset, nset;
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if 0
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	_DIAGASSERT(prompt != NULL);
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/*
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * read and write to /dev/tty if possible; else read from
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * stdin and write to stderr.
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 */
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if ((outfp = fp = fopen(_PATH_TTY, "w+")) == NULL) {
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		outfp = stderr;
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		fp = stdin;
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/*
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * note - blocking signals isn't necessarily the
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * right thing, but we leave it for now.
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 */
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	sigemptyset(&nset);
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	sigaddset(&nset, SIGINT);
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	sigaddset(&nset, SIGTSTP);
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	(void)sigprocmask(SIG_BLOCK, &nset, &oset);
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	(void)tcgetattr(fileno(fp), &term);
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if ((echo = (term.c_lflag & ECHO)) != 0) {
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		term.c_lflag &= ~ECHO;
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		(void)tcsetattr(fileno(fp), TCSAFLUSH /*|TCSASOFT*/, &term);
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (prompt != NULL)
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		(void)fputs(prompt, outfp);
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	rewind(outfp);			/* implied flush */
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	for (p = buf; (ch = getc(fp)) != EOF && ch != '\n';)
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (p < buf + _PASSWORD_LEN)
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			*p++ = ch;
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	*p = '\0';
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	(void)write(fileno(outfp), "\n", 1);
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (echo) {
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		term.c_lflag |= ECHO;
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		(void)tcsetattr(fileno(fp), TCSAFLUSH/*|TCSASOFT*/, &term);
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (fp != stdin)
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		(void)fclose(fp);
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	return(buf);
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
115