| #define _GNU_SOURCE |
| #include <stdio.h> |
| #include <termios.h> |
| #include <unistd.h> |
| #include <fcntl.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_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; |
| } |