VirtualBox

Changeset 77495 in vbox for trunk/src


Ignore:
Timestamp:
Feb 28, 2019 8:44:11 AM (6 years ago)
Author:
vboxsync
Message:

Guest Control/Main: Renamed GuestSessionTask::directoryCreate() -> GuestSessionTask::directoryCreateOnGuest() and added GuestSessionTask::directoryCreateOnHost().

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/GuestSessionImplTasks.h

    r77068 r77495  
    188188    /** @name Directory handling primitives.
    189189     * @{ */
    190     int directoryCreate(const com::Utf8Str &strPath, DirectoryCreateFlag_T enmDirecotryCreateFlags, uint32_t uMode,
    191                         bool fFollowSymlinks);
     190    int directoryCreateOnGuest(const com::Utf8Str &strPath,
     191                               DirectoryCreateFlag_T enmDirectoryCreateFlags, uint32_t uMode,
     192                               bool fFollowSymlinks, bool fCanExist);
     193    int directoryCreateOnHost(const com::Utf8Str &strPath, uint32_t fCreate, uint32_t uMode, bool fCanExist);
    192194    /** @}  */
    193195
  • trunk/src/VBox/Main/src-client/GuestSessionImplTasks.cpp

    r77038 r77495  
    223223 * @param  uMode                    Directory mode to use for creation.
    224224 * @param  fFollowSymlinks          Whether to follow symlinks on the guest or not.
     225 * @param  fCanExist                Whether the directory to create is allowed to exist already.
    225226 */
    226 int GuestSessionTask::directoryCreate(const com::Utf8Str &strPath,
    227                                       DirectoryCreateFlag_T enmDirectoryCreateFlags, uint32_t uMode, bool fFollowSymlinks)
    228 {
    229     LogFlowFunc(("strPath=%s, fFlags=0x%x, uMode=%RU32, fFollowSymlinks=%RTbool\n",
    230                  strPath.c_str(), enmDirectoryCreateFlags, uMode, fFollowSymlinks));
     227int GuestSessionTask::directoryCreateOnGuest(const com::Utf8Str &strPath,
     228                                             DirectoryCreateFlag_T enmDirectoryCreateFlags, uint32_t uMode,
     229                                             bool fFollowSymlinks, bool fCanExist)
     230{
     231    LogFlowFunc(("strPath=%s, enmDirectoryCreateFlags=0x%x, uMode=%RU32, fFollowSymlinks=%RTbool, fCanExist=%RTbool\n",
     232                 strPath.c_str(), enmDirectoryCreateFlags, uMode, fFollowSymlinks, fCanExist));
    231233
    232234    GuestFsObjData objData; int rcGuest;
     
    234236    if (RT_SUCCESS(rc))
    235237    {
    236         return VERR_ALREADY_EXISTS;
     238        if (!fCanExist)
     239        {
     240            setProgressErrorMsg(VBOX_E_IPRT_ERROR,
     241                                Utf8StrFmt(GuestSession::tr("Guest directory \"%s\" already exists"), strPath.c_str()));
     242            return VERR_ALREADY_EXISTS;
     243        }
    237244    }
    238245    else
     
    268275            setProgressErrorMsg(VBOX_E_IPRT_ERROR,
    269276                                Utf8StrFmt(GuestSession::tr("Error creating directory on the guest: %Rrc"), strPath.c_str(), rc));
     277    }
     278
     279    LogFlowFuncLeaveRC(rc);
     280    return rc;
     281}
     282
     283/**
     284 * Creates a directory on the host.
     285 *
     286 * @return VBox status code. VERR_ALREADY_EXISTS if directory on the guest already exists.
     287 * @param  strPath                  Absolute path to directory on the host (host style path) to create.
     288 * @param  fCreate                  Directory creation flags.
     289 * @param  uMode                    Directory mode to use for creation.
     290 * @param  fCanExist                Whether the directory to create is allowed to exist already.
     291 */
     292int GuestSessionTask::directoryCreateOnHost(const com::Utf8Str &strPath, uint32_t fCreate, uint32_t uMode, bool fCanExist)
     293{
     294    LogFlowFunc(("strPath=%s, fCreate=0x%x, uMode=%RU32, fCanExist=%RTbool\n", strPath.c_str(), fCreate, uMode, fCanExist));
     295
     296    int rc = RTDirCreate(strPath.c_str(), uMode, fCreate);
     297    if (RT_FAILURE(rc))
     298    {
     299        if (rc == VERR_ALREADY_EXISTS)
     300        {
     301            if (!fCanExist)
     302            {
     303                setProgressErrorMsg(VBOX_E_IPRT_ERROR,
     304                                    Utf8StrFmt(GuestSession::tr("Host directory \"%s\" already exists"), strPath.c_str()));
     305            }
     306            else
     307                rc = VINF_SUCCESS;
     308        }
     309        else
     310            setProgressErrorMsg(VBOX_E_IPRT_ERROR,
     311                                Utf8StrFmt(GuestSession::tr("Could not create host directory \"%s\": %Rrc"),
     312                                           strPath.c_str(), rc));
    270313    }
    271314
     
    15101553
    15111554        const bool     fCopyIntoExisting = pList->mSourceSpec.Type.Dir.fCopyFlags & DirectoryCopyFlag_CopyIntoExisting;
     1555        const bool     fFollowSymlinks   = true; /** @todo */
    15121556        const uint32_t fDirMode          = 0700; /** @todo Play safe by default; implement ACLs. */
     1557              uint32_t fDirCreate = 0;
     1558
     1559        if (!fFollowSymlinks)
     1560            fDirCreate |= RTDIRCREATE_FLAGS_NO_SYMLINKS;
    15131561
    15141562        LogFlowFunc(("List: srcRootAbs=%s, dstRootAbs=%s\n", pList->mSrcRootAbs.c_str(), pList->mDstRootAbs.c_str()));
     
    15171565        if (pList->mSourceSpec.enmType == FsObjType_Directory)
    15181566        {
    1519             rc = RTDirCreate(pList->mDstRootAbs.c_str(), fDirMode, 0 /* fCreate */);
    1520             if (   rc == VWRN_ALREADY_EXISTS
    1521                 && !fCopyIntoExisting)
    1522             {
    1523                 break;
    1524             }
     1567            rc = directoryCreateOnHost(pList->mDstRootAbs.c_str(), fDirMode, fDirCreate, fCopyIntoExisting);
     1568            if (RT_FAILURE(rc))
     1569                break;
    15251570        }
    15261571
     
    15501595                    if (!pList->mSourceSpec.fDryRun)
    15511596                    {
    1552                         rc = RTDirCreate(strDstAbs.c_str(), fDirMode, 0 /* fCreate */);
    1553                         if (rc == VERR_ALREADY_EXISTS)
    1554                         {
    1555                             if (!fCopyIntoExisting)
    1556                             {
    1557                                 setProgressErrorMsg(VBOX_E_IPRT_ERROR,
    1558                                                     Utf8StrFmt(GuestSession::tr("Destination directory \"%s\" already exists"),
    1559                                                                strDstAbs.c_str()));
    1560                                 break;
    1561                             }
    1562 
    1563                             rc = VINF_SUCCESS;
    1564                         }
    1565 
     1597                        rc = directoryCreateOnHost(pList->mDstRootAbs.c_str(), fDirMode, fDirCreate, fCopyIntoExisting);
    15661598                        if (RT_FAILURE(rc))
    15671599                            break;
     
    17751807            fFollowSymlinks   = pList->mSourceSpec.Type.Dir.fFollowSymlinks;
    17761808
    1777             rc = directoryCreate(pList->mDstRootAbs.c_str(), DirectoryCreateFlag_None, fDirMode,
    1778                                  pList->mSourceSpec.Type.Dir.fFollowSymlinks);
    1779             if (   rc == VWRN_ALREADY_EXISTS
    1780                 && !fCopyIntoExisting)
    1781             {
    1782                 break;
    1783             }
     1809            rc = directoryCreateOnGuest(pList->mDstRootAbs.c_str(), DirectoryCreateFlag_None, fDirMode,
     1810                                        pList->mSourceSpec.Type.Dir.fFollowSymlinks, fCopyIntoExisting);
     1811            if (RT_FAILURE(rc))
     1812                break;
    17841813        }
    17851814        else if (pList->mSourceSpec.enmType == FsObjType_File)
     
    18131842                    if (!pList->mSourceSpec.fDryRun)
    18141843                    {
    1815                         rc = directoryCreate(strDstAbs.c_str(), DirectoryCreateFlag_None, fDirMode, fFollowSymlinks);
     1844                        rc = directoryCreateOnGuest(strDstAbs.c_str(), DirectoryCreateFlag_None, fDirMode,
     1845                                                    fFollowSymlinks, fCopyIntoExisting);
    18161846                        if (RT_FAILURE(rc))
    1817                         {
    1818                             if (rc == VERR_ALREADY_EXISTS)
    1819                             {
    1820                                 if (!fCopyIntoExisting)
    1821                                 {
    1822                                     setProgressErrorMsg(VBOX_E_IPRT_ERROR,
    1823                                                         Utf8StrFmt(GuestSession::tr("Destination directory '%s' already exists"),
    1824                                                                    strDstAbs.c_str()));
    1825                                 }
    1826                                 else /* Copy into destination directory. */
    1827                                     rc = VINF_SUCCESS;
    1828                             }
    1829                         }
     1847                            break;
    18301848                    }
    18311849                    break;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette