]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Implement Vix code and Tools code for Move[File|Directory]InGuest guest operation.
authorVMware, Inc <>
Mon, 26 Jul 2010 17:56:23 +0000 (10:56 -0700)
committerMarcelo Vanzin <mvanzin@vmware.com>
Mon, 26 Jul 2010 17:56:23 +0000 (10:56 -0700)
Signed-off-by: Marcelo Vanzin <mvanzin@vmware.com>
open-vm-tools/lib/foundryMsg/foundryMsg.c
open-vm-tools/lib/include/vixCommands.h
open-vm-tools/lib/vixTools/vixTools.c

index 64368f2ae6967c2691d099f016b3a2e62c54b8eb..c3185ee1ff8ca7f8cd10b11ec43e94b4470e511f 100644 (file)
@@ -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),
 };
 
 
index 4a593c630111e19ba8a2f4508d2e8114e002b7aa..72fdb3a36e272d5ddaa1600136a4abe47893be5e 100644 (file)
@@ -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,
index 99499fa6d128e05f1683560bf1e459aa1289d4d1..f8b425a24805b79b23e7e60b0fdb021258a17531 100644 (file)
@@ -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;
 
       ////////////////////////////////////