]> Pileus Git - ~andy/fetchmail/blobdiff - getpass.c
Fix typo repsonsible -> responsible.
[~andy/fetchmail] / getpass.c
index c5fe4829adb490608d7db9975faf5606cbca79fd..c1624299eb43d75a494420ce7694c83aa0f93903 100644 (file)
--- a/getpass.c
+++ b/getpass.c
-/* Copyright 1993-95 by Carl Harris, Jr.
- * All rights reserved
- *
- * Distribute freely, except: don't remove my name from the source or
- * documentation (don't take credit for my work), mark your changes (don't
- * get me blamed for your possible bugs), don't alter or remove this
- * notice.  May be sold if buildable source is provided to buyer.  No
- * warrantee of any kind, express or implied, is included with this
- * software; use at your own risk, responsibility for damages (if any) to
- * anyone resulting from the use of this software rests entirely with the
- * user.
- *
- * Send bug reports, bug fixes, enhancements, requests, flames, etc., and
- * I'll try to keep a version up to date.  I can be reached as follows:
- * Carl Harris <ceharris@mal.com>
+/*
+ * For license terms, see the file COPYING in this directory.
  */
 
-
 /***********************************************************************
   module:       getpass.c
-  project:      popclient
+  project:      fetchmail
   programmer:   Carl Harris, ceharris@mal.com
   description:         getpass() replacement which allows for long passwords.
-
-  $Log: getpass.c,v $
-  Revision 1.1  1996/06/28 14:33:54  esr
-  Initial revision
-
-  Revision 1.4  1995/08/10 00:32:27  ceharris
-  Preparation for 3.0b3 beta release:
-  -    added code for --kill/--keep, --limit, --protocol, --flush
-       options; --pop2 and --pop3 options now obsoleted by --protocol.
-  -    added support for APOP authentication, including --with-APOP
-       argument for configure.
-  -    provisional and broken support for RPOP
-  -    added buffering to SockGets and SockRead functions.
-  -    fixed problem of command-line options not being correctly
-       carried into the merged options record.
-
-  Revision 1.3  1995/08/08 01:01:19  ceharris
-  Added GNU-style long options processing.
-  Fixed password in 'ps' output problem.
-  Fixed various RCS tag blunders.
-  Integrated .poprc parser, lexer, etc into Makefile processing.
-
+                This version hacked by Wilfred Teiken, allowing the
+                password to be piped to fetchmail.
  ***********************************************************************/
 
-#include <config.h>
+#include "config.h"
 
-#if defined(STDC_HEADERS)
 #include <stdio.h>
-#endif
-
 #include <signal.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "fetchmail.h"
+#include "gettext.h"
 
-#define INPUT_BUF_SIZE MAX_PASSWORD_LENGTH
-
-#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
-
-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);
+#define INPUT_BUF_SIZE PASSWORDLEN
 
-  /* store descriptor for the tty */
-  ttyfd = fileno(fi);
+#include <termios.h>
 
-  /* 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);
+static int ttyfd;
 
-  if (fi != stdin)
-    fclose(fi);
+static struct termios termb;
+static tcflag_t flags;
 
-  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();
-  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 */