X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=getpass.c;h=c1624299eb43d75a494420ce7694c83aa0f93903;hb=87bcf29364c4640edb87cc2186b965d1a564d70c;hp=f3d6d48f3d3c70c73e980a1bca059924c7d934f7;hpb=e72637a2022c33425341ab26790d19f88d18fec5;p=~andy%2Ffetchmail diff --git a/getpass.c b/getpass.c index f3d6d48f..c1624299 100644 --- a/getpass.c +++ b/getpass.c @@ -7,7 +7,9 @@ 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 "config.h" @@ -15,177 +17,116 @@ #include #include #include -#if defined(HAVE_UNISTD_H) +#include #include -#endif #include "fetchmail.h" - -extern int optind; +#include "gettext.h" #define INPUT_BUF_SIZE PASSWORDLEN -#if defined(HAVE_TERMIOS_H) && defined(HAVE_TCSETATTR) -# include -#else -#if defined(HAVE_TERMIO_H) -# include -# include -#else -#if defined(HAVE_SGTTY_H) -# include -#endif -#endif -#endif +#include static int ttyfd; -#if defined(HAVE_TCSETATTR) - static struct termios termb; - static tcflag_t flags; -#else -#if defined(HAVE_TERMIO_H) - static struct termio termb; - static unsigned short flags; -#else -#if defined(HAVE_STTY) - static struct sgttyb ttyb; - static int flags; -#endif -#endif -#endif - -void save_tty_state(); -void disable_tty_echo(); -void restore_tty_state(); - -char * -getpassword(prompt) -char *prompt; -{ - -#if !(defined(HAVE_TCSETATTR) || defined(HAVE_TERMIO_H) || defined(HAVE_STTY)) - -#if defined(HAVE_GETPASS) - char *getpass(); - return getpass(prompt); -#else - fputs("ERROR: no support for getpassword() routine\n",stderr); - exit(1); -#endif - -#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(); +static struct termios termb; +static tcflag_t flags; - /* 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); +static void save_tty_state(void); +static void disable_tty_echo(void); +static void restore_tty_state(void); +static void sigint_handler(int); +char *fm_getpassword(char *prompt) +{ + 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); } - -void -save_tty_state () +static void save_tty_state (void) { -#if defined(HAVE_TCSETATTR) - tcgetattr(ttyfd, &termb); - flags = termb.c_lflag; -#else -#if defined(HAVE_TERMIO_H) - ioctl(ttyfd, TCGETA, (char *) &termb); - flags = termb.c_lflag; -#else /* we HAVE_STTY */ - gtty(ttyfd, &ttyb); - flags = ttyb.sg_flags; -#endif -#endif + tcgetattr(ttyfd, &termb); + flags = termb.c_lflag; } - -void -disable_tty_echo() +static void disable_tty_echo(void) { - /* turn off echo on the tty */ -#if defined(HAVE_TCSETATTR) - termb.c_lflag &= ~ECHO; - tcsetattr(ttyfd, TCSAFLUSH, &termb); -#else -#if defined(HAVE_TERMIO_H) - termb.c_lflag &= ~ECHO; - ioctl(ttyfd, TCSETA, (char *) &termb); -#else /* we HAVE_STTY */ - ttyb.sg_flags &= ~ECHO; - stty(ttyfd, &ttyb); -#endif -#endif + /* turn off echo on the tty */ + termb.c_lflag &= ~ECHO; + tcsetattr(ttyfd, TCSAFLUSH, &termb); } - - -void -restore_tty_state() +static void restore_tty_state(void) { - /* restore previous tty echo state */ -#if defined(HAVE_TCSETATTR) - termb.c_lflag = flags; - tcsetattr(ttyfd, TCSAFLUSH, &termb); -#else -#if defined(HAVE_TERMIO_H) - termb.c_lflag = flags; - ioctl(ttyfd, TCSETA, (char *) &termb); -#else /* we HAVE_STTY */ - ttyb.sg_flags = flags; - stty(ttyfd, &ttyb); -#endif -#endif + /* restore previous tty echo state */ + termb.c_lflag = flags; + tcsetattr(ttyfd, TCSAFLUSH, &termb); } - -RETSIGTYPE sigint_handler () +static void sigint_handler(int signum) { - restore_tty_state(); - error(1, 0, "\nCaught signal... bailing out."); + (void)signum; + restore_tty_state(); + report(stderr, GT_("\nCaught SIGINT... bailing out.\n")); + exit(1); } + +/* getpass.c ends here */