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