Index: fusl/src/legacy/getpass.c |
diff --git a/fusl/src/legacy/getpass.c b/fusl/src/legacy/getpass.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..15ab9851e8f886d52187cf8910619b08f63cb5bc |
--- /dev/null |
+++ b/fusl/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--; |
+ password[l] = 0; |
+ } |
+ |
+ tcsetattr(fd, TCSAFLUSH, &s); |
+ |
+ dprintf(fd, "\n"); |
+ close(fd); |
+ |
+ return l<0 ? 0 : password; |
+} |