github.com/afumu/libc@v0.0.6/musl/src/legacy/getpass.c (about) 1 #define _GNU_SOURCE 2 #include <stdio.h> 3 #include <termios.h> 4 #include <unistd.h> 5 #include <fcntl.h> 6 #include <string.h> 7 8 char *getpass(const char *prompt) 9 { 10 int fd; 11 struct termios s, t; 12 ssize_t l; 13 static char password[128]; 14 15 if ((fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_CLOEXEC)) < 0) return 0; 16 17 tcgetattr(fd, &t); 18 s = t; 19 t.c_lflag &= ~(ECHO|ISIG); 20 t.c_lflag |= ICANON; 21 t.c_iflag &= ~(INLCR|IGNCR); 22 t.c_iflag |= ICRNL; 23 tcsetattr(fd, TCSAFLUSH, &t); 24 tcdrain(fd); 25 26 dprintf(fd, "%s", prompt); 27 28 l = read(fd, password, sizeof password); 29 if (l >= 0) { 30 if (l > 0 && password[l-1] == '\n' || l==sizeof password) l--; 31 password[l] = 0; 32 } 33 34 tcsetattr(fd, TCSAFLUSH, &s); 35 36 dprintf(fd, "\n"); 37 close(fd); 38 39 return l<0 ? 0 : password; 40 }