@@ -62,23 +62,17 @@
static bool
get_console_input_win32(const char *prompt, const bool echo, char *input, const int capacity)
{
- HANDLE in = INVALID_HANDLE_VALUE;
- HANDLE err = INVALID_HANDLE_VALUE;
- DWORD len = 0;
-
ASSERT(prompt);
ASSERT(input);
ASSERT(capacity > 0);
input[0] = '\0';
- in = GetStdHandle(STD_INPUT_HANDLE);
- err = get_orig_stderr();
-
- if (in == INVALID_HANDLE_VALUE
- || err == INVALID_HANDLE_VALUE
+ HANDLE in = GetStdHandle(STD_INPUT_HANDLE);
+ int orig_stderr = get_orig_stderr(); // guaranteed to be always valid
+ if ((in == INVALID_HANDLE_VALUE)
|| win32_service_interrupt(&win32_signal)
- || !WriteFile(err, prompt, strlen(prompt), &len, NULL))
+ || (_write(orig_stderr, prompt, strlen(prompt)) == -1))
{
msg(M_WARN|M_ERRNO, "get_console_input_win32(): unexpected error");
return false;
@@ -106,6 +100,8 @@ get_console_input_win32(const char *prompt, const bool echo, char *input, const
}
}
+ DWORD len = 0;
+
if (is_console)
{
winput = malloc(capacity * sizeof(WCHAR));
@@ -128,7 +124,7 @@ get_console_input_win32(const char *prompt, const bool echo, char *input, const
if (!echo)
{
- WriteFile(err, "\r\n", 2, &len, NULL);
+ _write(orig_stderr, "\r\n", 2);
}
if (is_console)
{
@@ -491,22 +491,12 @@ close_syslog(void)
}
#ifdef _WIN32
+static int orig_stderr;
-static HANDLE orig_stderr;
-
-HANDLE
-get_orig_stderr(void)
+int get_orig_stderr()
{
- if (orig_stderr)
- {
- return orig_stderr;
- }
- else
- {
- return GetStdHandle(STD_ERROR_HANDLE);
- }
+ return orig_stderr ? orig_stderr : _fileno(stderr);
}
-
#endif
void
@@ -550,16 +540,12 @@ redirect_stdout_stderr(const char *file, bool append)
}
/* save original stderr for password prompts */
- orig_stderr = GetStdHandle(STD_ERROR_HANDLE);
-
-#if 0 /* seems not be necessary with stdout/stderr redirection below*/
- /* set up for redirection */
- if (!SetStdHandle(STD_OUTPUT_HANDLE, log_handle)
- || !SetStdHandle(STD_ERROR_HANDLE, log_handle))
+ orig_stderr = _dup(_fileno(stderr));
+ if (orig_stderr == -1)
{
- msg(M_ERR, "Error: cannot redirect stdout/stderr to --log file: %s", file);
+ msg(M_WARN | M_ERRNO, "Warning: cannot duplicate stderr, password prompts will appear in log file instead of console.");
+ orig_stderr = _fileno(stderr);
}
-#endif
/* direct stdout/stderr to point to log_handle */
log_fd = _open_osfhandle((intptr_t)log_handle, _O_TEXT);
@@ -256,8 +256,8 @@ void close_syslog(void);
void redirect_stdout_stderr(const char *file, bool append);
#ifdef _WIN32
-/* get original stderr handle, even if redirected by --log/--log-append */
-HANDLE get_orig_stderr(void);
+/* get original stderr fd, even if redirected by --log/--log-append */
+int get_orig_stderr(void);
#endif