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