int GuestDirectory::init(GuestSession *aSession, const Utf8Str &strPath, const Utf8Str &strFilter /*= ""*/, uint32_t uFlags /*= 0*/) { LogFlowThisFunc(("strPath=%s, strFilter=%s, uFlags=%x\n", strPath.c_str(), strFilter.c_str(), uFlags)); /* Enclose the state transition NotReady->InInit->Ready. */ AutoInitSpan autoInitSpan(this); AssertReturn(autoInitSpan.isOk(), E_FAIL); mData.mSession = aSession; mData.mName = strPath; mData.mFilter = strFilter; mData.mFlags = uFlags; /* Start the directory process on the guest. */ GuestProcessStartupInfo procInfo; procInfo.mName = Utf8StrFmt(tr("Reading directory \"%s\"", strPath.c_str())); procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_LS); procInfo.mTimeoutMS = 0; /* No timeout. */ procInfo.mFlags = ProcessCreateFlag_Hidden | ProcessCreateFlag_WaitForStdOut; procInfo.mArguments.push_back(Utf8Str("--machinereadable")); /* We want the long output format which contains all the object details. */ procInfo.mArguments.push_back(Utf8Str("-l")); #if 0 /* Flags are not supported yet. */ if (uFlags & DirectoryOpenFlag_NoSymlinks) procInfo.mArguments.push_back(Utf8Str("--nosymlinks")); /** @todo What does GNU here? */ #endif /** @todo Recursion support? */ procInfo.mArguments.push_back(strPath); /* The directory we want to open. */ /* * Start the process asynchronously and keep it around so that we can use * it later in subsequent read() calls. */ ComObjPtr<GuestProcess> pProcess; int rc = mData.mSession->processCreateExInteral(procInfo, pProcess); if (RT_SUCCESS(rc)) rc = pProcess->startProcessAsync(); LogFlowThisFunc(("rc=%Rrc\n", rc)); if (RT_SUCCESS(rc)) { mData.mProcess = pProcess; /* Confirm a successful initialization when it's the case. */ autoInitSpan.setSucceeded(); return rc; } autoInitSpan.setFailed(); return rc; }