]> Pileus Git - ~andy/fetchmail/blobdiff - getpass.c
Merge branch 'legacy_63'
[~andy/fetchmail] / getpass.c
index f3d6d48f3d3c70c73e980a1bca059924c7d934f7..c1624299eb43d75a494420ce7694c83aa0f93903 100644 (file)
--- 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"
 #include <stdio.h>
 #include <signal.h>
 #include <fcntl.h>
-#if defined(HAVE_UNISTD_H)
+#include <stdlib.h>
 #include <unistd.h>
-#endif
 #include "fetchmail.h"
-
-extern int optind;
+#include "gettext.h"
 
 #define INPUT_BUF_SIZE PASSWORDLEN
 
-#if defined(HAVE_TERMIOS_H) && defined(HAVE_TCSETATTR)
-#  include <termios.h>
-#else
-#if defined(HAVE_TERMIO_H)
-#  include <sys/ioctl.h>
-#  include <termio.h>
-#else
-#if defined(HAVE_SGTTY_H)
-#  include <sgtty.h>
-#endif
-#endif
-#endif
+#include <termios.h>
 
 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 */