]> Pileus Git - ~andy/fetchmail/blobdiff - getpass.c
Credit John Beck's fixes.
[~andy/fetchmail] / getpass.c
index 84079baf0f87445b9dee537fbeb14d0870c87521..3c19ba7c832fb9f3825c3b98c6d29e7cd5024351 100644 (file)
--- a/getpass.c
+++ b/getpass.c
@@ -1,5 +1,4 @@
-/* Copyright 1993-95 by Carl Harris, Jr. Copyright 1996 by Eric S. Raymond
- * All rights reserved.
+/*
  * For license terms, see the file COPYING in this directory.
  */
 
@@ -8,16 +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 <config.h>
+#include "config.h"
+
 #include <stdio.h>
 #include <signal.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#if defined(HAVE_UNISTD_H)
+#include <unistd.h>
+#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 <termios.h>
@@ -49,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 */