diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/pg_dump/pg_backup_db.c | 73 | ||||
-rw-r--r-- | src/bin/psql/common.c | 70 |
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; } |