| #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==sizeof password) l--; |
| password[l] = 0; |
| } |
| |
| tcsetattr(fd, TCSAFLUSH, &s); |
| |
| dprintf(fd, "\n"); |
| close(fd); |
| |
| return l<0 ? 0 : password; |
| } |