[Bug 48396] New: 'cmd.exe /c move file1 file2' doesn't respect non-interactive mode, causing prompt for overwrite if destination file exists
WineHQ Bugzilla
wine-bugs at winehq.org
Tue Dec 31 10:57:47 CST 2019
https://bugs.winehq.org/show_bug.cgi?id=48396
Bug ID: 48396
Summary: 'cmd.exe /c move file1 file2' doesn't respect
non-interactive mode, causing prompt for overwrite if
destination file exists
Product: Wine
Version: 5.0-rc3
Hardware: x86-64
OS: Linux
Status: NEW
Severity: normal
Priority: P2
Component: cmd
Assignee: wine-bugs at winehq.org
Reporter: focht at gmx.net
Distribution: ---
Hello folks,
as it says. Noticed this with some scene installers that use batch files to
uncompress and concatenate files. At one point the progress stalls and a number
of 'cmd.exe' processes just sit around, waiting for input (they are
non-interactive). Reason: Wine's cmd.exe 'move' doesn't take non-interactive
mode into account when destination file exists.
Cmd's 'copy' works.
--- snip ---
$ echo "1" > test1
$ echo "2" > test2
# fails but should work
$ wine cmd /c move test1 test2
Overwrite Z:\home\focht\test2? (Yes|No)
--- snip ---
Setting 'COPYCMD' environment variable to '/Y' avoids the prompt, but still
doesn't overwrite the destination file with original which is another bug.
Oh boy, cmd.exe really needs some love. Still so broken after years.
Wine source:
https://source.winehq.org/git/wine.git/blob/HEAD:/programs/cmd/builtins.c#l2953
--- snip ---
2959 void WCMD_move (void)
2960 {
2961 BOOL status;
2962 WIN32_FIND_DATAW fd;
2963 HANDLE hff;
2964 WCHAR input[MAX_PATH];
2965 WCHAR output[MAX_PATH];
2966 WCHAR drive[10];
2967 WCHAR dir[MAX_PATH];
2968 WCHAR fname[MAX_PATH];
2969 WCHAR ext[MAX_PATH];
...
3023 /* If destination exists, prompt unless /Y supplied */
3024 if (GetFileAttributesW(dest) != INVALID_FILE_ATTRIBUTES) {
3025 BOOL force = FALSE;
3026 WCHAR copycmd[MAXSTRING];
3027 DWORD len;
3028
3029 /* /-Y has the highest priority, then /Y and finally the COPYCMD
env. variable */
3030 if (wcsstr (quals, parmNoY))
3031 force = FALSE;
3032 else if (wcsstr (quals, parmY))
3033 force = TRUE;
3034 else {
3035 static const WCHAR copyCmdW[] =
{'C','O','P','Y','C','M','D','\0'};
3036 len = GetEnvironmentVariableW(copyCmdW, copycmd,
ARRAY_SIZE(copycmd));
3037 force = (len && len < ARRAY_SIZE(copycmd) && !lstrcmpiW(copycmd,
parmY));
3038 }
3039
3040 /* Prompt if overwriting */
3041 if (!force) {
3042 WCHAR* question;
3043
3044 /* Ask for confirmation */
3045 question = WCMD_format_string(WCMD_LoadMessage(WCMD_OVERWRITE),
dest);
3046 ok = WCMD_ask_confirm(question, FALSE, NULL);
3047 LocalFree(question);
3048
3049 /* So delete the destination prior to the move */
3050 if (ok) {
3051 if (!DeleteFileW(dest)) {
3052 WCMD_print_error ();
3053 errorlevel = 1;
3054 ok = FALSE;
3055 }
3056 }
3057 }
3058 }
...
--- snip ---
While at it you could really refactor/unify the code more. Even basic 'COPYCMD'
handling is implemented in different code style (move vs. copy):
https://source.winehq.org/git/wine.git/blob/HEAD:/programs/cmd/builtins.c#l784
$ wine --version
wine-5.0-rc3
Regards
--
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.
More information about the wine-bugs
mailing list