cleanup src/linux and src/misc trees, etc.
[musl] / src / legacy / getpass.c
diff --git a/src/legacy/getpass.c b/src/legacy/getpass.c
new file mode 100644 (file)
index 0000000..d439a2a
--- /dev/null
@@ -0,0 +1,39 @@
+#include <stdio.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#include <fcntl.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_RDONLY|O_NOCTTY)) < 0) fd = 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);
+
+       fputs(prompt, stderr);
+       fflush(stderr);
+
+       l = read(fd, password, sizeof password);
+       if (l >= 0) {
+               if (l > 0 && password[l-1] == '\n') l--;
+               password[l] = 0;
+       }
+
+       tcsetattr(fd, TCSAFLUSH, &s);
+
+       if (fd > 2) close(fd);
+
+       return password;
+}