[PATCH 0/1] MR11572: cmd: Support OUT: legacy device name in redirections.
On Windows, OUT: (and OUT) is a special legacy device name that redirects to the default output device (by default, behaves like NUL). Wine's cmd.exe was creating actual files named OUT/OUT: instead. Fix this by adding redirect_out_device() which rewrites OUT/OUT: (case-insensitive) to NUL before file creation in push_std_redirections(). Pls tell me if anything needs to be added/removed in the test cases Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=42182 -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11572
From: Lokesh Poovaragan <lokesh.poovaragan@gmail.com> On Windows, OUT: (and OUT) is a special legacy device name that redirects to the default output device (by default, behaves like NUL). Wine's cmd.exe was creating actual files named OUT/OUT: instead. Fix this by adding redirect_out_device() which rewrites OUT/OUT: (case-insensitive) to NUL before file creation in push_std_redirections(). Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=42182 --- programs/cmd/tests/test_builtins.cmd | 12 ++++++++++++ programs/cmd/tests/test_builtins.cmd.exp | 4 ++++ programs/cmd/wcmdmain.c | 9 +++++++++ 3 files changed, 25 insertions(+) diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index 4ca987a8b05..c053c817e92 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -1565,6 +1565,18 @@ rd subdir /s /q del a.a b.b cd .. & rd foobar /s /q +echo ------------ Testing OUT ------------ +md foobar & cd foobar +echo > bar +echo foo > OUT +dir /b /a-d +echo foo > OUT: +dir /b /a-d +echo foo > out +dir /b /a-d +del bar +cd .. & rd foobar /s /q + echo ------------ Testing if/else ------------ echo --- if/else should work with blocks if 0 == 0 ( diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index c7015c61b7a..7a84d24caa0 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -1090,6 +1090,10 @@ Passed: file size check on a.a [7]@or_broken@Skipping file size check on NT4 Passed: file size check on b.b [8]@or_broken@Skipping file size check on NT4 Passed: file size check on a.a [7]@or_broken@Skipping file size check on NT4 Passed: file size check on subdir\a.a [8]@or_broken@Skipping file size check on NT4 +------------ Testing OUT ------------ +bar +bar +bar ------------ Testing if/else ------------ --- if/else should work with blocks if seems to work diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index d2250ce1bbd..208e0a42a88 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -2148,6 +2148,13 @@ static void pop_std_redirections(HANDLE saved[3]) } } +/* OUT: is a legacy device name, redirecting to the default output device (NUL) */ +static void redirect_out_device(WCHAR *filename) +{ + if (!wcsicmp(filename, L"OUT") || !wcsicmp(filename, L"OUT:")) + wcscpy(filename, L"NUL"); +} + static BOOL push_std_redirections(CMD_REDIRECTION *redir, HANDLE saved[3]) { static SECURITY_ATTRIBUTES sa = {.nLength = sizeof(sa), .lpSecurityDescriptor = NULL, .bInheritHandle = TRUE}; @@ -2170,6 +2177,7 @@ static BOOL push_std_redirections(CMD_REDIRECTION *redir, HANDLE saved[3]) case REDIR_READ_FROM: wcscpy(expanded_filename, redir->file); handleExpansion(expanded_filename, TRUE); + redirect_out_device(expanded_filename); h = CreateFileW(expanded_filename, GENERIC_READ, FILE_SHARE_READ, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h == INVALID_HANDLE_VALUE) @@ -2185,6 +2193,7 @@ static BOOL push_std_redirections(CMD_REDIRECTION *redir, HANDLE saved[3]) DWORD disposition = redir->kind == REDIR_WRITE_TO ? CREATE_ALWAYS : OPEN_ALWAYS; wcscpy(expanded_filename, redir->file); handleExpansion(expanded_filename, TRUE); + redirect_out_device(expanded_filename); h = CreateFileW(expanded_filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, &sa, disposition, FILE_ATTRIBUTE_NORMAL, NULL); if (h == INVALID_HANDLE_VALUE) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11572
participants (2)
-
Lokesh Poovaragan -
Lokesh Poovaragan (@lokeshpoovaragan)