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