Thanks, I've understood your point.
Please look at the patch. It implements the first way and it makes psql work too.

Regards,
Alexander

20.03.2012 00:05, Alvaro Herrera пишет:
Excerpts from Alexander LAW's message of dom mar 18 06:04:51 -0300 2012:
I see two ways to resolve the issue.
First is to use CharToOemBuff when writing a string to the "con" and
OemToCharBuff when reading an input from it.
The other is to always use stderr/stdin for Win32 as it was done for
msys before. I think it's more straightforward.
Using console directly instead of stdin/out/err is more appropriate when
asking for passwords and reading them back, because you can redirect the
rest of the output to/from files or pipes, without the prompt
interfering with that.  This also explains why stderr is used instead of
stdout.


--- a/src/port/sprompt.c	2012-02-24 02:53:36.000000000 +0400
+++ b/src/port/sprompt.c	2012-03-20 23:34:22.181979200 +0400
@@ -41,6 +41,7 @@
 	char	   *destination;
 	FILE	   *termin,
 			   *termout;
+	char	   *_prompt;
 
 #ifdef HAVE_TERMIOS_H
 	struct termios t_orig,
@@ -49,6 +50,7 @@
 #ifdef WIN32
 	HANDLE		t = NULL;
 	LPDWORD		t_orig = NULL;
+	char	   *oem_prompt = NULL;
 #endif
 #endif
 
@@ -104,7 +106,20 @@
 
 	if (prompt)
 	{
-		fputs(_(prompt), termout);
+		_prompt = _(prompt);
+#ifdef WIN32
+		if ((termout != stderr) && (termout != stdout))
+		{
+			oem_prompt = (char*) malloc(strlen(_prompt) + 1);
+			CharToOemBuff(_prompt, oem_prompt, strlen(_prompt) + 1);
+			_prompt = oem_prompt;
+		}
+#endif
+		fputs(_prompt, termout);
+#ifdef WIN32
+		if (oem_prompt)
+			free(oem_prompt);
+#endif
 		fflush(termout);
 	}
 
@@ -130,6 +145,13 @@
 		/* remove trailing newline */
 		destination[length - 1] = '\0';
 
+#ifdef WIN32
+	if (termin != stdin)
+	{
+		OemToCharBuff(destination, destination, strlen(destination) + 1);
+	}
+#endif
+
 #ifdef HAVE_TERMIOS_H
 	if (!echo)
 	{
-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to