#define _GNU_SOURCE #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_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; }