misc fixes

This commit is contained in:
2026-07-21 17:10:33 +10:00
parent 3f8261fa0d
commit 56c765e944
3 changed files with 60 additions and 26 deletions
+29 -12
View File
@@ -867,8 +867,10 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
if (it.index)
count_req += cmd_separator.count;
if (DN_Str8Find(*it.data, DN_Str8FindFlag_Whitespace).found)
count_req += 2; // If there's whitespace, we'll quote the string for the user
if (!DN_Str8StartsWithSensitive(*it.data, DN_Str8Lit("\""))) {
if (DN_Str8Find(*it.data, DN_Str8FindFlag_Whitespace).found)
count_req += 2; // If there's whitespace, we'll quote the string for the user
}
count_req += it.data->count;
}
@@ -883,8 +885,11 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
}
// NOTE: Quote the string if needed
DN_Str8 str8 = *it.data;
bool needs_quotes = DN_Str8Find(str8, DN_Str8FindFlag_Whitespace).found;
DN_Str8 str8 = *it.data;
bool needs_quotes = false;
if (!DN_Str8StartsWithSensitive(*it.data, DN_Str8Lit("\"")))
needs_quotes = DN_Str8Find(str8, DN_Str8FindFlag_Whitespace).found;
if (needs_quotes)
cmd.data[write_index++] = '\"';
@@ -932,7 +937,7 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
if (DN_BitIsSet(args.flags, DN_OSExecFlags_SaveStdout)) {
if (!CreatePipe(&stdout_read, &stdout_write, &save_std_security_attribs, /*nSize*/ 0)) {
DN_OSW32Error win_error = DN_OS_W32LastError(&scratch.arena);
result.os_error_code = win_error.code;
result.os_error_code = win_error.code;
DN_ErrSinkAppendF(
err,
result.os_error_code,
@@ -1001,14 +1006,23 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
}
}
// NOTE: Create a null stdin pipe so child gets EOF on read
// TODO: Eventually we should let the caller optionally write to stdin
HANDLE stdin_read = {};
if (DN_BitIsSet(args.flags, DN_OSExecFlags_SaveStdout) || DN_BitIsSet(args.flags, DN_OSExecFlags_SaveStderr)) {
HANDLE stdin_write = {};
if (CreatePipe(&stdin_read, &stdin_write, &save_std_security_attribs, 0))
CloseHandle(stdin_write);
}
// NOTE: Execute command
PROCESS_INFORMATION proc_info = {};
STARTUPINFOW startup_info = {};
startup_info.cb = sizeof(STARTUPINFOW);
startup_info.hStdError = stderr_write ? stderr_write : GetStdHandle(STD_ERROR_HANDLE);
startup_info.hStdOutput = stdout_write ? stdout_write : GetStdHandle(STD_OUTPUT_HANDLE);
startup_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startup_info.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION proc_info = {};
STARTUPINFOW startup_info = {};
startup_info.cb = sizeof(STARTUPINFOW);
startup_info.hStdError = stderr_write ? stderr_write : GetStdHandle(STD_ERROR_HANDLE);
startup_info.hStdOutput = stdout_write ? stdout_write : GetStdHandle(STD_OUTPUT_HANDLE);
startup_info.hStdInput = stdin_read ? stdin_read : GetStdHandle(STD_INPUT_HANDLE);
startup_info.dwFlags |= STARTF_USESTDHANDLES;
BOOL create_result = CreateProcessW(nullptr,
cmd16.data,
nullptr,
@@ -1019,6 +1033,9 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Str8Slice cmd_line, DN_OSExecArgs
working_dir16.data,
&startup_info,
&proc_info);
if (stdin_read)
CloseHandle(stdin_read);
if (!create_result) {
DN_OSW32Error win_error = DN_OS_W32LastError(&scratch.arena);
result.os_error_code = win_error.code;