* man/mhbuild.man: wrapped one appearance of "Content-Disposition"
[mmh] / sbr / getpass.c
index 6a53b72..6bc2cb8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1988, 1993
+ * Portions of this code are Copyright (c) 1988, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $ID$
+ * $Id$
  */
 
 #include <stdio.h>
-#include <unistd.h>
 #include <termios.h>
+#include <unistd.h>   /* for isatty() */
+#include "h/mh.h"     /* for adios() */
 
-#define PASSWORD_LEN 128
+/* We don't use MAX_PASS here because the maximum password length on a remote
+   POP daemon will have nothing to do with the length on our OS.  256 is
+   arbitrary but hopefully big enough to accomodate everyone. */
+#define MAX_PASSWORD_LEN 256
 
 #ifndef TCSANOW
 #define TCSANOW 0
 #endif
 
-char *getpass(const char *prompt)
+char *
+nmh_getpass(const char *prompt)
 {
   struct termios oterm, term;
   int ch;
-  char *p, *ttystring, buf[PASSWORD_LEN+1];
+  char *p;
   FILE *fout, *fin;
+  static char  buf[MAX_PASSWORD_LEN + 1];
+  int istty = isatty(fileno(stdin));
 
   /* Find if stdin is connect to a terminal. If so, read directly from
    * the terminal, and turn off echo. Otherwise read from stdin.
    */
 
-  if((ttystring = ttyname(fileno(stdin))) == NULL) {
+  if (!istty || !(fout = fin = fopen("/dev/tty", "w+"))) {
     fout = stderr;
     fin = stdin;
   }
   else /* Reading directly from terminal here */
     {
-      fout = fin = fopen(ttystring, "w+");
       (void)tcgetattr(fileno(fin), &oterm);
       term = oterm; /* Save original info */
       term.c_lflag &= ~ECHO;
@@ -69,16 +75,17 @@ char *getpass(const char *prompt)
       (void)tcsetattr(fileno(fin), TCSANOW, &term);
     }
 
-  for (p = buf; (ch = getc(fin)) != EOF && ch != '\n';)
-    if (p < buf + PASSWORD_LEN)
-      *p++ = ch;
+  for (p = buf; (ch = getc(fin)) != EOF &&
+                 ch != '\n' &&
+                p < buf + MAX_PASSWORD_LEN;)
+    *p++ = ch;
   *p = '\0';
 
-  if(ttystring != NULL) {
+  if (istty) {
     (void)tcsetattr(fileno(fin), TCSANOW, &oterm);
     rewind(fout);
     (void)fputc('\n', fout);
     (void)fclose(fin);
   }
-  return(buf);
+  return buf;
 }