diff options
Diffstat (limited to 'server/mpm/winnt/nt_eventlog.c')
-rw-r--r-- | server/mpm/winnt/nt_eventlog.c | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/server/mpm/winnt/nt_eventlog.c b/server/mpm/winnt/nt_eventlog.c index a0ae68c9..baa1a88b 100644 --- a/server/mpm/winnt/nt_eventlog.c +++ b/server/mpm/winnt/nt_eventlog.c @@ -21,6 +21,7 @@ #include "mpm_winnt.h" #include "apr_strings.h" #include "apr_lib.h" +#include "apr_portable.h" #include "ap_regkey.h" static char *display_name = NULL; @@ -138,7 +139,8 @@ void mpm_nt_eventlog_stderr_open(char *argv0, apr_pool_t *p) HANDLE hPipeWrite = NULL; HANDLE hDup = NULL; DWORD threadid; - int fd; + apr_file_t *eventlog_file; + apr_file_t *stderr_file; display_name = argv0; @@ -159,27 +161,11 @@ void mpm_nt_eventlog_stderr_open(char *argv0, apr_pool_t *p) WaitForSingleObject(stderr_ready, INFINITE); - /* Flush stderr and unset its buffer, then commit and replace stderr. - * This is typically a noop for Win2K/XP since services with NULL std - * handles [but valid FILE *'s, oddly enough], but is required - * for NT 4.0 and to use this code outside of services. - */ - fflush(stderr); - setvbuf(stderr, NULL, _IONBF, 0); - _commit(2 /* stderr */); - fd = _open_osfhandle((long) hPipeWrite, - _O_WRONLY | _O_BINARY); - _dup2(fd, 2); - _close(fd); - _setmode(2, _O_BINARY); - - /* hPipeWrite was _close()'ed above, and _dup2()'ed - * to fd 2 creating a new, inherited Win32 handle. - * Recover that real handle from fd 2. - */ - hPipeWrite = (HANDLE)_get_osfhandle(2); - - SetStdHandle(STD_ERROR_HANDLE, hPipeWrite); + if ((apr_file_open_stderr(&stderr_file, p) + == APR_SUCCESS) + && (apr_os_file_put(&eventlog_file, &hPipeWrite, APR_WRITE, p) + == APR_SUCCESS)) + apr_file_dup2(stderr_file, eventlog_file, p); /* The code above _will_ corrupt the StdHandle... * and we must do so anyways. We set this up only |