Commit 1e4c17e5 authored by Frédéric Delanoy's avatar Frédéric Delanoy Committed by Alexandre Julliard

cmd: Make MOVE work for read-only files.

parent ad9ae2b8
...@@ -1554,8 +1554,8 @@ void WCMD_if (WCHAR *p, CMD_LIST **cmdList) { ...@@ -1554,8 +1554,8 @@ void WCMD_if (WCHAR *p, CMD_LIST **cmdList) {
* Move a file, directory tree or wildcarded set of files. * Move a file, directory tree or wildcarded set of files.
*/ */
void WCMD_move (void) { void WCMD_move (void)
{
int status; int status;
WIN32_FIND_DATAW fd; WIN32_FIND_DATAW fd;
HANDLE hff; HANDLE hff;
...@@ -1594,6 +1594,7 @@ void WCMD_move (void) { ...@@ -1594,6 +1594,7 @@ void WCMD_move (void) {
WCHAR dest[MAX_PATH]; WCHAR dest[MAX_PATH];
WCHAR src[MAX_PATH]; WCHAR src[MAX_PATH];
DWORD attribs; DWORD attribs;
BOOL ok = TRUE;
WINE_TRACE("Processing file '%s'\n", wine_dbgstr_w(fd.cFileName)); WINE_TRACE("Processing file '%s'\n", wine_dbgstr_w(fd.cFileName));
...@@ -1617,60 +1618,50 @@ void WCMD_move (void) { ...@@ -1617,60 +1618,50 @@ void WCMD_move (void) {
WINE_TRACE("Source '%s'\n", wine_dbgstr_w(src)); WINE_TRACE("Source '%s'\n", wine_dbgstr_w(src));
WINE_TRACE("Dest '%s'\n", wine_dbgstr_w(dest)); WINE_TRACE("Dest '%s'\n", wine_dbgstr_w(dest));
/* Check if file is read only, otherwise move it */ /* If destination exists, prompt unless /Y supplied */
attribs = GetFileAttributesW(src); if (GetFileAttributesW(dest) != INVALID_FILE_ATTRIBUTES) {
if ((attribs != INVALID_FILE_ATTRIBUTES) && BOOL force = FALSE;
(attribs & FILE_ATTRIBUTE_READONLY)) { WCHAR copycmd[MAXSTRING];
SetLastError(ERROR_ACCESS_DENIED); int len;
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));
}
/* Prompt if overwriting */ /* /-Y has the highest priority, then /Y and finally the COPYCMD env. variable */
if (!force) { if (strstrW (quals, parmNoY))
WCHAR question[MAXSTRING]; force = FALSE;
WCHAR yesChar[10]; 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 */ strcpyW(yesChar, WCMD_LoadMessage(WCMD_YES));
wsprintfW(question, WCMD_LoadMessage(WCMD_OVERWRITE), dest);
ok = WCMD_ask_confirm(question, FALSE, NULL);
/* So delete the destination prior to the move */ /* Ask for confirmation */
if (ok) { wsprintfW(question, WCMD_LoadMessage(WCMD_OVERWRITE), dest);
if (!DeleteFileW(dest)) { ok = WCMD_ask_confirm(question, FALSE, NULL);
WCMD_print_error ();
errorlevel = 1; /* So delete the destination prior to the move */
ok = FALSE; if (ok) {
} if (!DeleteFileW(dest)) {
WCMD_print_error ();
errorlevel = 1;
ok = FALSE;
} }
} }
} }
}
if (ok) { if (ok) {
status = MoveFileW(src, dest); status = MoveFileW(src, dest);
} else { } else {
status = 1; /* Anything other than 0 to prevent error msg below */ status = 1; /* Anything other than 0 to prevent error msg below */
}
} }
if (!status) { if (!status) {
......
...@@ -609,7 +609,7 @@ bar ...@@ -609,7 +609,7 @@ bar
file move succeeded file move succeeded
@todo_wine@file move with overwrite succeeded@or_broken@file overwrite impossible! @todo_wine@file move with overwrite succeeded@or_broken@file overwrite impossible!
@todo_wine@bar@or_broken@baz @todo_wine@bar@or_broken@baz
@todo_wine@read-only files are moveable read-only files are moveable
file moved in subdirectory 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@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 @todo_wine@ErrorLevel: 0@or_broken@ErrorLevel: 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment