-/*
+/* 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
{
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;
*p++ = ch;
*p = '\0';
- if(ttystring != NULL) {
+ if (istty && fin != stdin) {
(void)tcsetattr(fileno(fin), TCSANOW, &oterm);
rewind(fout);
(void)fputc('\n', fout);