]> diplodocus.org Git - nmh/blobdiff - sbr/getpass.c
mhlsbr.c: Don't strchr(3) non-string NUL-less buffer.
[nmh] / sbr / getpass.c
index b33a3f8edaa840d7613c65c3d4bb0421f08d930b..12805f2fdf8e878b9b4309b99eca222eaf7402ef 100644 (file)
@@ -1,4 +1,5 @@
-/*
+/* getpass.c -- read a password without echo.
+ *
  * Portions of this code are Copyright (c) 1988, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- * $Id$
  */
 
-#include <stdio.h>
+#include <h/mh.h>
 #include <termios.h>
-#include <unistd.h>   /* for ttyname() */
-#include "h/mh.h"     /* for adios() */
 
 /* 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. */
+   arbitrary but hopefully big enough to accommodate everyone. */
 #define MAX_PASSWORD_LEN 256
 
 #ifndef TCSANOW
@@ -52,21 +49,21 @@ nmh_getpass(const char *prompt)
 {
   struct termios oterm, term;
   int ch;
-  char *p, *ttystring;
+  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 = (char *)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;
@@ -81,7 +78,7 @@ nmh_getpass(const char *prompt)
     *p++ = ch;
   *p = '\0';
 
-  if(ttystring != NULL) {
+  if (istty && fin != stdin) {
     (void)tcsetattr(fileno(fin), TCSANOW, &oterm);
     rewind(fout);
     (void)fputc('\n', fout);