2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/* $Id$ */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/** @file
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync * VirtualBox Main - Guest directory handling.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/*
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync * Copyright (C) 2012-2013 Oracle Corporation
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync *
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * available from http://www.virtualbox.org. This file is free software;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * General Public License (GPL) as published by the Free Software
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/*******************************************************************************
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync* Header Files *
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync*******************************************************************************/
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#include "GuestDirectoryImpl.h"
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync#include "GuestSessionImpl.h"
7b9f0c34e9ea328981c99e97054bdf8684d9d620vboxsync#include "GuestCtrlImplPrivate.h"
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#include "Global.h"
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#include "AutoCaller.h"
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#include <VBox/com/array.h>
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync#ifdef LOG_GROUP
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync #undef LOG_GROUP
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync#endif
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync#define LOG_GROUP LOG_GROUP_GUEST_CONTROL
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync#include <VBox/log.h>
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync// constructor / destructor
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/////////////////////////////////////////////////////////////////////////////
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsyncDEFINE_EMPTY_CTOR_DTOR(GuestDirectory)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
13f1ce3859ee77d9b9f4d2ca9f93e1633cb133bcvboxsyncHRESULT GuestDirectory::FinalConstruct(void)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync{
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync LogFlowThisFunc(("\n"));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync return BaseFinalConstruct();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync}
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsyncvoid GuestDirectory::FinalRelease(void)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync{
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync LogFlowThisFuncEnter();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync uninit();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync BaseFinalRelease();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync LogFlowThisFuncLeave();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync}
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync// public initializer/uninitializer for internal purposes only
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/////////////////////////////////////////////////////////////////////////////
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsyncint GuestDirectory::init(Console *pConsole, GuestSession *pSession,
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync ULONG uDirID, const GuestDirectoryOpenInfo &openInfo)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync{
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync LogFlowThisFunc(("pConsole=%p, pSession=%p, uDirID=%RU32, strPath=%s, strFilter=%s, uFlags=%x\n",
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync pConsole, pSession, uDirID, openInfo.mPath.c_str(), openInfo.mFilter.c_str(),
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync openInfo.mFlags));
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync AssertPtrReturn(pConsole, VERR_INVALID_POINTER);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync AssertPtrReturn(pSession, VERR_INVALID_POINTER);
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /* Enclose the state transition NotReady->InInit->Ready. */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync AutoInitSpan autoInitSpan(this);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync autoInitSpan.setSucceeded();
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync return VINF_SUCCESS;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync#else
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync int vrc = bindToSession(pConsole, pSession, uDirID /* Object ID */);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync if (RT_SUCCESS(vrc))
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync {
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mSession = pSession;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mData.mID = uDirID;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mData.mOpenInfo = openInfo;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync }
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync if (RT_SUCCESS(vrc))
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync {
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /* Start the directory process on the guest. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync GuestProcessStartupInfo procInfo;
9d60b6be8b3cd7d8bb393ae591e846f44c3df3b2vboxsync procInfo.mName = Utf8StrFmt(tr("Reading directory \"%s\""), openInfo.mPath.c_str());
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_LS);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync procInfo.mTimeoutMS = 5 * 60 * 1000; /* 5 minutes timeout. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync procInfo.mArguments.push_back(Utf8Str("--machinereadable"));
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /* We want the long output format which contains all the object details. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync procInfo.mArguments.push_back(Utf8Str("-l"));
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync#if 0 /* Flags are not supported yet. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync if (uFlags & DirectoryOpenFlag_NoSymlinks)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync procInfo.mArguments.push_back(Utf8Str("--nosymlinks")); /** @todo What does GNU here? */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync#endif
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /** @todo Recursion support? */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync procInfo.mArguments.push_back(openInfo.mPath); /* The directory we want to open. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /*
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync * Start the process asynchronously and keep it around so that we can use
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync * it later in subsequent read() calls.
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync * Note: No guest rc available because operation is asynchronous.
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync vrc = mData.mProcessTool.Init(mSession, procInfo,
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync true /* Async */, NULL /* Guest rc */);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync }
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync if (RT_SUCCESS(vrc))
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync {
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync /* Confirm a successful initialization when it's the case. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync autoInitSpan.setSucceeded();
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync return vrc;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync }
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync else
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync autoInitSpan.setFailed();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync return vrc;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync}
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/**
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Uninitializes the instance.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Called from FinalRelease().
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsyncvoid GuestDirectory::uninit(void)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync{
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync LogFlowThisFuncEnter();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /* Enclose the state transition Ready->InUninit->NotReady. */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync AutoUninitSpan autoUninitSpan(this);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync if (autoUninitSpan.uninitDone())
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync return;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync LogFlowThisFuncLeave();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync}
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync// implementation of private wrapped getters/setters for attributes
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/////////////////////////////////////////////////////////////////////////////
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsyncHRESULT GuestDirectory::getDirectoryName(com::Utf8Str &aDirectoryName)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync{
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync LogFlowThisFuncEnter();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync aDirectoryName = mData.mOpenInfo.mPath;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync return S_OK;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync}
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsyncHRESULT GuestDirectory::getFilter(com::Utf8Str &aFilter)
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync{
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync LogFlowThisFuncEnter();
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync aFilter = mData.mOpenInfo.mFilter;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync return S_OK;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync}
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync// private methods
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync/////////////////////////////////////////////////////////////////////////////
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
f044158ee9eb7045a43f2c4ef2fbc07cb11329aevboxsyncint GuestDirectory::i_callbackDispatcher(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync{
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync AssertPtrReturn(pCbCtx, VERR_INVALID_POINTER);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync AssertPtrReturn(pSvcCb, VERR_INVALID_POINTER);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync LogFlowThisFunc(("strPath=%s, uContextID=%RU32, uFunction=%RU32, pSvcCb=%p\n",
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mData.mOpenInfo.mPath.c_str(), pCbCtx->uContextID, pCbCtx->uFunction, pSvcCb));
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync int vrc;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync switch (pCbCtx->uFunction)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync {
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync case GUEST_DIR_NOTIFY:
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync {
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync int idx = 1; /* Current parameter index. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync CALLBACKDATA_DIR_NOTIFY dataCb;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /* pSvcCb->mpaParms[0] always contains the context ID. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync pSvcCb->mpaParms[idx++].getUInt32(&dataCb.uType);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync pSvcCb->mpaParms[idx++].getUInt32(&dataCb.rc);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync int guestRc = (int)dataCb.rc; /* uint32_t vs. int. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync LogFlowFunc(("uType=%RU32, guestRc=%Rrc\n",
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync dataCb.uType, guestRc));
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync switch (dataCb.uType)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync {
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /* Nothing here yet, nothing to dispatch further. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync default:
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync vrc = VERR_NOT_SUPPORTED;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync break;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync }
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync break;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync }
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync default:
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /* Silently ignore not implemented functions. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync vrc = VERR_NOT_SUPPORTED;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync break;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync }
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync#ifdef DEBUG
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync LogFlowFuncLeaveRC(vrc);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync#endif
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync return vrc;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync}
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/* static */
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsyncUtf8Str GuestDirectory::i_guestErrorToString(int guestRc)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync{
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync Utf8Str strError;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /** @todo pData->u32Flags: int vs. uint32 -- IPRT errors are *negative* !!! */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync switch (guestRc)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync {
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync case VERR_DIR_NOT_EMPTY:
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync strError += Utf8StrFmt("Directoy is not empty");
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync break;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync default:
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync strError += Utf8StrFmt("%Rrc", guestRc);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync break;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync }
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync return strError;
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync}
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync/**
0d49a2fbc9857ad8dd29542de7fb37202f1a283fvboxsync * Called by IGuestSession right before this directory gets
0d49a2fbc9857ad8dd29542de7fb37202f1a283fvboxsync * removed from the public directory list.
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync */
f044158ee9eb7045a43f2c4ef2fbc07cb11329aevboxsyncint GuestDirectory::i_onRemove(void)
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync{
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync LogFlowThisFuncEnter();
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync int vrc = VINF_SUCCESS;
0d49a2fbc9857ad8dd29542de7fb37202f1a283fvboxsync
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync LogFlowFuncLeaveRC(vrc);
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync return vrc;
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync}
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/* static */
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsyncHRESULT GuestDirectory::i_setErrorExternal(VirtualBoxBase *pInterface, int guestRc)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync{
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync AssertPtr(pInterface);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync AssertMsg(RT_FAILURE(guestRc), ("Guest rc does not indicate a failure when setting error\n"));
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync return pInterface->setError(VBOX_E_IPRT_ERROR, GuestDirectory::i_guestErrorToString(guestRc).c_str());
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync}
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync// implementation of public methods
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/////////////////////////////////////////////////////////////////////////////
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsyncHRESULT GuestDirectory::close()
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync{
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync ReturnComNotImplemented();
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync#else
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync LogFlowThisFuncEnter();
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync AutoCaller autoCaller(this);
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync HRESULT hr = S_OK;
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync int guestRc;
dea3e7faa80f4aab41e08945b9308fd2e3ffe7fcvboxsync int rc = mData.mProcessTool.i_terminate(30 * 1000, &guestRc);
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync if (RT_FAILURE(rc))
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync {
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync switch (rc)
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync {
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync case VERR_GSTCTL_GUEST_ERROR:
dea3e7faa80f4aab41e08945b9308fd2e3ffe7fcvboxsync hr = GuestProcess::i_setErrorExternal(this, guestRc);
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync break;
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync case VERR_NOT_SUPPORTED:
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync /* Silently skip old Guest Additions which do not support killing the
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync * the guest directory handling process. */
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync break;
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync default:
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync tr("Terminating open guest directory \"%s\" failed: %Rrc"),
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mData.mOpenInfo.mPath.c_str(), rc);
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync break;
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync }
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync }
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync
ded83c04697bf14ebe491890cd19cec3c8d94aa1vboxsync AssertPtr(mSession);
d86beb7ea7f5fb6bf4a4e80c7b3fe0aeec98fa93vboxsync int rc2 = mSession->i_directoryRemoveFromList(this);
ded83c04697bf14ebe491890cd19cec3c8d94aa1vboxsync if (RT_SUCCESS(rc))
ded83c04697bf14ebe491890cd19cec3c8d94aa1vboxsync rc = rc2;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
510567648d46488f4166e5f69ffffe3eeeeec4d9vboxsync LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync return hr;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync}
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsyncHRESULT GuestDirectory::read(ComPtr<IFsObjInfo> &aObjInfo)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync{
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync ReturnComNotImplemented();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#else
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync LogFlowThisFuncEnter();
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync AutoCaller autoCaller(this);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync GuestProcessStreamBlock curBlock;
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int guestRc;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
dea3e7faa80f4aab41e08945b9308fd2e3ffe7fcvboxsync int rc = mData.mProcessTool.i_waitEx(GUESTPROCESSTOOL_FLAG_STDOUT_BLOCK,
dea3e7faa80f4aab41e08945b9308fd2e3ffe7fcvboxsync &curBlock, &guestRc);
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync /*
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync * Note: The guest process can still be around to serve the next
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync * upcoming stream block next time.
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync */
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync if ( RT_SUCCESS(rc)
dea3e7faa80f4aab41e08945b9308fd2e3ffe7fcvboxsync && !mData.mProcessTool.i_isRunning())
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync {
dea3e7faa80f4aab41e08945b9308fd2e3ffe7fcvboxsync rc = mData.mProcessTool.i_terminatedOk(NULL /* Exit code */);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync if (rc == VERR_NOT_EQUAL)
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync rc = VERR_ACCESS_DENIED;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync }
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync if (RT_SUCCESS(rc))
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync {
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync if (curBlock.GetCount()) /* Did we get content? */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync {
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync GuestFsObjData objData;
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync rc = objData.FromLs(curBlock);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync if (RT_FAILURE(rc))
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync rc = VERR_PATH_NOT_FOUND;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync if (RT_SUCCESS(rc))
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync {
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /* Create the object. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync ComObjPtr<GuestFsObjInfo> pFsObjInfo;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync HRESULT hr2 = pFsObjInfo.createObject();
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync if (FAILED(hr2))
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync rc = VERR_COM_UNEXPECTED;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync if (RT_SUCCESS(rc))
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync rc = pFsObjInfo->init(objData);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync if (RT_SUCCESS(rc))
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync {
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /* Return info object to the caller. */
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync hr2 = pFsObjInfo.queryInterfaceTo(aObjInfo.asOutParam());
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync if (FAILED(hr2))
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync rc = VERR_COM_UNEXPECTED;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync }
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync }
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync }
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync else
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync {
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /* Nothing to read anymore. Tell the caller. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync rc = VERR_NO_MORE_FILES;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync }
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync }
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync HRESULT hr = S_OK;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync if (RT_FAILURE(rc)) /** @todo Add more errors here. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync {
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync switch (rc)
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync {
b8bb9c9f6b8ebfd0a7d6df0c0289f9fe80241750vboxsync case VERR_GSTCTL_GUEST_ERROR:
dea3e7faa80f4aab41e08945b9308fd2e3ffe7fcvboxsync hr = GuestProcess::i_setErrorExternal(this, guestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync break;
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync case VERR_ACCESS_DENIED:
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Reading directory \"%s\" failed: Unable to read / access denied"),
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mData.mOpenInfo.mPath.c_str());
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync break;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync case VERR_PATH_NOT_FOUND:
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Reading directory \"%s\" failed: Path not found"),
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mData.mOpenInfo.mPath.c_str());
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync break;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync case VERR_NO_MORE_FILES:
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync /* See SDK reference. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync hr = setError(VBOX_E_OBJECT_NOT_FOUND, tr("No more entries for directory \"%s\""),
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mData.mOpenInfo.mPath.c_str());
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync break;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync default:
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Error while reading directory \"%s\": %Rrc\n"),
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync mData.mOpenInfo.mPath.c_str(), rc);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync break;
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync }
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync }
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync
510567648d46488f4166e5f69ffffe3eeeeec4d9vboxsync LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync return hr;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync}
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync