From: VMware, Inc <> Date: Mon, 26 Jul 2010 17:56:23 +0000 (-0700) Subject: Implement Vix code and Tools code for Move[File|Directory]InGuest guest operation. X-Git-Tag: 2010.07.25-280253~121 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46b286631cb6f7da46cb8affa39982f340409fbc;p=thirdparty%2Fopen-vm-tools.git Implement Vix code and Tools code for Move[File|Directory]InGuest guest operation. Signed-off-by: Marcelo Vanzin --- diff --git a/open-vm-tools/lib/foundryMsg/foundryMsg.c b/open-vm-tools/lib/foundryMsg/foundryMsg.c index 64368f2ae..c3185ee1f 100644 --- a/open-vm-tools/lib/foundryMsg/foundryMsg.c +++ b/open-vm-tools/lib/foundryMsg/foundryMsg.c @@ -427,8 +427,18 @@ static const VixCommandInfo vixCommandInfoTable[] = { VIX_DEFINE_COMMAND_INFO(VIX_COMMAND_QUERY_CHILDREN, VIX_COMMAND_CATEGORY_PRIVILEGED), + VIX_DEFINE_COMMAND_INFO(VIX_COMMAND_LIST_FILES, VIX_COMMAND_CATEGORY_ALWAYS_ALLOWED), + + VIX_DEFINE_COMMAND_INFO(VIX_COMMAND_CREATE_DIRECTORY_EX, + VIX_COMMAND_CATEGORY_PRIVILEGED), + + VIX_DEFINE_COMMAND_INFO(VIX_COMMAND_MOVE_GUEST_FILE_EX, + VIX_COMMAND_CATEGORY_ALWAYS_ALLOWED), + + VIX_DEFINE_COMMAND_INFO(VIX_COMMAND_MOVE_GUEST_DIRECTORY, + VIX_COMMAND_CATEGORY_ALWAYS_ALLOWED), }; diff --git a/open-vm-tools/lib/include/vixCommands.h b/open-vm-tools/lib/include/vixCommands.h index 4a593c630..72fdb3a36 100644 --- a/open-vm-tools/lib/include/vixCommands.h +++ b/open-vm-tools/lib/include/vixCommands.h @@ -683,6 +683,20 @@ struct VixCommandRenameFileRequest { #include "vmware_pack_end.h" VixCommandRenameFileRequest; +typedef +#include "vmware_pack_begin.h" +struct VixCommandRenameFileRequestEx { + VixCommandRequestHeader header; + + int32 copyFileOptions; + uint32 oldPathNameLength; + uint32 newPathNameLength; + uint32 filePropertiesLength; + Bool overwrite; +} +#include "vmware_pack_end.h" +VixCommandRenameFileRequestEx; + typedef #include "vmware_pack_begin.h" struct VixCommandHgfsSendPacket { @@ -775,6 +789,19 @@ struct VixMsgCreateFileRequest { #include "vmware_pack_end.h" VixMsgCreateFileRequest; +typedef +#include "vmware_pack_begin.h" +struct VixMsgCreateFileRequestEx { + VixCommandRequestHeader header; + + int32 fileOptions; + uint32 guestPathNameLength; + uint32 filePropertiesLength; + Bool createParentDirectories; +} +#include "vmware_pack_end.h" +VixMsgCreateFileRequestEx; + /* * ********************************************************** @@ -2220,6 +2247,12 @@ enum { VIX_COMMAND_LIST_FILES = 177, + VIX_COMMAND_CREATE_DIRECTORY_EX = 178, + + VIX_COMMAND_MOVE_GUEST_FILE_EX = 179, + + VIX_COMMAND_MOVE_GUEST_DIRECTORY = 180, + /* * HOWTO: Adding a new Vix Command. Step 2a. * @@ -2230,7 +2263,7 @@ enum { * Once a new command is added here, a command info field needs to be added * in bora/lib/foundryMsg. as well. */ - VIX_COMMAND_LAST_NORMAL_COMMAND = 178, + VIX_COMMAND_LAST_NORMAL_COMMAND = 181, VIX_TEST_UNSUPPORTED_TOOLS_OPCODE_COMMAND = 998, VIX_TEST_UNSUPPORTED_VMX_OPCODE_COMMAND = 999, diff --git a/open-vm-tools/lib/vixTools/vixTools.c b/open-vm-tools/lib/vixTools/vixTools.c index 99499fa6d..f8b425a24 100644 --- a/open-vm-tools/lib/vixTools/vixTools.c +++ b/open-vm-tools/lib/vixTools/vixTools.c @@ -219,7 +219,7 @@ static VixError VixToolsImpersonateUser(VixCommandRequestHeader *requestMsg, static const char *scriptFileBaseName = "vixScript"; -static VixError VixToolsMoveFile(VixCommandRequestHeader *requestMsg); +static VixError VixToolsMoveObject(VixCommandRequestHeader *requestMsg); static VixError VixToolsCreateTempFile(VixCommandRequestHeader *requestMsg, char **result); @@ -2005,7 +2005,7 @@ abort: /* *----------------------------------------------------------------------------- * - * VixToolsMoveFile -- + * VixToolsMoveObject -- * * * Return value: @@ -2018,7 +2018,7 @@ abort: */ VixError -VixToolsMoveFile(VixCommandRequestHeader *requestMsg) // IN +VixToolsMoveObject(VixCommandRequestHeader *requestMsg) // IN { VixError err = VIX_OK; char *srcFilePathName = NULL; @@ -2026,11 +2026,28 @@ VixToolsMoveFile(VixCommandRequestHeader *requestMsg) // IN Bool success; Bool impersonatingVMWareUser = FALSE; void *userToken = NULL; - VixCommandRenameFileRequest *renameRequest; + Bool overwrite = TRUE; + + if (VIX_COMMAND_MOVE_GUEST_FILE == requestMsg->opCode) { + VixCommandRenameFileRequest *renameRequest; + renameRequest = (VixCommandRenameFileRequest *) requestMsg; + srcFilePathName = ((char *) renameRequest) + sizeof(*renameRequest); + destFilePathName = srcFilePathName + renameRequest->oldPathNameLength + 1; + } else if ((VIX_COMMAND_MOVE_GUEST_FILE_EX == requestMsg->opCode) || + (VIX_COMMAND_MOVE_GUEST_DIRECTORY == requestMsg->opCode)) { + VixCommandRenameFileRequestEx *renameRequest; + renameRequest = (VixCommandRenameFileRequestEx *) requestMsg; + srcFilePathName = ((char *) renameRequest) + sizeof(*renameRequest); + destFilePathName = srcFilePathName + renameRequest->oldPathNameLength + 1; + overwrite = renameRequest->overwrite; + } else { + ASSERT(0); + Debug("%s: Invalid request with opcode %d received\n ", + __FUNCTION__, requestMsg->opCode); + err = VIX_E_FAIL; + goto abort; + } - renameRequest = (VixCommandRenameFileRequest *) requestMsg; - srcFilePathName = ((char *) renameRequest) + sizeof(*renameRequest); - destFilePathName = srcFilePathName + renameRequest->oldPathNameLength + 1; if ((0 == *srcFilePathName) || (0 == *destFilePathName)) { err = VIX_E_INVALID_ARG; goto abort; @@ -2042,6 +2059,11 @@ VixToolsMoveFile(VixCommandRequestHeader *requestMsg) // IN } impersonatingVMWareUser = TRUE; + if (!(File_Exists(srcFilePathName))) { + err = VIX_E_FILE_NOT_FOUND; + goto abort; + } + /* * Be careful. Renaming a file to itself can cause it to be deleted. * This should be a no-op anyway. @@ -2070,6 +2092,24 @@ VixToolsMoveFile(VixCommandRequestHeader *requestMsg) // IN goto abort; } + if (VIX_COMMAND_MOVE_GUEST_FILE_EX == requestMsg->opCode) { + if (File_IsDirectory(srcFilePathName)) { + err = VIX_E_NOT_A_FILE; + goto abort; + } + if (!overwrite) { + if (File_Exists(destFilePathName)) { + err = VIX_E_FILE_ALREADY_EXISTS; + goto abort; + } + } + } else if (VIX_COMMAND_MOVE_GUEST_DIRECTORY == requestMsg->opCode) { + if (!(File_IsDirectory(srcFilePathName))) { + err = VIX_E_NOT_A_DIRECTORY; + goto abort; + } + } + success = File_Rename(srcFilePathName, destFilePathName); if (!success) { err = FoundryToolsDaemon_TranslateSystemErr(); @@ -2083,7 +2123,7 @@ abort: VixToolsLogoutUser(userToken); return err; -} // VixToolsMoveFile +} // VixToolsMoveObject /* @@ -2251,10 +2291,27 @@ VixToolsCreateDirectory(VixCommandRequestHeader *requestMsg) // IN char *dirPathName = NULL; Bool impersonatingVMWareUser = FALSE; void *userToken = NULL; - VixMsgCreateFileRequest *dirRequest = NULL; + Bool createParentDirectories = TRUE; + + if (VIX_COMMAND_CREATE_DIRECTORY == requestMsg->opCode) { + VixMsgCreateFileRequest *dirRequest = NULL; + + dirRequest = (VixMsgCreateFileRequest *) requestMsg; + dirPathName = ((char *) dirRequest) + sizeof(*dirRequest); + } else if (VIX_COMMAND_CREATE_DIRECTORY_EX == requestMsg->opCode) { + VixMsgCreateFileRequestEx *dirRequest = NULL; + + dirRequest = (VixMsgCreateFileRequestEx *) requestMsg; + dirPathName = ((char *) dirRequest) + sizeof(*dirRequest); + createParentDirectories = dirRequest->createParentDirectories; + } else { + ASSERT(0); + Debug("%s: Invalid request with opcode %d received\n ", + __FUNCTION__, requestMsg->opCode); + err = VIX_E_FAIL; + goto abort; + } - dirRequest = (VixMsgCreateFileRequest *) requestMsg; - dirPathName = ((char *) dirRequest) + sizeof(*dirRequest); if (0 == *dirPathName) { err = VIX_E_INVALID_ARG; goto abort; @@ -2271,9 +2328,16 @@ VixToolsCreateDirectory(VixCommandRequestHeader *requestMsg) // IN goto abort; } - if (!(File_CreateDirectoryHierarchy(dirPathName))) { - err = FoundryToolsDaemon_TranslateSystemErr(); - goto abort; + if (createParentDirectories) { + if (!(File_CreateDirectoryHierarchy(dirPathName))) { + err = FoundryToolsDaemon_TranslateSystemErr(); + goto abort; + } + } else { + if (!(File_CreateDirectory(dirPathName))) { + err = FoundryToolsDaemon_TranslateSystemErr(); + goto abort; + } } abort: @@ -4584,12 +4648,15 @@ VixTools_ProcessVixCommand(VixCommandRequestHeader *requestMsg, // IN //////////////////////////////////// case VIX_COMMAND_CREATE_DIRECTORY: + case VIX_COMMAND_CREATE_DIRECTORY_EX: err = VixToolsCreateDirectory(requestMsg); break; //////////////////////////////////// case VIX_COMMAND_MOVE_GUEST_FILE: - err = VixToolsMoveFile(requestMsg); + case VIX_COMMAND_MOVE_GUEST_FILE_EX: + case VIX_COMMAND_MOVE_GUEST_DIRECTORY: + err = VixToolsMoveObject(requestMsg); break; ////////////////////////////////////