aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-10-18 21:57:11 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-10-18 21:57:11 +0000
commit4fec55af6c7d688fa78afd1e1fec0f6d0f5b294f (patch)
tree0a4fe7ccf7aecca6fb98112aeeb442e0cb38c3b6 /src
parentf5a5b44c4dc481188d8f83fc92dcca691214cf24 (diff)
downloadpostgresql-4fec55af6c7d688fa78afd1e1fec0f6d0f5b294f.tar.gz
postgresql-4fec55af6c7d688fa78afd1e1fec0f6d0f5b294f.zip
Fix several problems with simple_prompt() --- the nastiest being that
the entered password would get echoed on some platforms, eg HPUX. We have enough copies of this code that I'm thinking it ought to be moved into libpq, but that's a task for another day.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_backup_db.c73
-rw-r--r--src/bin/psql/common.c70
2 files changed, 83 insertions, 60 deletions
diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
index 3acf191b0b0..0749c24bb52 100644
--- a/src/bin/pg_dump/pg_backup_db.c
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -5,7 +5,7 @@
* Implements the basic DB functions used by the archiver.
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.27 2001/10/15 16:40:27 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.28 2001/10/18 21:57:11 tgl Exp $
*
* NOTES
*
@@ -46,7 +46,7 @@ static void notice_processor(void *arg, const char *message);
/*
- * simple_prompt
+ * simple_prompt --- borrowed from psql
*
* Generalized function especially intended for reading in usernames and
* password interactively. Reads from /dev/tty or stdin/stderr.
@@ -57,15 +57,14 @@ static void notice_processor(void *arg, const char *message);
*
* Returns a malloc()'ed string with the input (w/o trailing newline).
*/
-static bool prompt_state;
+static bool prompt_state = false;
char *
simple_prompt(const char *prompt, int maxlen, bool echo)
{
int length;
char *destination;
- static FILE *termin = NULL, *termout;
-
+ FILE *termin, *termout;
#ifdef HAVE_TERMIOS_H
struct termios t_orig,
t;
@@ -75,22 +74,22 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
if (!destination)
return NULL;
- prompt_state = true;
+ prompt_state = true; /* disable SIGINT */
- /* initialize the streams */
- if (!termin)
- {
- if ((termin = termout = fopen("/dev/tty", "w+")) == NULL)
- {
- termin = stdin;
- termout = stderr;
- }
- }
-
- if (prompt)
+ /*
+ * Do not try to collapse these into one "w+" mode file.
+ * Doesn't work on some platforms (eg, HPUX 10.20).
+ */
+ termin = fopen("/dev/tty", "r");
+ termout = fopen("/dev/tty", "w");
+ if (!termin || !termout)
{
- fputs(gettext(prompt), termout);
- rewind(termout); /* does flush too */
+ if (termin)
+ fclose(termin);
+ if (termout)
+ fclose(termout);
+ termin = stdin;
+ termout = stderr;
}
#ifdef HAVE_TERMIOS_H
@@ -99,22 +98,18 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
tcgetattr(fileno(termin), &t);
t_orig = t;
t.c_lflag &= ~ECHO;
- tcsetattr(fileno(termin), TCSADRAIN, &t);
+ tcsetattr(fileno(termin), TCSAFLUSH, &t);
}
#endif
-
- if (fgets(destination, maxlen, termin) == NULL)
- destination[0] = '\0';
-
-#ifdef HAVE_TERMIOS_H
- if (!echo)
+
+ if (prompt)
{
- tcsetattr(fileno(termin), TCSADRAIN, &t_orig);
- fputs("\n", termout);
+ fputs(gettext(prompt), termout);
+ fflush(termout);
}
-#endif
- prompt_state = false;
+ if (fgets(destination, maxlen, termin) == NULL)
+ destination[0] = '\0';
length = strlen(destination);
if (length > 0 && destination[length - 1] != '\n')
@@ -135,11 +130,27 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
/* remove trailing newline */
destination[length - 1] = '\0';
+#ifdef HAVE_TERMIOS_H
+ if (!echo)
+ {
+ tcsetattr(fileno(termin), TCSAFLUSH, &t_orig);
+ fputs("\n", termout);
+ fflush(termout);
+ }
+#endif
+
+ if (termin != stdin)
+ {
+ fclose(termin);
+ fclose(termout);
+ }
+
+ prompt_state = false; /* SIGINT okay again */
+
return destination;
}
-
static int
_parse_version(ArchiveHandle *AH, const char* versionString)
{
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index b0572186d8b..336d8138783 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.35 2001/10/15 16:40:27 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.36 2001/10/18 21:57:11 tgl Exp $
*/
#include "postgres_fe.h"
@@ -169,15 +169,14 @@ NoticeProcessor(void *arg, const char *message)
*
* Returns a malloc()'ed string with the input (w/o trailing newline).
*/
-static bool prompt_state;
+static bool prompt_state = false;
char *
simple_prompt(const char *prompt, int maxlen, bool echo)
{
int length;
char *destination;
- static FILE *termin = NULL, *termout;
-
+ FILE *termin, *termout;
#ifdef HAVE_TERMIOS_H
struct termios t_orig,
t;
@@ -187,22 +186,22 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
if (!destination)
return NULL;
- prompt_state = true;
+ prompt_state = true; /* disable SIGINT */
- /* initialize the streams */
- if (!termin)
- {
- if ((termin = termout = fopen("/dev/tty", "w+")) == NULL)
- {
- termin = stdin;
- termout = stderr;
- }
- }
-
- if (prompt)
+ /*
+ * Do not try to collapse these into one "w+" mode file.
+ * Doesn't work on some platforms (eg, HPUX 10.20).
+ */
+ termin = fopen("/dev/tty", "r");
+ termout = fopen("/dev/tty", "w");
+ if (!termin || !termout)
{
- fputs(gettext(prompt), termout);
- rewind(termout); /* does flush too */
+ if (termin)
+ fclose(termin);
+ if (termout)
+ fclose(termout);
+ termin = stdin;
+ termout = stderr;
}
#ifdef HAVE_TERMIOS_H
@@ -211,22 +210,18 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
tcgetattr(fileno(termin), &t);
t_orig = t;
t.c_lflag &= ~ECHO;
- tcsetattr(fileno(termin), TCSADRAIN, &t);
+ tcsetattr(fileno(termin), TCSAFLUSH, &t);
}
#endif
-
- if (fgets(destination, maxlen, termin) == NULL)
- destination[0] = '\0';
-
-#ifdef HAVE_TERMIOS_H
- if (!echo)
+
+ if (prompt)
{
- tcsetattr(fileno(termin), TCSADRAIN, &t_orig);
- fputs("\n", termout);
+ fputs(gettext(prompt), termout);
+ fflush(termout);
}
-#endif
- prompt_state = false;
+ if (fgets(destination, maxlen, termin) == NULL)
+ destination[0] = '\0';
length = strlen(destination);
if (length > 0 && destination[length - 1] != '\n')
@@ -247,6 +242,23 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
/* remove trailing newline */
destination[length - 1] = '\0';
+#ifdef HAVE_TERMIOS_H
+ if (!echo)
+ {
+ tcsetattr(fileno(termin), TCSAFLUSH, &t_orig);
+ fputs("\n", termout);
+ fflush(termout);
+ }
+#endif
+
+ if (termin != stdin)
+ {
+ fclose(termin);
+ fclose(termout);
+ }
+
+ prompt_state = false; /* SIGINT okay again */
+
return destination;
}