| #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; |
| } |