From da6af9633e4ecdc19b1ee01de023fa4dfe615c39 Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Mon, 21 Feb 2005 16:31:58 +0000 Subject: [PATCH] fix bug where inc crashed on failing to reopen the terminal --- ChangeLog | 5 +++++ sbr/getpass.c | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 66187bf..44dc217 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-02-21 Oliver Kiddle + + * sbr/getpass.c fix bug where inc crashed on failing to reopen + the terminal + 2005-01-27 Oliver Kiddle * Added -proxy option to inc and msgchk. Based on old patch diff --git a/sbr/getpass.c b/sbr/getpass.c index b33a3f8..6bc2cb8 100644 --- a/sbr/getpass.c +++ b/sbr/getpass.c @@ -35,7 +35,7 @@ #include #include -#include /* for ttyname() */ +#include /* for isatty() */ #include "h/mh.h" /* for adios() */ /* We don't use MAX_PASS here because the maximum password length on a remote @@ -52,21 +52,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 +81,7 @@ nmh_getpass(const char *prompt) *p++ = ch; *p = '\0'; - if(ttystring != NULL) { + if (istty) { (void)tcsetattr(fileno(fin), TCSANOW, &oterm); rewind(fout); (void)fputc('\n', fout); -- 1.7.10.4