You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2007/12/28 18:57:56 UTC

svn commit: r607302 - /httpd/httpd/branches/2.0.x/server/mpm/winnt/nt_eventlog.c

Author: wrowe
Date: Fri Dec 28 09:57:55 2007
New Revision: 607302

URL: http://svn.apache.org/viewvc?rev=607302&view=rev
Log:
Correct the approach to std file handles by simplifying the approach 
and taking better advantage of apr's now-proper support.

Already verified by Randy Kobes and Tom Donovan

Sync to trunk r580433

Modified:
    httpd/httpd/branches/2.0.x/server/mpm/winnt/nt_eventlog.c

Modified: httpd/httpd/branches/2.0.x/server/mpm/winnt/nt_eventlog.c
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.0.x/server/mpm/winnt/nt_eventlog.c?rev=607302&r1=607301&r2=607302&view=diff
==============================================================================
--- httpd/httpd/branches/2.0.x/server/mpm/winnt/nt_eventlog.c (original)
+++ httpd/httpd/branches/2.0.x/server/mpm/winnt/nt_eventlog.c Fri Dec 28 09:57:55 2007
@@ -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 @@
     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 @@
 
     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