#include #include #include #include #include char *getpass(const char *prompt) { int fd; struct termios s, t; ssize_t l; static char password[128]; if ((fd = open("/dev/tty", O_RDONLY|O_NOCTTY)) < 0) fd = 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); fputs(prompt, stderr); fflush(stderr); l = read(fd, password, sizeof password); if (l >= 0) { if (l > 0 && password[l-1] == '\n') l--; password[l] = 0; } tcsetattr(fd, TCSAFLUSH, &s); if (fd > 2) close(fd); return password; }