From: Eric Pouech epouech@codeweavers.com
Adding dedicated entry point for VOL command (ie not shared with LABEL command), and introducing a helper to display volume information.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 46 +++++++++++++++++++++++- programs/cmd/directory.c | 12 +++---- programs/cmd/tests/test_builtins.cmd.exp | 8 ++--- programs/cmd/wcmd.h | 5 ++- programs/cmd/wcmdmain.c | 4 +-- 5 files changed, 61 insertions(+), 14 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 2f6e34f6172..09d6ce631b8 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3739,6 +3739,22 @@ RETURN_CODE WCMD_version(void) return errorlevel = return_code; }
+BOOL WCMD_print_volume_information(const WCHAR *path) +{ + WCHAR label[MAX_PATH]; + DWORD serial; + + if (!GetVolumeInformationW(path, label, ARRAY_SIZE(label), &serial, NULL, NULL, NULL, 0)) + return FALSE; + if (label[0]) + WCMD_output(WCMD_LoadMessage(WCMD_VOLUMELABEL), path[0], label); + else + WCMD_output(WCMD_LoadMessage(WCMD_VOLUMENOLABEL), path[0]); + + WCMD_output(WCMD_LoadMessage(WCMD_VOLUMESERIALNO), HIWORD(serial), LOWORD(serial)); + return TRUE; +} + /**************************************************************************** * WCMD_volume * @@ -3747,7 +3763,7 @@ RETURN_CODE WCMD_version(void) * Returns 1 on success, 0 otherwise */
-int WCMD_volume(BOOL set_label, const WCHAR *path) +int WCMD_old_volume(BOOL set_label, const WCHAR *path) { DWORD count, serial; WCHAR string[MAX_PATH], label[MAX_PATH], curdir[MAX_PATH]; @@ -3800,6 +3816,34 @@ int WCMD_volume(BOOL set_label, const WCHAR *path) return 1; }
+RETURN_CODE WCMD_volume(void) +{ + WCHAR curdir[MAX_PATH]; + RETURN_CODE return_code = NO_ERROR; + + if (*quals) + return errorlevel = ERROR_INVALID_FUNCTION; + if (!*param1) + { + if (!GetCurrentDirectoryW(ARRAY_SIZE(curdir), curdir)) + return errorlevel = ERROR_INVALID_FUNCTION; + } + else if (param1[1] == L':' && !param1[2]) + { + memcpy(curdir, param1, 2 * sizeof(WCHAR)); + } + else + return errorlevel = ERROR_INVALID_FUNCTION; + curdir[2] = L'\'; + curdir[3] = L'\0'; + if (!WCMD_print_volume_information(curdir)) + { + return_code = GetLastError(); + WCMD_print_error(); + } + return errorlevel = return_code; +} + /************************************************************************** * WCMD_exit * diff --git a/programs/cmd/directory.c b/programs/cmd/directory.c index fdcae9f6a94..3f4f7853710 100644 --- a/programs/cmd/directory.c +++ b/programs/cmd/directory.c @@ -934,14 +934,14 @@ RETURN_CODE WCMD_directory(WCHAR *args) lastDrive = towupper(thisEntry->dirName[0]);
if (!bare) { - WCHAR drive[3]; - + WCHAR drive[4]; WINE_TRACE("Writing volume for '%c:'\n", thisEntry->dirName[0]); - memcpy(drive, thisEntry->dirName, 2 * sizeof(WCHAR)); - drive[2] = 0x00; - status = WCMD_volume (0, drive); + drive[0] = thisEntry->dirName[0]; + drive[1] = thisEntry->dirName[1]; + drive[2] = L'\'; + drive[3] = L'\0'; trailerReqd = TRUE; - if (!status) { + if (!WCMD_print_volume_information(drive)) { errorlevel = ERROR_INVALID_FUNCTION; goto exit; } diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 2b6f735c4ba..6358d35ca49 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -559,10 +559,10 @@ SUCCESS 0 SUCCESS 0 FAILURE 1 --- success/failure for VOL command -@todo_wine@SUCCESS 0 -@todo_wine@SUCCESS 0 -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 +SUCCESS 0 +SUCCESS 0 +FAILURE 1 +FAILURE 1 --- success/failure for LABEL command @todo_wine@FAILURE 1 @todo_wine@--- diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 60504cdc3fe..3c1ebf0a2f0 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -159,6 +159,8 @@ typedef int RETURN_CODE; /* temporary to detect builtin commands not migrated to handle return code */ #define RETURN_CODE_OLD_CHAINING (-999998)
+BOOL WCMD_print_volume_information(const WCHAR *); + void WCMD_assoc (const WCHAR *, BOOL); RETURN_CODE WCMD_batch(const WCHAR *, WCHAR *, const WCHAR *, HANDLE); RETURN_CODE WCMD_call(WCHAR *command); @@ -205,7 +207,8 @@ void WCMD_title (const WCHAR *); RETURN_CODE WCMD_type(WCHAR *); RETURN_CODE WCMD_verify(void); RETURN_CODE WCMD_version(void); -int WCMD_volume (BOOL set_label, const WCHAR *args); +RETURN_CODE WCMD_volume(void); +int WCMD_old_volume (BOOL set_label, const WCHAR *args); void WCMD_mklink(WCHAR *args);
WCHAR *WCMD_fgets (WCHAR *buf, DWORD n, HANDLE stream); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 7ede9ae09ab..24da1d3630a 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1849,7 +1849,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) WCMD_give_help (parms_start); break; case WCMD_LABEL: - WCMD_volume (TRUE, parms_start); + WCMD_old_volume (TRUE, parms_start); break; case WCMD_MD: case WCMD_MKDIR: @@ -1909,7 +1909,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_verify(); break; case WCMD_VOL: - WCMD_volume (FALSE, parms_start); + return_code = WCMD_volume(); break; case WCMD_PUSHD: return_code = WCMD_pushd(parms_start);