From 1e4c17e5ddc30581067c13cff48e672b1a292329 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Delanoy?= Date: Thu, 13 Oct 2011 17:30:17 +0200 Subject: [PATCH] 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 1db9b3cbd6..ed2b6f081c 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 2318d08895..e45016c15e 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 -- 2.32.0.93.g670b81a890