diff options
Diffstat (limited to 'libc-top-half/musl/src/legacy/getpass.c')
-rw-r--r-- | libc-top-half/musl/src/legacy/getpass.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/libc-top-half/musl/src/legacy/getpass.c b/libc-top-half/musl/src/legacy/getpass.c new file mode 100644 index 0000000..d51286c --- /dev/null +++ b/libc-top-half/musl/src/legacy/getpass.c @@ -0,0 +1,40 @@ +#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; +} |