Jason Edmeades : cmd.exe: Add 2>&1 and 1>&2 support.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Mar 13 07:56:06 CDT 2007
Module: wine
Branch: master
Commit: a801995cdbe4976785762e431b9d0648696ff46a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a801995cdbe4976785762e431b9d0648696ff46a
Author: Jason Edmeades <us at edmeades.me.uk>
Date: Tue Mar 13 00:10:38 2007 +0000
cmd.exe: Add 2>&1 and 1>&2 support.
---
programs/cmd/wcmdmain.c | 39 +++++++++++++++++++++++++++++----------
1 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 037efcc..1bb9154 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -533,18 +533,37 @@ void WCMD_process_command (char *command)
else {
creationDisposition = CREATE_ALWAYS;
}
+
+ /* Add support for 2>&1 */
redir = p;
- h = CreateFile (WCMD_parameter (p, 0, NULL), GENERIC_WRITE, 0, &sa, creationDisposition,
- FILE_ATTRIBUTE_NORMAL, NULL);
- if (h == INVALID_HANDLE_VALUE) {
- WCMD_print_error ();
- HeapFree( GetProcessHeap(), 0, cmd );
- return;
- }
- if (SetFilePointer (h, 0, NULL, FILE_END) ==
- INVALID_SET_FILE_POINTER) {
- WCMD_print_error ();
+ if (*p == '&') {
+ int idx = *(p+1) - '0';
+
+ if (DuplicateHandle(GetCurrentProcess(),
+ GetStdHandle(idx_stdhandles[idx]),
+ GetCurrentProcess(),
+ &h,
+ 0, TRUE, DUPLICATE_SAME_ACCESS) == 0) {
+ WINE_FIXME("Duplicating handle failed with gle %d\n", GetLastError());
+ }
+ WINE_TRACE("Redirect %d (%p) to %d (%p)\n", handle, GetStdHandle(idx_stdhandles[idx]), idx, h);
+
+ } else {
+ char *param = WCMD_parameter (p, 0, NULL);
+ h = CreateFile (param, GENERIC_WRITE, 0, &sa, creationDisposition,
+ FILE_ATTRIBUTE_NORMAL, NULL);
+ if (h == INVALID_HANDLE_VALUE) {
+ WCMD_print_error ();
+ HeapFree( GetProcessHeap(), 0, cmd );
+ return;
+ }
+ if (SetFilePointer (h, 0, NULL, FILE_END) ==
+ INVALID_SET_FILE_POINTER) {
+ WCMD_print_error ();
+ }
+ WINE_TRACE("Redirect %d to '%s' (%p)\n", handle, param, h);
}
+
old_stdhandles[handle] = GetStdHandle (idx_stdhandles[handle]);
SetStdHandle (idx_stdhandles[handle], h);
}
More information about the wine-cvs
mailing list