2 * For license terms, see the file COPYING in this directory.
5 /***********************************************************************
8 programmer: Carl Harris, ceharris@mal.com
9 description: getpass() replacement which allows for long passwords.
11 ***********************************************************************/
18 #if defined(HAVE_UNISTD_H)
21 #include "fetchmail.h"
25 #define INPUT_BUF_SIZE PASSWORDLEN
27 #if defined(HAVE_TERMIOS_H) && defined(HAVE_TCSETATTR)
30 #if defined(HAVE_TERMIO_H)
31 # include <sys/ioctl.h>
34 #if defined(HAVE_SGTTY_H)
42 #if defined(HAVE_TCSETATTR)
43 static struct termios termb;
44 static tcflag_t flags;
46 #if defined(HAVE_TERMIO_H)
47 static struct termio termb;
48 static unsigned short flags;
50 #if defined(HAVE_STTY)
51 static struct sgttyb ttyb;
57 void save_tty_state();
58 void disable_tty_echo();
59 void restore_tty_state();
66 #if !(defined(HAVE_TCSETATTR) || defined(HAVE_TERMIO_H) || defined(HAVE_STTY))
68 #if defined(HAVE_GETPASS)
70 return getpass(prompt);
72 fputs("ERROR: no support for getpassword() routine\n",stderr);
76 #endif /* !(defined(HAVE_TCSETATTR) || ... */
81 static char pbuf[INPUT_BUF_SIZE];
83 RETSIGTYPE sigint_handler();
86 /* get the file descriptor for the input device */
87 if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL)
90 setbuf(fi, (char *)NULL);
92 /* store descriptor for the tty */
95 /* preserve tty state before turning off echo */
98 /* now that we have the current tty state, we can catch SIGINT and
100 sig = signal(SIGINT, sigint_handler);
102 /* turn off echo on the tty */
105 /* display the prompt and get the input string */
106 fprintf(stderr, "%s", prompt); fflush(stderr);
107 for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
108 if (p < &pbuf[INPUT_BUF_SIZE - 1])
113 /* write a newline so cursor won't appear to hang */
114 fprintf(stderr, "\n"); fflush(stderr);
116 /* restore previous state of the tty */
119 /* restore previous state of SIGINT */
133 #if defined(HAVE_TCSETATTR)
134 tcgetattr(ttyfd, &termb);
135 flags = termb.c_lflag;
137 #if defined(HAVE_TERMIO_H)
138 ioctl(ttyfd, TCGETA, (char *) &termb);
139 flags = termb.c_lflag;
140 #else /* we HAVE_STTY */
142 flags = ttyb.sg_flags;
151 /* turn off echo on the tty */
152 #if defined(HAVE_TCSETATTR)
153 termb.c_lflag &= ~ECHO;
154 tcsetattr(ttyfd, TCSAFLUSH, &termb);
156 #if defined(HAVE_TERMIO_H)
157 termb.c_lflag &= ~ECHO;
158 ioctl(ttyfd, TCSETA, (char *) &termb);
159 #else /* we HAVE_STTY */
160 ttyb.sg_flags &= ~ECHO;
171 /* restore previous tty echo state */
172 #if defined(HAVE_TCSETATTR)
173 termb.c_lflag = flags;
174 tcsetattr(ttyfd, TCSAFLUSH, &termb);
176 #if defined(HAVE_TERMIO_H)
177 termb.c_lflag = flags;
178 ioctl(ttyfd, TCSETA, (char *) &termb);
179 #else /* we HAVE_STTY */
180 ttyb.sg_flags = flags;
187 RETSIGTYPE sigint_handler ()
190 error(1, 0, "\nCaught signal... bailing out.");