diff --git a/include/uv.h b/include/uv.h index 08cb3434..6052829e 100644 --- a/include/uv.h +++ b/include/uv.h @@ -1170,7 +1170,13 @@ enum uv_process_flags { * search for the exact file name before trying variants with * extensions like '.exe' or '.cmd'. */ - UV_PROCESS_WINDOWS_FILE_PATH_EXACT_NAME = (1 << 7) + UV_PROCESS_WINDOWS_FILE_PATH_EXACT_NAME = (1 << 7), + /* + * Spawn the child process with the error mode of its parent. + * This option is only meaningful on Windows systems. On Unix + * it is silently ignored. + */ + UV_PROCESS_WINDOWS_USE_PARENT_ERROR_MODE = (1 << 8) }; /* diff --git a/src/unix/process.c b/src/unix/process.c index b988fe8b..652f14db 100644 --- a/src/unix/process.c +++ b/src/unix/process.c @@ -1029,7 +1029,8 @@ int uv_spawn(uv_loop_t* loop, UV_PROCESS_WINDOWS_HIDE | UV_PROCESS_WINDOWS_HIDE_CONSOLE | UV_PROCESS_WINDOWS_HIDE_GUI | - UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS | + UV_PROCESS_WINDOWS_USE_PARENT_ERROR_MODE))); uv__handle_init(loop, (uv_handle_t*)process, UV_PROCESS); uv__queue_init(&process->queue); diff --git a/src/win/process.c b/src/win/process.c index eade73fe..39138a3b 100644 --- a/src/win/process.c +++ b/src/win/process.c @@ -941,7 +941,8 @@ int uv_spawn(uv_loop_t* loop, UV_PROCESS_WINDOWS_HIDE | UV_PROCESS_WINDOWS_HIDE_CONSOLE | UV_PROCESS_WINDOWS_HIDE_GUI | - UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS | + UV_PROCESS_WINDOWS_USE_PARENT_ERROR_MODE))); err = uv__utf8_to_utf16_alloc(options->file, &application); if (err) @@ -1040,6 +1041,10 @@ int uv_spawn(uv_loop_t* loop, process_flags = CREATE_UNICODE_ENVIRONMENT | CREATE_DEFAULT_ERROR_MODE; + if (options->flags & UV_PROCESS_WINDOWS_USE_PARENT_ERROR_MODE) { + process_flags &= ~(CREATE_DEFAULT_ERROR_MODE); + } + if ((options->flags & UV_PROCESS_WINDOWS_HIDE_CONSOLE) || (options->flags & UV_PROCESS_WINDOWS_HIDE)) { /* Avoid creating console window if stdio is not inherited. */