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  }