mirror of
https://github.com/postgres/postgres.git
synced 2025-06-10 09:21:54 +03:00
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.
This commit is contained in:
parent
f5a5b44c4d
commit
4fec55af6c
@ -57,7 +57,7 @@ char *convert_charset(char *string);
|
|||||||
void usage(void);
|
void usage(void);
|
||||||
unsigned int isinteger(char *);
|
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) {
|
unsigned int isinteger(char *buff) {
|
||||||
@ -472,13 +472,12 @@ void do_inserts(PGconn *conn, char *table, dbhead *dbh) {
|
|||||||
free(query);
|
free(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is from Postgres 7.0.3 source tarball, utility program PSQL.
|
* simple_prompt --- borrowed from psql
|
||||||
*
|
|
||||||
* simple_prompt
|
|
||||||
*
|
*
|
||||||
* Generalized function especially intended for reading in usernames and
|
* 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
|
* prompt: The prompt to print
|
||||||
* maxlen: How many characters to accept
|
* 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).
|
* Returns a malloc()'ed string with the input (w/o trailing newline).
|
||||||
*/
|
*/
|
||||||
static int prompt_state;
|
static bool prompt_state = false;
|
||||||
|
|
||||||
char *
|
char *
|
||||||
simple_prompt(const char *prompt, int maxlen, int echo)
|
simple_prompt(const char *prompt, int maxlen, bool echo)
|
||||||
{
|
{
|
||||||
int length;
|
int length;
|
||||||
char *destination;
|
char *destination;
|
||||||
|
FILE *termin, *termout;
|
||||||
#ifdef HAVE_TERMIOS_H
|
#ifdef HAVE_TERMIOS_H
|
||||||
struct termios t_orig,
|
struct termios t_orig,
|
||||||
t;
|
t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
destination = (char *) malloc(maxlen + 2);
|
destination = (char *) malloc(maxlen + 2);
|
||||||
if (!destination)
|
if (!destination)
|
||||||
return NULL;
|
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
|
#ifdef HAVE_TERMIOS_H
|
||||||
if (!echo)
|
if (!echo)
|
||||||
{
|
{
|
||||||
tcgetattr(0, &t);
|
tcgetattr(fileno(termin), &t);
|
||||||
t_orig = t;
|
t_orig = t;
|
||||||
t.c_lflag &= ~ECHO;
|
t.c_lflag &= ~ECHO;
|
||||||
tcsetattr(0, TCSADRAIN, &t);
|
tcsetattr(fileno(termin), TCSAFLUSH, &t);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
fgets(destination, maxlen, stdin);
|
if (prompt)
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_H
|
|
||||||
if (!echo)
|
|
||||||
{
|
{
|
||||||
tcsetattr(0, TCSADRAIN, &t_orig);
|
fputs(gettext(prompt), termout);
|
||||||
puts("");
|
fflush(termout);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
prompt_state = 0;
|
if (fgets(destination, maxlen, termin) == NULL)
|
||||||
|
destination[0] = '\0';
|
||||||
|
|
||||||
length = strlen(destination);
|
length = strlen(destination);
|
||||||
if (length > 0 && destination[length - 1] != '\n')
|
if (length > 0 && destination[length - 1] != '\n')
|
||||||
{
|
{
|
||||||
/* eat rest of the line */
|
/* eat rest of the line */
|
||||||
char buf[512];
|
char buf[128];
|
||||||
|
int buflen;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
fgets(buf, 512, stdin);
|
if (fgets(buf, sizeof(buf), termin) == NULL)
|
||||||
} while (buf[strlen(buf) - 1] != '\n');
|
break;
|
||||||
|
buflen = strlen(buf);
|
||||||
|
} while (buflen > 0 && buf[buflen - 1] != '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length > 0 && destination[length - 1] == '\n')
|
if (length > 0 && destination[length - 1] == '\n')
|
||||||
/* remove trailing newline */
|
/* remove trailing newline */
|
||||||
destination[length - 1] = '\0';
|
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;
|
return destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Implements the basic DB functions used by the archiver.
|
* Implements the basic DB functions used by the archiver.
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* 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
|
* Generalized function especially intended for reading in usernames and
|
||||||
* password interactively. Reads from /dev/tty or stdin/stderr.
|
* 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).
|
* Returns a malloc()'ed string with the input (w/o trailing newline).
|
||||||
*/
|
*/
|
||||||
static bool prompt_state;
|
static bool prompt_state = false;
|
||||||
|
|
||||||
char *
|
char *
|
||||||
simple_prompt(const char *prompt, int maxlen, bool echo)
|
simple_prompt(const char *prompt, int maxlen, bool echo)
|
||||||
{
|
{
|
||||||
int length;
|
int length;
|
||||||
char *destination;
|
char *destination;
|
||||||
static FILE *termin = NULL, *termout;
|
FILE *termin, *termout;
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_H
|
#ifdef HAVE_TERMIOS_H
|
||||||
struct termios t_orig,
|
struct termios t_orig,
|
||||||
t;
|
t;
|
||||||
@ -75,22 +74,22 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
|
|||||||
if (!destination)
|
if (!destination)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
prompt_state = true;
|
prompt_state = true; /* disable SIGINT */
|
||||||
|
|
||||||
/* initialize the streams */
|
/*
|
||||||
if (!termin)
|
* 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 = termout = fopen("/dev/tty", "w+")) == NULL)
|
if (termin)
|
||||||
{
|
fclose(termin);
|
||||||
termin = stdin;
|
if (termout)
|
||||||
termout = stderr;
|
fclose(termout);
|
||||||
}
|
termin = stdin;
|
||||||
}
|
termout = stderr;
|
||||||
|
|
||||||
if (prompt)
|
|
||||||
{
|
|
||||||
fputs(gettext(prompt), termout);
|
|
||||||
rewind(termout); /* does flush too */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_H
|
#ifdef HAVE_TERMIOS_H
|
||||||
@ -99,23 +98,19 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
|
|||||||
tcgetattr(fileno(termin), &t);
|
tcgetattr(fileno(termin), &t);
|
||||||
t_orig = t;
|
t_orig = t;
|
||||||
t.c_lflag &= ~ECHO;
|
t.c_lflag &= ~ECHO;
|
||||||
tcsetattr(fileno(termin), TCSADRAIN, &t);
|
tcsetattr(fileno(termin), TCSAFLUSH, &t);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (prompt)
|
||||||
|
{
|
||||||
|
fputs(gettext(prompt), termout);
|
||||||
|
fflush(termout);
|
||||||
|
}
|
||||||
|
|
||||||
if (fgets(destination, maxlen, termin) == NULL)
|
if (fgets(destination, maxlen, termin) == NULL)
|
||||||
destination[0] = '\0';
|
destination[0] = '\0';
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_H
|
|
||||||
if (!echo)
|
|
||||||
{
|
|
||||||
tcsetattr(fileno(termin), TCSADRAIN, &t_orig);
|
|
||||||
fputs("\n", termout);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
prompt_state = false;
|
|
||||||
|
|
||||||
length = strlen(destination);
|
length = strlen(destination);
|
||||||
if (length > 0 && destination[length - 1] != '\n')
|
if (length > 0 && destination[length - 1] != '\n')
|
||||||
{
|
{
|
||||||
@ -135,11 +130,27 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
|
|||||||
/* remove trailing newline */
|
/* remove trailing newline */
|
||||||
destination[length - 1] = '\0';
|
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;
|
return destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_parse_version(ArchiveHandle *AH, const char* versionString)
|
_parse_version(ArchiveHandle *AH, const char* versionString)
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright 2000 by PostgreSQL Global Development Group
|
* 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"
|
#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).
|
* Returns a malloc()'ed string with the input (w/o trailing newline).
|
||||||
*/
|
*/
|
||||||
static bool prompt_state;
|
static bool prompt_state = false;
|
||||||
|
|
||||||
char *
|
char *
|
||||||
simple_prompt(const char *prompt, int maxlen, bool echo)
|
simple_prompt(const char *prompt, int maxlen, bool echo)
|
||||||
{
|
{
|
||||||
int length;
|
int length;
|
||||||
char *destination;
|
char *destination;
|
||||||
static FILE *termin = NULL, *termout;
|
FILE *termin, *termout;
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_H
|
#ifdef HAVE_TERMIOS_H
|
||||||
struct termios t_orig,
|
struct termios t_orig,
|
||||||
t;
|
t;
|
||||||
@ -187,22 +186,22 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
|
|||||||
if (!destination)
|
if (!destination)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
prompt_state = true;
|
prompt_state = true; /* disable SIGINT */
|
||||||
|
|
||||||
/* initialize the streams */
|
/*
|
||||||
if (!termin)
|
* 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 = termout = fopen("/dev/tty", "w+")) == NULL)
|
if (termin)
|
||||||
{
|
fclose(termin);
|
||||||
termin = stdin;
|
if (termout)
|
||||||
termout = stderr;
|
fclose(termout);
|
||||||
}
|
termin = stdin;
|
||||||
}
|
termout = stderr;
|
||||||
|
|
||||||
if (prompt)
|
|
||||||
{
|
|
||||||
fputs(gettext(prompt), termout);
|
|
||||||
rewind(termout); /* does flush too */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_H
|
#ifdef HAVE_TERMIOS_H
|
||||||
@ -211,23 +210,19 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
|
|||||||
tcgetattr(fileno(termin), &t);
|
tcgetattr(fileno(termin), &t);
|
||||||
t_orig = t;
|
t_orig = t;
|
||||||
t.c_lflag &= ~ECHO;
|
t.c_lflag &= ~ECHO;
|
||||||
tcsetattr(fileno(termin), TCSADRAIN, &t);
|
tcsetattr(fileno(termin), TCSAFLUSH, &t);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (prompt)
|
||||||
|
{
|
||||||
|
fputs(gettext(prompt), termout);
|
||||||
|
fflush(termout);
|
||||||
|
}
|
||||||
|
|
||||||
if (fgets(destination, maxlen, termin) == NULL)
|
if (fgets(destination, maxlen, termin) == NULL)
|
||||||
destination[0] = '\0';
|
destination[0] = '\0';
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_H
|
|
||||||
if (!echo)
|
|
||||||
{
|
|
||||||
tcsetattr(fileno(termin), TCSADRAIN, &t_orig);
|
|
||||||
fputs("\n", termout);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
prompt_state = false;
|
|
||||||
|
|
||||||
length = strlen(destination);
|
length = strlen(destination);
|
||||||
if (length > 0 && destination[length - 1] != '\n')
|
if (length > 0 && destination[length - 1] != '\n')
|
||||||
{
|
{
|
||||||
@ -247,6 +242,23 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
|
|||||||
/* remove trailing newline */
|
/* remove trailing newline */
|
||||||
destination[length - 1] = '\0';
|
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;
|
return destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user