X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=getpass.c;h=3c19ba7c832fb9f3825c3b98c6d29e7cd5024351;hb=d31db10231e9ed89f64fdf6e0fb7cae182aa377e;hp=e67ba670168e9147ecb38abba80ffa111f699dbb;hpb=eabdfb5e1ebf83147017c57db3659e7b2e8ecad1;p=~andy%2Ffetchmail diff --git a/getpass.c b/getpass.c index e67ba670..3c19ba7c 100644 --- a/getpass.c +++ b/getpass.c @@ -7,20 +7,24 @@ project: fetchmail programmer: Carl Harris, ceharris@mal.com description: getpass() replacement which allows for long passwords. - + This version hacked by Wilfred Teiken, allowing the + password to be piped to fetchmail. + ***********************************************************************/ -#include +#include "config.h" + #include #include #include +#include #if defined(HAVE_UNISTD_H) #include #endif +#include "fetchmail.h" +#include "i18n.h" -extern int optind; - -#define INPUT_BUF_SIZE MAX_PASSWORD_LENGTH +#define INPUT_BUF_SIZE PASSWORDLEN #if defined(HAVE_TERMIOS_H) && defined(HAVE_TCSETATTR) # include @@ -52,139 +56,142 @@ static int ttyfd; #endif #endif -void save_tty_state(); -void disable_tty_echo(); -void restore_tty_state(); +static void save_tty_state(void); +static void disable_tty_echo(void); +static void restore_tty_state(void); +static RETSIGTYPE sigint_handler(int); -char * -getpassword(prompt) -char *prompt; +char *fm_getpassword(char *prompt) { - #if !(defined(HAVE_TCSETATTR) || defined(HAVE_TERMIO_H) || defined(HAVE_STTY)) - #if defined(HAVE_GETPASS) - char *getpass(); - return getpass(prompt); + char *getpass(); + return getpass(prompt); #else - fputs("ERROR: no support for getpassword() routine\n",stderr); - exit(1); + fputs(GT_("ERROR: no support for getpassword() routine\n"),stderr); + exit(1); #endif - +#else + register char *p; + register int c; + FILE *fi; + static char pbuf[INPUT_BUF_SIZE]; + SIGHANDLERTYPE sig = 0; /* initialization pacifies -Wall */ + + int istty = isatty(0); + + /* get the file descriptor for the actual input device if it's a tty */ + if (istty) + { + if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL) + fi = stdin; + else + setbuf(fi, (char *)NULL); + } + else + fi = stdin; + + /* store descriptor for the tty */ + ttyfd = fileno(fi); + + if (istty) + { + /* preserve tty state before turning off echo */ + save_tty_state(); + + /* now that we have the current tty state, we can catch SIGINT and + exit gracefully */ + sig = set_signal_handler(SIGINT, sigint_handler); + + /* turn off echo on the tty */ + disable_tty_echo(); + + /* display the prompt and get the input string */ + fprintf(stderr, "%s", prompt); + } + + for (p = pbuf; (c = getc(fi))!='\n' && c!=EOF;) + { + if (p < &pbuf[INPUT_BUF_SIZE - 1]) + *p++ = c; + } + *p = '\0'; + + /* write a newline so cursor won't appear to hang */ + if (fi != stdin) + fprintf(stderr, "\n"); + + if (istty) + { + /* restore previous state of the tty */ + restore_tty_state(); + + /* restore previous state of SIGINT */ + set_signal_handler(SIGINT, sig); + } + if (fi != stdin) + fclose(fi); /* not checking should be safe, file mode was "r" */ + + return(pbuf); #endif /* !(defined(HAVE_TCSETATTR) || ... */ - - register char *p; - register c; - FILE *fi; - static char pbuf[INPUT_BUF_SIZE]; - RETSIGTYPE (*sig)(); - RETSIGTYPE sigint_handler(); - - - /* get the file descriptor for the input device */ - if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL) - fi = stdin; - else - setbuf(fi, (char *)NULL); - - /* store descriptor for the tty */ - ttyfd = fileno(fi); - - /* preserve tty state before turning off echo */ - save_tty_state(); - - /* now that we have the current tty state, we can catch SIGINT and - exit gracefully */ - sig = signal(SIGINT, sigint_handler); - - /* turn off echo on the tty */ - disable_tty_echo(); - - /* display the prompt and get the input string */ - fprintf(stderr, "%s", prompt); fflush(stderr); - for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) { - if (p < &pbuf[INPUT_BUF_SIZE - 1]) - *p++ = c; - } - *p = '\0'; - - /* write a newline so cursor won't appear to hang */ - fprintf(stderr, "\n"); fflush(stderr); - - /* restore previous state of the tty */ - restore_tty_state(); - - /* restore previous state of SIGINT */ - signal(SIGINT, sig); - - if (fi != stdin) - fclose(fi); - - return(pbuf); - } - -void -save_tty_state () +static void save_tty_state (void) { #if defined(HAVE_TCSETATTR) - tcgetattr(ttyfd, &termb); - flags = termb.c_lflag; + tcgetattr(ttyfd, &termb); + flags = termb.c_lflag; #else #if defined(HAVE_TERMIO_H) - ioctl(ttyfd, TCGETA, (char *) &termb); - flags = termb.c_lflag; + ioctl(ttyfd, TCGETA, (char *) &termb); + flags = termb.c_lflag; #else /* we HAVE_STTY */ - gtty(ttyfd, &ttyb); - flags = ttyb.sg_flags; + gtty(ttyfd, &ttyb); + flags = ttyb.sg_flags; #endif #endif } - -void -disable_tty_echo() +static void disable_tty_echo(void) { - /* turn off echo on the tty */ + /* turn off echo on the tty */ #if defined(HAVE_TCSETATTR) - termb.c_lflag &= ~ECHO; - tcsetattr(ttyfd, TCSAFLUSH, &termb); + termb.c_lflag &= ~ECHO; + tcsetattr(ttyfd, TCSAFLUSH, &termb); #else #if defined(HAVE_TERMIO_H) - termb.c_lflag &= ~ECHO; - ioctl(ttyfd, TCSETA, (char *) &termb); + termb.c_lflag &= ~ECHO; + ioctl(ttyfd, TCSETA, (char *) &termb); #else /* we HAVE_STTY */ - ttyb.sg_flags &= ~ECHO; - stty(ttyfd, &ttyb); + ttyb.sg_flags &= ~ECHO; + stty(ttyfd, &ttyb); #endif #endif } - - -void -restore_tty_state() +static void restore_tty_state(void) { - /* restore previous tty echo state */ + /* restore previous tty echo state */ #if defined(HAVE_TCSETATTR) - termb.c_lflag = flags; - tcsetattr(ttyfd, TCSAFLUSH, &termb); + termb.c_lflag = flags; + tcsetattr(ttyfd, TCSAFLUSH, &termb); #else #if defined(HAVE_TERMIO_H) - termb.c_lflag = flags; - ioctl(ttyfd, TCSETA, (char *) &termb); + termb.c_lflag = flags; + ioctl(ttyfd, TCSETA, (char *) &termb); #else /* we HAVE_STTY */ - ttyb.sg_flags = flags; - stty(ttyfd, &ttyb); + ttyb.sg_flags = flags; + stty(ttyfd, &ttyb); #endif #endif } - -RETSIGTYPE sigint_handler () +static RETSIGTYPE sigint_handler(int signum) { - restore_tty_state(); - fputs("\nCaught signal... bailing out.\n", stderr); - exit(1); + (void)signum; + restore_tty_state(); + report(stderr, GT_("\nCaught SIGINT... bailing out.\n")); + exit(1); } + +/* getpass.c ends here */