stoddard 00/02/17 11:03:52
Modified: src/main http_log.c src/lib/apr/file_io/win32 filedup.c Log: Update Windows ap_filedup() call to recognise when it is asked to dup2 a standard i/o handle. Return error if the dup2 handle is not one of the standard i/o handles (because Windows does not support a dup2 style function to operate on native file handles) Revision Changes Path 1.30 +4 -8 apache-2.0/src/main/http_log.c Index: http_log.c =================================================================== RCS file: /home/cvs/apache-2.0/src/main/http_log.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- http_log.c 2000/02/15 22:51:23 1.29 +++ http_log.c 2000/02/17 19:03:52 1.30 @@ -264,18 +264,15 @@ replace_stderr = 1; if (s_main->error_log) { + /* replace stderr with this new log */ #ifdef WIN32 + /* ToDo: Create ap_fflush() */ 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... */ + fflush(stderr); +#endif ap_open_stderr(&errfile, p); if ((rc = ap_dupfile(&errfile, s_main->error_log)) != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_CRIT, rc, s_main, @@ -283,7 +280,6 @@ } 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 1.8 +23 -13 apache-2.0/src/lib/apr/file_io/win32/filedup.c Index: filedup.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/filedup.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- filedup.c 2000/02/15 22:38:27 1.7 +++ filedup.c 2000/02/17 19:03:52 1.8 @@ -61,33 +61,42 @@ ap_status_t ap_dupfile(struct file_t **new_file, struct file_t *old_file) { - int have_file = 0; HANDLE hCurrentProcess = GetCurrentProcess(); if ((*new_file) == NULL) { - (*new_file) = (struct file_t *)ap_pcalloc(old_file->cntxt, - sizeof(struct file_t)); + (*new_file) = (struct file_t *) ap_pcalloc(old_file->cntxt, + sizeof(struct file_t)); if ((*new_file) == NULL) { return APR_ENOMEM; } - } else { - have_file = 1; - } - - (*new_file)->cntxt = old_file->cntxt; - if (have_file) { - /* dup2 is not supported with native Windows handles */ - return APR_ENOTIMPL; - } - else { if (!DuplicateHandle(hCurrentProcess, old_file->filehand, hCurrentProcess, &(*new_file)->filehand, 0, FALSE, DUPLICATE_SAME_ACCESS)) { return GetLastError(); } + } else { + HANDLE hFile = (*new_file)->filehand; + /* dup2 is not supported with native Windows handles. We + * can, however, emulate dup2 for the standard i/o handles. + */ + if (hFile == GetStdHandle(STD_ERROR_HANDLE)) { + if (!SetStdHandle(STD_ERROR_HANDLE, old_file->filehand)) + return GetLastError(); + } + else if (hFile == GetStdHandle(STD_OUTPUT_HANDLE)) { + if (!SetStdHandle(STD_OUTPUT_HANDLE, old_file->filehand)) + return GetLastError(); + } + else if (hFile == GetStdHandle(STD_INPUT_HANDLE)) { + if (!SetStdHandle(STD_INPUT_HANDLE, old_file->filehand)) + return GetLastError(); + } + else + return APR_ENOTIMPL; } + (*new_file)->cntxt = old_file->cntxt; (*new_file)->fname = ap_pstrdup(old_file->cntxt, old_file->fname); (*new_file)->demonfname = ap_pstrdup(old_file->cntxt, old_file->demonfname); (*new_file)->lowerdemonfname = ap_pstrdup(old_file->cntxt, old_file->lowerdemonfname); @@ -102,6 +111,7 @@ (*new_file)->ctime = old_file->ctime; ap_register_cleanup((*new_file)->cntxt, (void *)(*new_file), file_cleanup, ap_null_cleanup); + return APR_SUCCESS; }