GuestDirectoryImpl.cpp revision 9d60b6be8b3cd7d8bb393ae591e846f44c3df3b2
9ad572a3ac0fd3845a9abecfbf41e8db9b3a5cf0vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync/* $Id$ */
adf2bcd2e5d07d5a11553b88e147c1f4b2249bffvboxsync/** @file
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * VirtualBox Main - Guest directory handling.
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync */
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
c58f1213e628a545081c70e26c6b67a841cff880vboxsync/*
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * Copyright (C) 2012-2013 Oracle Corporation
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync *
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * available from http://www.virtualbox.org. This file is free software;
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * you can redistribute it and/or modify it under the terms of the GNU
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * General Public License (GPL) as published by the Free Software
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync */
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync/*******************************************************************************
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync* Header Files *
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync*******************************************************************************/
70bb61ea2f96e80150e807529ce5df435607706bvboxsync#include "GuestDirectoryImpl.h"
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync#include "GuestSessionImpl.h"
23179f1443b03947d85eccc81cbc6b5153a4abf3vboxsync#include "GuestCtrlImplPrivate.h"
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync#include "Global.h"
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync#include "AutoCaller.h"
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
edefdc20eedaf9ef5b1293e56ba9b8cca7b5c740vboxsync#include <VBox/com/array.h>
edefdc20eedaf9ef5b1293e56ba9b8cca7b5c740vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync#ifdef LOG_GROUP
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync #undef LOG_GROUP
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync#endif
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync#define LOG_GROUP LOG_GROUP_GUEST_CONTROL
147e101bcd061b5e085e4a2c0cc9fc35546ff1aavboxsync#include <VBox/log.h>
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync// constructor / destructor
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync/////////////////////////////////////////////////////////////////////////////
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsyncDEFINE_EMPTY_CTOR_DTOR(GuestDirectory)
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsyncHRESULT GuestDirectory::FinalConstruct(void)
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync{
71c8a528203c289a8585ce10ac6bafc4274058c6vboxsync LogFlowThisFunc(("\n"));
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync return BaseFinalConstruct();
147e101bcd061b5e085e4a2c0cc9fc35546ff1aavboxsync}
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsyncvoid GuestDirectory::FinalRelease(void)
e59069cf1c98c1c2e90a18ec76fbc2e9907fb917vboxsync{
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync LogFlowThisFuncEnter();
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync uninit();
b304856b23107864c9c594a80cebca6006623f31vboxsync BaseFinalRelease();
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync LogFlowThisFuncLeave();
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync}
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync// public initializer/uninitializer for internal purposes only
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync/////////////////////////////////////////////////////////////////////////////
8fdb854581fe3cb394d84835dc09b02e6e18d4edvboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsyncint GuestDirectory::init(Console *pConsole, GuestSession *pSession,
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync ULONG uDirID, const GuestDirectoryOpenInfo &openInfo)
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync{
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync LogFlowThisFunc(("pConsole=%p, pSession=%p, uDirID=%RU32, strPath=%s, strFilter=%s, uFlags=%x\n",
c33fc49611f2444dade533488bf431e29eb88bcdvboxsync pConsole, pSession, uDirID, openInfo.mPath.c_str(), openInfo.mFilter.c_str(),
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync openInfo.mFlags));
1bf151411167b02ebdc6d6a18de8b97030341e1fvboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync AssertPtrReturn(pConsole, VERR_INVALID_POINTER);
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync AssertPtrReturn(pSession, VERR_INVALID_POINTER);
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync /* Enclose the state transition NotReady->InInit->Ready. */
db0ecde8f28fdb4525bc6d94056166c70b02ebb8vboxsync AutoInitSpan autoInitSpan(this);
db0ecde8f28fdb4525bc6d94056166c70b02ebb8vboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
db0ecde8f28fdb4525bc6d94056166c70b02ebb8vboxsync
8b36957d815c23b479eb35d93ac76c66392e9402vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync autoInitSpan.setSucceeded();
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync return VINF_SUCCESS;
9353e321b583ed6f2b42414257a5212885575b5cvboxsync#else
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync int vrc = bindToSession(pConsole, pSession, uDirID /* Object ID */);
9353e321b583ed6f2b42414257a5212885575b5cvboxsync if (RT_SUCCESS(vrc))
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync {
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync mSession = pSession;
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync mData.mID = uDirID;
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync mData.mOpenInfo = openInfo;
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync }
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync if (RT_SUCCESS(vrc))
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync {
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync /* Start the directory process on the guest. */
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync GuestProcessStartupInfo procInfo;
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync procInfo.mName = Utf8StrFmt(tr("Reading directory \"%s\""), openInfo.mPath.c_str());
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_LS);
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync procInfo.mTimeoutMS = 5 * 60 * 1000; /* 5 minutes timeout. */
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync procInfo.mArguments.push_back(Utf8Str("--machinereadable"));
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync /* We want the long output format which contains all the object details. */
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync procInfo.mArguments.push_back(Utf8Str("-l"));
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync#if 0 /* Flags are not supported yet. */
2a5e5a032e6f23f8937718e4ee4d6979188bdd19vboxsync if (uFlags & DirectoryOpenFlag_NoSymlinks)
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync procInfo.mArguments.push_back(Utf8Str("--nosymlinks")); /** @todo What does GNU here? */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync#endif
aa0553becec2abc2e781f839ba1d399c31c2c07fvboxsync /** @todo Recursion support? */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync procInfo.mArguments.push_back(openInfo.mPath); /* The directory we want to open. */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
f62342e2cc901a67e27fa69c0e712ee35e9c4c68vboxsync /*
b604fbf16eda38d14b4999c245f032bfaa5aa85avboxsync * Start the process asynchronously and keep it around so that we can use
13d1fd6f43e9a245a4f2b4fc6845bdaa5d0f4134vboxsync * it later in subsequent read() calls.
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync * Note: No guest rc available because operation is asynchronous.
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync vrc = mData.mProcessTool.Init(mSession, procInfo,
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync true /* Async */, NULL /* Guest rc */);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync }
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
aa0553becec2abc2e781f839ba1d399c31c2c07fvboxsync if (RT_SUCCESS(vrc))
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync /* Confirm a successful initialization when it's the case. */
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync autoInitSpan.setSucceeded();
62a515eec8de1b7804ec6997c0f2013fef5c5a6bvboxsync return vrc;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync else
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync autoInitSpan.setFailed();
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync return vrc;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync}
19cb1f8699e352d590c4946caee33863a5157241vboxsync
19cb1f8699e352d590c4946caee33863a5157241vboxsync/**
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync * Uninitializes the instance.
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync * Called from FinalRelease().
67ee25dd0b63a61dc35a35d0aade75ca6cd06350vboxsync */
67ee25dd0b63a61dc35a35d0aade75ca6cd06350vboxsyncvoid GuestDirectory::uninit(void)
67ee25dd0b63a61dc35a35d0aade75ca6cd06350vboxsync{
67ee25dd0b63a61dc35a35d0aade75ca6cd06350vboxsync LogFlowThisFuncEnter();
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync /* Enclose the state transition Ready->InUninit->NotReady. */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync AutoUninitSpan autoUninitSpan(this);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync if (autoUninitSpan.uninitDone())
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync return;
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsync LogFlowThisFuncLeave();
3933885bc0c2c93436d858a14564c6179ec72872vboxsync}
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsync// implementation of private wrapped getters/setters for attributes
3933885bc0c2c93436d858a14564c6179ec72872vboxsync/////////////////////////////////////////////////////////////////////////////
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsyncHRESULT GuestDirectory::getDirectoryName(com::Utf8Str &aDirectoryName)
cc74f15083bf80fbc96723a89faa06c15d0dead8vboxsync{
a72b5355eb89aafe6bfcc8912cf02645d7cccceavboxsync LogFlowThisFuncEnter();
a72b5355eb89aafe6bfcc8912cf02645d7cccceavboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
6e25221ce8ef8e656d1e15eb7ec5cf8ae758ceb2vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsync aDirectoryName = mData.mOpenInfo.mPath;
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsync return S_OK;
3933885bc0c2c93436d858a14564c6179ec72872vboxsync}
9ca017ceee656f9d33f2cb6652e401b5f17fcfb7vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsyncHRESULT GuestDirectory::getFilter(com::Utf8Str &aFilter)
e2760cdc84c692bc46cfaf5018d313db2f122acavboxsync{
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync LogFlowThisFuncEnter();
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync aFilter = mData.mOpenInfo.mFilter;
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
ad9e5a61fea617d40d07390ff1737277d6aef869vboxsync return S_OK;
23d9dbdaf1b83107abf9882246a4a46933f733efvboxsync}
a9315925c69e4c3bb342bb317ca5b6d29e1ee467vboxsync
a9315925c69e4c3bb342bb317ca5b6d29e1ee467vboxsync// private methods
a9315925c69e4c3bb342bb317ca5b6d29e1ee467vboxsync/////////////////////////////////////////////////////////////////////////////
dbabc9de5bf52ce5eb77cf82b038e9a6166c5a04vboxsync
4090390866c02d5d0ad061151cdb298b9a173e86vboxsyncint GuestDirectory::i_callbackDispatcher(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb)
4090390866c02d5d0ad061151cdb298b9a173e86vboxsync{
40dce69ff1c2949a489337922f30f1021d62d864vboxsync AssertPtrReturn(pCbCtx, VERR_INVALID_POINTER);
40dce69ff1c2949a489337922f30f1021d62d864vboxsync AssertPtrReturn(pSvcCb, VERR_INVALID_POINTER);
40dce69ff1c2949a489337922f30f1021d62d864vboxsync
40dce69ff1c2949a489337922f30f1021d62d864vboxsync LogFlowThisFunc(("strPath=%s, uContextID=%RU32, uFunction=%RU32, pSvcCb=%p\n",
40dce69ff1c2949a489337922f30f1021d62d864vboxsync mData.mOpenInfo.mPath.c_str(), pCbCtx->uContextID, pCbCtx->uFunction, pSvcCb));
657b2c9f6d33f08001e5fa6f6e0572dcf0391013vboxsync
7a29aa5ce149ccd344a2929d2815b8e212690b92vboxsync int vrc;
45a01ef53b009e9f56ce427bd8688da02ad32389vboxsync switch (pCbCtx->uFunction)
45a01ef53b009e9f56ce427bd8688da02ad32389vboxsync {
45a01ef53b009e9f56ce427bd8688da02ad32389vboxsync case GUEST_DIR_NOTIFY:
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync {
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync int idx = 1; /* Current parameter index. */
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync CALLBACKDATA_DIR_NOTIFY dataCb;
7708252d252a55417a6a817041e4356797e34255vboxsync /* pSvcCb->mpaParms[0] always contains the context ID. */
5a41049c24bcf93e3dc63c76bee23db645867e0cvboxsync pSvcCb->mpaParms[idx++].getUInt32(&dataCb.uType);
62ab017295981c81484e5a5f93ff8b5f85f7defbvboxsync pSvcCb->mpaParms[idx++].getUInt32(&dataCb.rc);
62ab017295981c81484e5a5f93ff8b5f85f7defbvboxsync
7708252d252a55417a6a817041e4356797e34255vboxsync int guestRc = (int)dataCb.rc; /* uint32_t vs. int. */
7708252d252a55417a6a817041e4356797e34255vboxsync
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync LogFlowFunc(("uType=%RU32, guestRc=%Rrc\n",
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync dataCb.uType, guestRc));
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync
48890ac9b4b339e0341e826b5c26ce6408729987vboxsync switch (dataCb.uType)
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync {
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync /* Nothing here yet, nothing to dispatch further. */
f2dbf051efd73ff79892d4cec2b466139f962a40vboxsync
5d57bcb78f1f3f918bd3daf709b551b8c2d30485vboxsync default:
cccc6ee5f7156cfcdf13acca545cf65124d9ed44vboxsync vrc = VERR_NOT_SUPPORTED;
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync break;
904810c4c6668233349b025cc58013cb7c11c701vboxsync }
904810c4c6668233349b025cc58013cb7c11c701vboxsync break;
147e101bcd061b5e085e4a2c0cc9fc35546ff1aavboxsync }
147e101bcd061b5e085e4a2c0cc9fc35546ff1aavboxsync
147e101bcd061b5e085e4a2c0cc9fc35546ff1aavboxsync default:
147e101bcd061b5e085e4a2c0cc9fc35546ff1aavboxsync /* Silently ignore not implemented functions. */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync vrc = VERR_NOT_SUPPORTED;
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync break;
e59069cf1c98c1c2e90a18ec76fbc2e9907fb917vboxsync }
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync#ifdef DEBUG
b304856b23107864c9c594a80cebca6006623f31vboxsync LogFlowFuncLeaveRC(vrc);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync#endif
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync return vrc;
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync}
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync/* static */
8fdb854581fe3cb394d84835dc09b02e6e18d4edvboxsyncUtf8Str GuestDirectory::i_guestErrorToString(int guestRc)
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync{
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync Utf8Str strError;
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync /** @todo pData->u32Flags: int vs. uint32 -- IPRT errors are *negative* !!! */
c33fc49611f2444dade533488bf431e29eb88bcdvboxsync switch (guestRc)
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync {
1bf151411167b02ebdc6d6a18de8b97030341e1fvboxsync case VERR_DIR_NOT_EMPTY:
db0ecde8f28fdb4525bc6d94056166c70b02ebb8vboxsync strError += Utf8StrFmt("Directoy is not empty");
db0ecde8f28fdb4525bc6d94056166c70b02ebb8vboxsync break;
db0ecde8f28fdb4525bc6d94056166c70b02ebb8vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync default:
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync strError += Utf8StrFmt("%Rrc", guestRc);
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync break;
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync }
657b2c9f6d33f08001e5fa6f6e0572dcf0391013vboxsync
e2760cdc84c692bc46cfaf5018d313db2f122acavboxsync return strError;
8b36957d815c23b479eb35d93ac76c66392e9402vboxsync}
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync/**
9353e321b583ed6f2b42414257a5212885575b5cvboxsync * Called by IGuestSession right before this directory gets
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync * removed from the public directory list.
9353e321b583ed6f2b42414257a5212885575b5cvboxsync */
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsyncint GuestDirectory::i_onRemove(void)
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync{
fc5f879e9508f333e20b37c63db9189a33059308vboxsync LogFlowThisFuncEnter();
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync int vrc = VINF_SUCCESS;
1c6ec9a3a329da6f61978a372e509cd233f0d9f9vboxsync
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync LogFlowFuncLeaveRC(vrc);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync return vrc;
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync}
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync/* static */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsyncHRESULT GuestDirectory::i_setErrorExternal(VirtualBoxBase *pInterface, int guestRc)
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync{
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync AssertPtr(pInterface);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync AssertMsg(RT_FAILURE(guestRc), ("Guest rc does not indicate a failure when setting error\n"));
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync return pInterface->setError(VBOX_E_IPRT_ERROR, GuestDirectory::i_guestErrorToString(guestRc).c_str());
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync}
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync// implementation of public methods
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync/////////////////////////////////////////////////////////////////////////////
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsyncHRESULT GuestDirectory::close()
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync{
aa0553becec2abc2e781f839ba1d399c31c2c07fvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync ReturnComNotImplemented();
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync#else
f62342e2cc901a67e27fa69c0e712ee35e9c4c68vboxsync LogFlowThisFuncEnter();
b604fbf16eda38d14b4999c245f032bfaa5aa85avboxsync
13d1fd6f43e9a245a4f2b4fc6845bdaa5d0f4134vboxsync AutoCaller autoCaller(this);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync HRESULT hr = S_OK;
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync int guestRc;
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync int rc = mData.mProcessTool.i_terminate(30 * 1000, &guestRc);
aa0553becec2abc2e781f839ba1d399c31c2c07fvboxsync if (RT_FAILURE(rc))
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
95cb8e789c1eed6f2bb3195d0b996feee11d548evboxsync switch (rc)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
62a515eec8de1b7804ec6997c0f2013fef5c5a6bvboxsync case VERR_GSTCTL_GUEST_ERROR:
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync hr = GuestProcess::i_setErrorExternal(this, guestRc);
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync break;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync case VERR_NOT_SUPPORTED:
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync /* Silently skip old Guest Additions which do not support killing the
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync * the guest directory handling process. */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync break;
19cb1f8699e352d590c4946caee33863a5157241vboxsync
19cb1f8699e352d590c4946caee33863a5157241vboxsync default:
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync hr = setError(VBOX_E_IPRT_ERROR,
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync tr("Terminating open guest directory \"%s\" failed: %Rrc"),
67ee25dd0b63a61dc35a35d0aade75ca6cd06350vboxsync mData.mOpenInfo.mPath.c_str(), rc);
67ee25dd0b63a61dc35a35d0aade75ca6cd06350vboxsync break;
67ee25dd0b63a61dc35a35d0aade75ca6cd06350vboxsync }
67ee25dd0b63a61dc35a35d0aade75ca6cd06350vboxsync }
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync AssertPtr(mSession);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync int rc2 = mSession->i_directoryRemoveFromList(this);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync if (RT_SUCCESS(rc))
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync rc = rc2;
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsync LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
3933885bc0c2c93436d858a14564c6179ec72872vboxsync return hr;
3933885bc0c2c93436d858a14564c6179ec72872vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
3933885bc0c2c93436d858a14564c6179ec72872vboxsync}
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
060f7ec6ae5c99df18341ef2e1f3e91f4b0c89f1vboxsyncHRESULT GuestDirectory::read(ComPtr<IFsObjInfo> &aObjInfo)
3933885bc0c2c93436d858a14564c6179ec72872vboxsync{
cc74f15083bf80fbc96723a89faa06c15d0dead8vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
a72b5355eb89aafe6bfcc8912cf02645d7cccceavboxsync ReturnComNotImplemented();
a72b5355eb89aafe6bfcc8912cf02645d7cccceavboxsync#else
3933885bc0c2c93436d858a14564c6179ec72872vboxsync LogFlowThisFuncEnter();
6e25221ce8ef8e656d1e15eb7ec5cf8ae758ceb2vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsync AutoCaller autoCaller(this);
3933885bc0c2c93436d858a14564c6179ec72872vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
060f7ec6ae5c99df18341ef2e1f3e91f4b0c89f1vboxsync GuestProcessStreamBlock curBlock;
9ca017ceee656f9d33f2cb6652e401b5f17fcfb7vboxsync int guestRc;
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync int rc = mData.mProcessTool.i_waitEx(GUESTPROCESSTOOL_FLAG_STDOUT_BLOCK,
261b44f7fa60a1d4bb4102142d3aa44188908484vboxsync &curBlock, &guestRc);
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync
f106b549ead77cab51ff1e2c116060aaabb90d5evboxsync /*
f106b549ead77cab51ff1e2c116060aaabb90d5evboxsync * Note: The guest process can still be around to serve the next
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync * upcoming stream block next time.
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync */
9e4ea89b1085fdaa5861e45a729d9c978db1a8f1vboxsync if ( RT_SUCCESS(rc)
23d9dbdaf1b83107abf9882246a4a46933f733efvboxsync && !mData.mProcessTool.i_isRunning())
a9315925c69e4c3bb342bb317ca5b6d29e1ee467vboxsync {
a9315925c69e4c3bb342bb317ca5b6d29e1ee467vboxsync rc = mData.mProcessTool.i_terminatedOk(NULL /* Exit code */);
a9315925c69e4c3bb342bb317ca5b6d29e1ee467vboxsync if (rc == VERR_NOT_EQUAL)
ad9e5a61fea617d40d07390ff1737277d6aef869vboxsync rc = VERR_ACCESS_DENIED;
dbabc9de5bf52ce5eb77cf82b038e9a6166c5a04vboxsync }
4090390866c02d5d0ad061151cdb298b9a173e86vboxsync
4090390866c02d5d0ad061151cdb298b9a173e86vboxsync if (RT_SUCCESS(rc))
40dce69ff1c2949a489337922f30f1021d62d864vboxsync {
40dce69ff1c2949a489337922f30f1021d62d864vboxsync if (curBlock.GetCount()) /* Did we get content? */
40dce69ff1c2949a489337922f30f1021d62d864vboxsync {
40dce69ff1c2949a489337922f30f1021d62d864vboxsync GuestFsObjData objData;
40dce69ff1c2949a489337922f30f1021d62d864vboxsync rc = objData.FromLs(curBlock);
7a29aa5ce149ccd344a2929d2815b8e212690b92vboxsync if (RT_FAILURE(rc))
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync rc = VERR_PATH_NOT_FOUND;
f57758f0bcf995d350d64a7c059ac93573144c05vboxsync
48890ac9b4b339e0341e826b5c26ce6408729987vboxsync if (RT_SUCCESS(rc))
f57758f0bcf995d350d64a7c059ac93573144c05vboxsync {
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync /* Create the object. */
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync ComObjPtr<GuestFsObjInfo> pFsObjInfo;
5d57bcb78f1f3f918bd3daf709b551b8c2d30485vboxsync HRESULT hr2 = pFsObjInfo.createObject();
cccc6ee5f7156cfcdf13acca545cf65124d9ed44vboxsync if (FAILED(hr2))
3f00104a87d8a725dfa0348b69cbdac901062a4avboxsync rc = VERR_COM_UNEXPECTED;
45a01ef53b009e9f56ce427bd8688da02ad32389vboxsync
45a01ef53b009e9f56ce427bd8688da02ad32389vboxsync if (RT_SUCCESS(rc))
45a01ef53b009e9f56ce427bd8688da02ad32389vboxsync rc = pFsObjInfo->init(objData);
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync
505ddd00252720bfb5569fcb17bfda53dc141e3bvboxsync if (RT_SUCCESS(rc))
505ddd00252720bfb5569fcb17bfda53dc141e3bvboxsync {
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync /* Return info object to the caller. */
5a41049c24bcf93e3dc63c76bee23db645867e0cvboxsync hr2 = pFsObjInfo.queryInterfaceTo(aObjInfo.asOutParam());
62ab017295981c81484e5a5f93ff8b5f85f7defbvboxsync if (FAILED(hr2))
62ab017295981c81484e5a5f93ff8b5f85f7defbvboxsync rc = VERR_COM_UNEXPECTED;
7708252d252a55417a6a817041e4356797e34255vboxsync }
7708252d252a55417a6a817041e4356797e34255vboxsync }
7708252d252a55417a6a817041e4356797e34255vboxsync }
904810c4c6668233349b025cc58013cb7c11c701vboxsync else
147e101bcd061b5e085e4a2c0cc9fc35546ff1aavboxsync {
147e101bcd061b5e085e4a2c0cc9fc35546ff1aavboxsync /* Nothing to read anymore. Tell the caller. */
3933885bc0c2c93436d858a14564c6179ec72872vboxsync rc = VERR_NO_MORE_FILES;
3933885bc0c2c93436d858a14564c6179ec72872vboxsync }
3933885bc0c2c93436d858a14564c6179ec72872vboxsync }
3933885bc0c2c93436d858a14564c6179ec72872vboxsync
3933885bc0c2c93436d858a14564c6179ec72872vboxsync HRESULT hr = S_OK;
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync if (RT_FAILURE(rc)) /** @todo Add more errors here. */
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync {
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync switch (rc)
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync {
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync case VERR_GSTCTL_GUEST_ERROR:
aa0553becec2abc2e781f839ba1d399c31c2c07fvboxsync hr = GuestProcess::i_setErrorExternal(this, guestRc);
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync break;
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync case VERR_ACCESS_DENIED:
aa0553becec2abc2e781f839ba1d399c31c2c07fvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Reading directory \"%s\" failed: Unable to read / access denied"),
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync mData.mOpenInfo.mPath.c_str());
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync break;
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync case VERR_PATH_NOT_FOUND:
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Reading directory \"%s\" failed: Path not found"),
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync mData.mOpenInfo.mPath.c_str());
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync break;
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync case VERR_NO_MORE_FILES:
a1b4fb3917412d2632d358ff8989f1ec971f2d5bvboxsync /* See SDK reference. */
3933885bc0c2c93436d858a14564c6179ec72872vboxsync hr = setError(VBOX_E_OBJECT_NOT_FOUND, tr("No more entries for directory \"%s\""),
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync mData.mOpenInfo.mPath.c_str());
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync break;
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync default:
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Error while reading directory \"%s\": %Rrc\n"),
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync mData.mOpenInfo.mPath.c_str(), rc);
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync break;
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync }
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync }
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync return hr;
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync}
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync
1147e980f6ab0b7ff1d08c13ad1c03eea30d102dvboxsync