diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index ed325db204..3acf191b0b 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.26 2001/09/21 21:58:30 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.27 2001/10/15 16:40:27 momjian Exp $ * * NOTES * @@ -49,7 +49,7 @@ static void notice_processor(void *arg, const char *message); * simple_prompt * * Generalized function especially intended for reading in usernames and - * password interactively. Reads from stdin. + * password interactively. Reads from /dev/tty or stdin/stderr. * * prompt: The prompt to print * maxlen: How many characters to accept @@ -57,45 +57,65 @@ 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; + char * simple_prompt(const char *prompt, int maxlen, bool echo) { int length; char *destination; + static FILE *termin = NULL, *termout; #ifdef HAVE_TERMIOS_H struct termios t_orig, t; - #endif destination = (char *) malloc(maxlen + 2); if (!destination) return NULL; + + prompt_state = true; + + /* initialize the streams */ + if (!termin) + { + if ((termin = termout = fopen("/dev/tty", "w+")) == NULL) + { + termin = stdin; + termout = stderr; + } + } + if (prompt) - fputs(gettext(prompt), stderr); + { + fputs(gettext(prompt), termout); + rewind(termout); /* does flush too */ + } #ifdef HAVE_TERMIOS_H if (!echo) { - tcgetattr(0, &t); + tcgetattr(fileno(termin), &t); t_orig = t; t.c_lflag &= ~ECHO; - tcsetattr(0, TCSADRAIN, &t); + tcsetattr(fileno(termin), TCSADRAIN, &t); } #endif - if (fgets(destination, maxlen, stdin) == NULL) + if (fgets(destination, maxlen, termin) == NULL) destination[0] = '\0'; #ifdef HAVE_TERMIOS_H if (!echo) { - tcsetattr(0, TCSADRAIN, &t_orig); - fputs("\n", stderr); + tcsetattr(fileno(termin), TCSADRAIN, &t_orig); + fputs("\n", termout); } #endif + prompt_state = false; + length = strlen(destination); if (length > 0 && destination[length - 1] != '\n') { @@ -105,11 +125,12 @@ simple_prompt(const char *prompt, int maxlen, bool echo) do { - if (fgets(buf, sizeof(buf), stdin) == NULL) + if (fgets(buf, sizeof(buf), termin) == NULL) break; buflen = strlen(buf); } while (buflen > 0 && buf[buflen - 1] != '\n'); } + if (length > 0 && destination[length - 1] == '\n') /* remove trailing newline */ destination[length - 1] = '\0'; @@ -118,6 +139,7 @@ simple_prompt(const char *prompt, int maxlen, bool echo) } + static int _parse_version(ArchiveHandle *AH, const char* versionString) { diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index ed3980bfb4..b0572186d8 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.34 2001/06/08 23:53:48 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.35 2001/10/15 16:40:27 momjian Exp $ */ #include "postgres_fe.h" @@ -161,7 +161,7 @@ NoticeProcessor(void *arg, const char *message) * simple_prompt * * Generalized function especially intended for reading in usernames and - * password interactively. Reads from stdin. + * password interactively. Reads from /dev/tty or stdin/stderr. * * prompt: The prompt to print * maxlen: How many characters to accept @@ -176,39 +176,53 @@ simple_prompt(const char *prompt, int maxlen, bool echo) { int length; char *destination; + static FILE *termin = NULL, *termout; #ifdef HAVE_TERMIOS_H struct termios t_orig, t; - #endif destination = (char *) malloc(maxlen + 2); if (!destination) return NULL; - if (prompt) - fputs(gettext(prompt), stderr); prompt_state = true; + /* initialize the streams */ + if (!termin) + { + if ((termin = termout = fopen("/dev/tty", "w+")) == NULL) + { + termin = stdin; + termout = stderr; + } + } + + if (prompt) + { + fputs(gettext(prompt), termout); + rewind(termout); /* does flush too */ + } + #ifdef HAVE_TERMIOS_H if (!echo) { - tcgetattr(0, &t); + tcgetattr(fileno(termin), &t); t_orig = t; t.c_lflag &= ~ECHO; - tcsetattr(0, TCSADRAIN, &t); + tcsetattr(fileno(termin), TCSADRAIN, &t); } #endif - if (fgets(destination, maxlen, stdin) == NULL) + if (fgets(destination, maxlen, termin) == NULL) destination[0] = '\0'; #ifdef HAVE_TERMIOS_H if (!echo) { - tcsetattr(0, TCSADRAIN, &t_orig); - fputs("\n", stderr); + tcsetattr(fileno(termin), TCSADRAIN, &t_orig); + fputs("\n", termout); } #endif @@ -223,7 +237,7 @@ simple_prompt(const char *prompt, int maxlen, bool echo) do { - if (fgets(buf, sizeof(buf), stdin) == NULL) + if (fgets(buf, sizeof(buf), termin) == NULL) break; buflen = strlen(buf); } while (buflen > 0 && buf[buflen - 1] != '\n');