/*
* Copyright 2006, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Axel Dörfler, axeld@pinc-software.de
*/
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
char *
getpass(const char *prompt)
{
static char password[128];
struct termios termios;
bool changed = false;
// Turn off echo
if (tcgetattr(fileno(stdin), &termios) == 0) {
struct termios noEchoTermios = termios;
noEchoTermios.c_lflag &= ~(ECHO | ISIG);
changed = tcsetattr(fileno(stdin), TCSAFLUSH, &noEchoTermios) == 0;
}
// Show prompt
fputs(prompt, stdout);
fflush(stdout);
// Read password
if (fgets(password, sizeof(password), stdin) != NULL) {
size_t length = strlen(password);
if (password[length - 1] == '\n')
password[length - 1] = '\0';
if (changed) {
// Manually move to the next line
putchar('\n');
}
}
// Restore termios setting
if (changed)
tcsetattr(fileno(stdin), TCSAFLUSH, &termios);
return password;
}
↑ V1010 Unchecked tainted data is used in index: 'length'.