#define _GNU_SOURCE | |
#include <stdio.h> | |
#include <termios.h> | |
#include <unistd.h> | |
#include <fcntl.h> | |
#include <string.h> | |
char* getpass(const char* prompt) { | |
int fd; | |
struct termios s, t; | |
ssize_t l; | |
static char password[128]; | |
if ((fd = open("/dev/tty", O_RDWR | O_NOCTTY | O_CLOEXEC)) < 0) | |
return 0; | |
tcgetattr(fd, &t); | |
s = t; | |
t.c_lflag &= ~(ECHO | ISIG); | |
t.c_lflag |= ICANON; | |
t.c_iflag &= ~(INLCR | IGNCR); | |
t.c_iflag |= ICRNL; | |
tcsetattr(fd, TCSAFLUSH, &t); | |
tcdrain(fd); | |
dprintf(fd, "%s", prompt); | |
l = read(fd, password, sizeof password); | |
if (l >= 0) { | |
if (l > 0 && password[l - 1] == '\n') | |
l--; | |
password[l] = 0; | |
} | |
tcsetattr(fd, TCSAFLUSH, &s); | |
dprintf(fd, "\n"); | |
close(fd); | |
return l < 0 ? 0 : password; | |
} |