Commit 66b77dbc authored by Bruce Momjian's avatar Bruce Momjian

Prompt for password from /dev/tty and fall back to stdin/stderr.

parent cdce5070
...@@ -5,7 +5,7 @@ ...@@ -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.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 * NOTES
* *
...@@ -49,7 +49,7 @@ static void notice_processor(void *arg, const char *message); ...@@ -49,7 +49,7 @@ static void notice_processor(void *arg, const char *message);
* simple_prompt * 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
...@@ -57,45 +57,65 @@ static void notice_processor(void *arg, const char *message); ...@@ -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). * Returns a malloc()'ed string with the input (w/o trailing newline).
*/ */
static bool prompt_state;
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;
#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;
prompt_state = true;
/* initialize the streams */
if (!termin)
{
if ((termin = termout = fopen("/dev/tty", "w+")) == NULL)
{
termin = stdin;
termout = stderr;
}
}
if (prompt) if (prompt)
fputs(gettext(prompt), stderr); {
fputs(gettext(prompt), termout);
rewind(termout); /* does flush too */
}
#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), TCSADRAIN, &t);
} }
#endif #endif
if (fgets(destination, maxlen, stdin) == NULL) if (fgets(destination, maxlen, termin) == NULL)
destination[0] = '\0'; destination[0] = '\0';
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
if (!echo) if (!echo)
{ {
tcsetattr(0, TCSADRAIN, &t_orig); tcsetattr(fileno(termin), TCSADRAIN, &t_orig);
fputs("\n", stderr); fputs("\n", termout);
} }
#endif #endif
prompt_state = false;
length = strlen(destination); length = strlen(destination);
if (length > 0 && destination[length - 1] != '\n') if (length > 0 && destination[length - 1] != '\n')
{ {
...@@ -105,11 +125,12 @@ simple_prompt(const char *prompt, int maxlen, bool echo) ...@@ -105,11 +125,12 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
do do
{ {
if (fgets(buf, sizeof(buf), stdin) == NULL) if (fgets(buf, sizeof(buf), termin) == NULL)
break; break;
buflen = strlen(buf); buflen = strlen(buf);
} while (buflen > 0 && buf[buflen - 1] != '\n'); } 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';
...@@ -118,6 +139,7 @@ simple_prompt(const char *prompt, int maxlen, bool echo) ...@@ -118,6 +139,7 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
} }
static int static int
_parse_version(ArchiveHandle *AH, const char* versionString) _parse_version(ArchiveHandle *AH, const char* versionString)
{ {
......
...@@ -3,7 +3,7 @@ ...@@ -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.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" #include "postgres_fe.h"
...@@ -161,7 +161,7 @@ NoticeProcessor(void *arg, const char *message) ...@@ -161,7 +161,7 @@ NoticeProcessor(void *arg, const char *message)
* simple_prompt * 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
...@@ -176,39 +176,53 @@ simple_prompt(const char *prompt, int maxlen, bool echo) ...@@ -176,39 +176,53 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
{ {
int length; int length;
char *destination; char *destination;
static FILE *termin = NULL, *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(gettext(prompt), stderr);
prompt_state = true; 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 #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), TCSADRAIN, &t);
} }
#endif #endif
if (fgets(destination, maxlen, stdin) == NULL) if (fgets(destination, maxlen, termin) == NULL)
destination[0] = '\0'; destination[0] = '\0';
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
if (!echo) if (!echo)
{ {
tcsetattr(0, TCSADRAIN, &t_orig); tcsetattr(fileno(termin), TCSADRAIN, &t_orig);
fputs("\n", stderr); fputs("\n", termout);
} }
#endif #endif
...@@ -223,7 +237,7 @@ simple_prompt(const char *prompt, int maxlen, bool echo) ...@@ -223,7 +237,7 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
do do
{ {
if (fgets(buf, sizeof(buf), stdin) == NULL) if (fgets(buf, sizeof(buf), termin) == NULL)
break; break;
buflen = strlen(buf); buflen = strlen(buf);
} while (buflen > 0 && buf[buflen - 1] != '\n'); } while (buflen > 0 && buf[buflen - 1] != '\n');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment