|
|
|
@ -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) |
|
|
|
|
{ |
|
|
|
|