Commit 615bb1a0 authored by Bill Stoddard's avatar Bill Stoddard
Browse files

ap_dupfile (specifically dup2) is not available in a general form under Windows.

So use SetStdHandle directly. A single call to ap_dup2stderr() (or similar) could
replace the entire chunk of code in the #ifdef #else #endif block.  Ryan didn't
want to put this speciality function into APR, but we could put it into os.c
if folks are interested.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@84624 13f79535-47bb-0310-9956-ffa450edef68
parent b66bd60e
Loading
Loading
Loading
Loading
+14 −2
Changes for server/log.c: 14 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -255,6 +255,7 @@ static void open_error_log(server_rec *s, ap_context_t *p)

void ap_open_logs(server_rec *s_main, ap_context_t *p)
{
    ap_status_t rc = APR_SUCCESS;
    server_rec *virt, *q;
    int replace_stderr;
    ap_file_t *errfile = NULL;
@@ -263,15 +264,26 @@ void ap_open_logs(server_rec *s_main, ap_context_t *p)

    replace_stderr = 1;
    if (s_main->error_log) {
#ifdef WIN32
        HANDLE hFile;
        ap_get_os_file(&hFile, s_main->error_log);
        FlushFileBuffers(hFile);
        if (!SetStdHandle(STD_ERROR_HANDLE, hFile)) {
            ap_log_error(APLOG_MARK, APLOG_CRIT, GetLastError(), s_main,
                         "unable to replace stderr with error_log");
        }
        replace_stderr = 0;
#else
        /* replace stderr with this new log */
        fflush(stderr); /* ToDo: replace this with an APR call... */
        ap_open_stderr(&errfile, p);        
        if (ap_dupfile(&errfile, s_main->error_log) != APR_SUCCESS) {
            ap_log_error(APLOG_MARK, APLOG_CRIT, errno, s_main,
        if ((rc = ap_dupfile(&errfile, s_main->error_log)) != APR_SUCCESS) {
            ap_log_error(APLOG_MARK, APLOG_CRIT, rc, s_main,
                         "unable to replace stderr with error_log");
        } else {
            replace_stderr = 0;
        }
#endif
    }
    /* note that stderr may still need to be replaced with something
     * because it points to the old error log, or back to the tty