From 8ad246557af88da78ef621afccabd8fc3351db33 Mon Sep 17 00:00:00 2001 From: dsnelgrove Date: Thu, 17 Oct 2024 12:39:44 -0700 Subject: [PATCH] win,process: allow users to configure child error mode (#4569) Add UV_PROCESS_WINDOWS_USE_PARENT_ERROR_MODE to allow the user to propagate user-controlled process-wide SetErrorMode to child processes (for cmake). Default behavior is unchanged. --- include/uv.h | 8 +++++++- src/unix/process.c | 3 ++- src/win/process.c | 7 ++++++- 3 files changed, 15 insertions(+), 3 deletions(-) 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. */