Module: wine Branch: master Commit: 1e4c17e5ddc30581067c13cff48e672b1a292329 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e4c17e5ddc30581067c13cff4...
Author: Frédéric Delanoy frederic.delanoy@gmail.com Date: Thu Oct 13 17:30:17 2011 +0200
cmd: Make MOVE work for read-only files.
---
programs/cmd/builtins.c | 87 +++++++++++++---------------- programs/cmd/tests/test_builtins.cmd.exp | 2 +- 2 files changed, 40 insertions(+), 49 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 1db9b3c..ed2b6f0 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -1554,8 +1554,8 @@ void WCMD_if (WCHAR *p, CMD_LIST **cmdList) { * Move a file, directory tree or wildcarded set of files. */
-void WCMD_move (void) { - +void WCMD_move (void) +{ int status; WIN32_FIND_DATAW fd; HANDLE hff; @@ -1594,6 +1594,7 @@ void WCMD_move (void) { WCHAR dest[MAX_PATH]; WCHAR src[MAX_PATH]; DWORD attribs; + BOOL ok = TRUE;
WINE_TRACE("Processing file '%s'\n", wine_dbgstr_w(fd.cFileName));
@@ -1617,60 +1618,50 @@ void WCMD_move (void) { WINE_TRACE("Source '%s'\n", wine_dbgstr_w(src)); WINE_TRACE("Dest '%s'\n", wine_dbgstr_w(dest));
- /* Check if file is read only, otherwise move it */ - attribs = GetFileAttributesW(src); - if ((attribs != INVALID_FILE_ATTRIBUTES) && - (attribs & FILE_ATTRIBUTE_READONLY)) { - SetLastError(ERROR_ACCESS_DENIED); - status = 0; - } else { - BOOL ok = TRUE; - - /* If destination exists, prompt unless /Y supplied */ - if (GetFileAttributesW(dest) != INVALID_FILE_ATTRIBUTES) { - BOOL force = FALSE; - WCHAR copycmd[MAXSTRING]; - int len; - - /* /-Y has the highest priority, then /Y and finally the COPYCMD env. variable */ - if (strstrW (quals, parmNoY)) - force = FALSE; - else if (strstrW (quals, parmY)) - force = TRUE; - else { - static const WCHAR copyCmdW[] = {'C','O','P','Y','C','M','D','\0'}; - len = GetEnvironmentVariableW(copyCmdW, copycmd, sizeof(copycmd)/sizeof(WCHAR)); - force = (len && len < (sizeof(copycmd)/sizeof(WCHAR)) - && ! lstrcmpiW (copycmd, parmY)); - } + /* If destination exists, prompt unless /Y supplied */ + if (GetFileAttributesW(dest) != INVALID_FILE_ATTRIBUTES) { + BOOL force = FALSE; + WCHAR copycmd[MAXSTRING]; + int len;
- /* Prompt if overwriting */ - if (!force) { - WCHAR question[MAXSTRING]; - WCHAR yesChar[10]; + /* /-Y has the highest priority, then /Y and finally the COPYCMD env. variable */ + if (strstrW (quals, parmNoY)) + force = FALSE; + else if (strstrW (quals, parmY)) + force = TRUE; + else { + static const WCHAR copyCmdW[] = {'C','O','P','Y','C','M','D','\0'}; + len = GetEnvironmentVariableW(copyCmdW, copycmd, sizeof(copycmd)/sizeof(WCHAR)); + force = (len && len < (sizeof(copycmd)/sizeof(WCHAR)) + && ! lstrcmpiW (copycmd, parmY)); + }
- strcpyW(yesChar, WCMD_LoadMessage(WCMD_YES)); + /* Prompt if overwriting */ + if (!force) { + WCHAR question[MAXSTRING]; + WCHAR yesChar[10];
- /* Ask for confirmation */ - wsprintfW(question, WCMD_LoadMessage(WCMD_OVERWRITE), dest); - ok = WCMD_ask_confirm(question, FALSE, NULL); + strcpyW(yesChar, WCMD_LoadMessage(WCMD_YES));
- /* So delete the destination prior to the move */ - if (ok) { - if (!DeleteFileW(dest)) { - WCMD_print_error (); - errorlevel = 1; - ok = FALSE; - } + /* Ask for confirmation */ + wsprintfW(question, WCMD_LoadMessage(WCMD_OVERWRITE), dest); + ok = WCMD_ask_confirm(question, FALSE, NULL); + + /* So delete the destination prior to the move */ + if (ok) { + if (!DeleteFileW(dest)) { + WCMD_print_error (); + errorlevel = 1; + ok = FALSE; } } } + }
- if (ok) { - status = MoveFileW(src, dest); - } else { - status = 1; /* Anything other than 0 to prevent error msg below */ - } + if (ok) { + status = MoveFileW(src, dest); + } else { + status = 1; /* Anything other than 0 to prevent error msg below */ }
if (!status) { diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 2318d08..e45016c 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -609,7 +609,7 @@ bar file move succeeded @todo_wine@file move with overwrite succeeded@or_broken@file overwrite impossible! @todo_wine@bar@or_broken@baz -@todo_wine@read-only files are moveable +read-only files are moveable file moved in subdirectory @todo_wine@moving a file to itself is a no-op@or_broken@moving a file to itself should be a no-op! @todo_wine@ErrorLevel: 0@or_broken@ErrorLevel: 1