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.
This commit is contained in:
dsnelgrove 2024-10-17 12:39:44 -07:00 committed by GitHub
parent 073f3d8bc2
commit 8ad246557a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 15 additions and 3 deletions

View File

@ -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)
};
/*

View File

@ -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);

View File

@ -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. */