1/*
2 * Copyright 2006, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Axel D��rfler, axeld@pinc-software.de
7 */
8
9
10#include <stdbool.h>
11#include <stdio.h>
12#include <string.h>
13#include <termios.h>
14#include <unistd.h>
15
16
17char *
18getpass(const char *prompt)
19{
20	static char password[128];
21	struct termios termios;
22	bool changed = false;
23
24	// Turn off echo
25
26	if (tcgetattr(fileno(stdin), &termios) == 0) {
27		struct termios noEchoTermios = termios;
28
29		noEchoTermios.c_lflag &= ~(ECHO | ISIG);
30		changed = tcsetattr(fileno(stdin), TCSAFLUSH, &noEchoTermios) == 0;
31    }
32
33	// Show prompt
34	fputs(prompt, stdout);
35	fflush(stdout);
36
37	// Read password
38	if (fgets(password, sizeof(password), stdin) != NULL) {
39		size_t length = strlen(password);
40
41		if (length > 0 && (password[length - 1] == '\n'))
42			password[length - 1] = '\0';
43
44		if (changed) {
45			// Manually move to the next line
46			putchar('\n');
47		}
48	}
49
50	// Restore termios setting
51	if (changed)
52		tcsetattr(fileno(stdin), TCSAFLUSH, &termios);
53
54	return password;
55}
56