228
229
if (file->filehand != INVALID_HANDLE_VALUE) {
231
if (file->buffered) {
232
/* XXX: flush here is not mutex protected */
233
flush_rv = apr_file_flush((apr_file_t *)thefile);
230
236
/* In order to avoid later segfaults with handle 'reuse',
231
237
* we must protect against the case that a dup2'ed handle
232
238
* is being closed, and invalidate the corresponding StdHandle
239
* We also tell msvcrt when stdhandles are closed.
234
if (file->filehand == GetStdHandle(STD_ERROR_HANDLE)) {
235
SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE);
237
if (file->filehand == GetStdHandle(STD_OUTPUT_HANDLE)) {
238
SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE);
240
if (file->filehand == GetStdHandle(STD_INPUT_HANDLE)) {
241
SetStdHandle(STD_INPUT_HANDLE, INVALID_HANDLE_VALUE);
241
if (file->flags & APR_STD_FLAGS)
243
if ((file->flags & APR_STD_FLAGS) == APR_STDERR_FLAG) {
245
SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE);
247
else if ((file->flags & APR_STD_FLAGS) == APR_STDOUT_FLAG) {
249
SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE);
251
else if ((file->flags & APR_STD_FLAGS) == APR_STDIN_FLAG) {
253
SetStdHandle(STD_INPUT_HANDLE, INVALID_HANDLE_VALUE);
257
CloseHandle(file->filehand);
244
if (file->buffered) {
245
/* XXX: flush here is not mutex protected */
246
flush_rv = apr_file_flush((apr_file_t *)thefile);
248
CloseHandle(file->filehand);
249
259
file->filehand = INVALID_HANDLE_VALUE;
251
261
if (file->pOverlapped && file->pOverlapped->hEvent) {
575
585
apr_set_os_error(APR_SUCCESS);
576
586
file_handle = GetStdHandle(STD_ERROR_HANDLE);
577
if (!file_handle || (file_handle == INVALID_HANDLE_VALUE)) {
578
apr_status_t rv = apr_get_os_error();
579
if (rv == APR_SUCCESS) {
588
file_handle = INVALID_HANDLE_VALUE;
585
return apr_os_file_put(thefile, &file_handle, 0, pool);
590
return apr_os_file_put(thefile, &file_handle,
591
APR_WRITE | APR_STDERR_FLAG, pool);
596
602
apr_set_os_error(APR_SUCCESS);
597
603
file_handle = GetStdHandle(STD_OUTPUT_HANDLE);
598
if (!file_handle || (file_handle == INVALID_HANDLE_VALUE)) {
599
apr_status_t rv = apr_get_os_error();
600
if (rv == APR_SUCCESS) {
605
file_handle = INVALID_HANDLE_VALUE;
606
return apr_os_file_put(thefile, &file_handle, 0, pool);
607
return apr_os_file_put(thefile, &file_handle,
608
APR_WRITE | APR_STDOUT_FLAG, pool);
617
619
apr_set_os_error(APR_SUCCESS);
618
620
file_handle = GetStdHandle(STD_INPUT_HANDLE);
619
if (!file_handle || (file_handle == INVALID_HANDLE_VALUE)) {
620
apr_status_t rv = apr_get_os_error();
621
if (rv == APR_SUCCESS) {
622
file_handle = INVALID_HANDLE_VALUE;
627
return apr_os_file_put(thefile, &file_handle, 0, pool);
624
return apr_os_file_put(thefile, &file_handle,
625
APR_READ | APR_STDIN_FLAG, pool);