diff options
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/dbase/dbf2pg.c | 81 |
1 files changed, 55 insertions, 26 deletions
diff --git a/contrib/dbase/dbf2pg.c b/contrib/dbase/dbf2pg.c index c87c743e096..839bb7211f4 100644 --- a/contrib/dbase/dbf2pg.c +++ b/contrib/dbase/dbf2pg.c @@ -57,7 +57,7 @@ char *convert_charset(char *string); void usage(void); unsigned int isinteger(char *); -char *simple_prompt(const char *prompt, int maxlen, int echo); +char *simple_prompt(const char *prompt, int maxlen, bool echo); unsigned int isinteger(char *buff) { @@ -472,13 +472,12 @@ void do_inserts(PGconn *conn, char *table, dbhead *dbh) { free(query); } + /* - * This is from Postgres 7.0.3 source tarball, utility program PSQL. - * - * simple_prompt + * simple_prompt --- borrowed from psql * * 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 @@ -486,66 +485,96 @@ void do_inserts(PGconn *conn, char *table, dbhead *dbh) { * * Returns a malloc()'ed string with the input (w/o trailing newline). */ -static int prompt_state; +static bool prompt_state = false; char * -simple_prompt(const char *prompt, int maxlen, int echo) +simple_prompt(const char *prompt, int maxlen, bool echo) { int length; char *destination; - + FILE *termin, *termout; #ifdef HAVE_TERMIOS_H struct termios t_orig, t; - #endif destination = (char *) malloc(maxlen + 2); if (!destination) return NULL; - if (prompt) - fputs(prompt, stderr); - prompt_state = 1; + prompt_state = true; /* disable SIGINT */ + + /* + * 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) + { + if (termin) + fclose(termin); + if (termout) + fclose(termout); + termin = stdin; + termout = stderr; + } #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), TCSAFLUSH, &t); } #endif - - fgets(destination, maxlen, stdin); - -#ifdef HAVE_TERMIOS_H - if (!echo) + + if (prompt) { - tcsetattr(0, TCSADRAIN, &t_orig); - puts(""); + fputs(gettext(prompt), termout); + fflush(termout); } -#endif - prompt_state = 0; + if (fgets(destination, maxlen, termin) == NULL) + destination[0] = '\0'; length = strlen(destination); if (length > 0 && destination[length - 1] != '\n') { /* eat rest of the line */ - char buf[512]; + char buf[128]; + int buflen; do { - fgets(buf, 512, stdin); - } while (buf[strlen(buf) - 1] != '\n'); + 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'; +#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; } |
