text: #define _GNU_SOURCE
  #include <stdio.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;
  }
  