Avoid trying to open /dev/tty on Win32. Some Win32 systems have

/dev/tty, but it isn't a device file and doesn't work as expected.

This fixes a known bug where psql does not prompt for a password on some
Win32 systems.

Backpatch to 8.1.X.

Robert Kinberg
This commit is contained in:
Bruce Momjian 2006-03-03 23:49:12 +00:00
parent decdaf3592
commit ef3f7c3f74
2 changed files with 14 additions and 5 deletions

View File

@ -3,7 +3,7 @@
* *
* Copyright (c) 2000-2005, PostgreSQL Global Development Group * Copyright (c) 2000-2005, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.161 2006/02/12 04:04:32 momjian Exp $ * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.162 2006/03/03 23:49:12 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "command.h" #include "command.h"
@ -753,8 +753,11 @@ exec_command(const char *cmd,
expand_tilde(&fname); expand_tilde(&fname);
/* This scrolls off the screen when using /dev/tty */ /* This scrolls off the screen when using /dev/tty */
#ifndef WIN32
success = saveHistory(fname ? fname : "/dev/tty"); success = saveHistory(fname ? fname : "/dev/tty");
#else
success = saveHistory(fname ? fname : stderr);
#endif
if (success && !quiet && fname) if (success && !quiet && fname)
printf(gettext("Wrote history to file \"%s/%s\".\n"), printf(gettext("Wrote history to file \"%s/%s\".\n"),
pset.dirname ? pset.dirname : ".", fname); pset.dirname ? pset.dirname : ".", fname);

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/port/sprompt.c,v 1.12 2005/10/15 02:49:51 momjian Exp $ * $PostgreSQL: pgsql/src/port/sprompt.c,v 1.13 2006/03/03 23:49:12 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -40,8 +40,8 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
{ {
int length; int length;
char *destination; char *destination;
FILE *termin, FILE *termin = NULL,
*termout; *termout = NULL;
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
struct termios t_orig, struct termios t_orig,
@ -63,8 +63,14 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
* Do not try to collapse these into one "w+" mode file. Doesn't work on * Do not try to collapse these into one "w+" mode file. Doesn't work on
* some platforms (eg, HPUX 10.20). * some platforms (eg, HPUX 10.20).
*/ */
#ifndef WIN32
/*
* Some win32 platforms actually have a /dev/tty file, but it isn't
* a device file, and it doesn't work as expected, so we avoid trying.
*/
termin = fopen("/dev/tty", "r"); termin = fopen("/dev/tty", "r");
termout = fopen("/dev/tty", "w"); termout = fopen("/dev/tty", "w");
#endif
if (!termin || !termout) if (!termin || !termout)
{ {
if (termin) if (termin)