summaryrefslogtreecommitdiffstats
path: root/libc-top-half/musl/src/legacy/getpass.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc-top-half/musl/src/legacy/getpass.c')
-rw-r--r--libc-top-half/musl/src/legacy/getpass.c40
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;
+}