VirtualBox

Changeset 75844 in vbox


Ignore:
Timestamp:
Nov 30, 2018 12:03:33 PM (6 years ago)
Author:
vboxsync
Message:

VBoxManage/guestcontrol: r=bird: more comments and some fixes/adjustments

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp

    r75832 r75844  
    189189 * An entry for a source element, including an optional DOS-like wildcard (*,?).
    190190 */
    191 class SOURCEFILEENTRY
    192 {
    193     public:
    194 
    195         SOURCEFILEENTRY(const char *pszSource, const char *pszFilter)
    196                         : mSource(pszSource),
    197                           mFilter(pszFilter) {}
    198 
    199         SOURCEFILEENTRY(const char *pszSource)
    200                         : mSource(pszSource)
    201         {
    202             Parse(pszSource);
    203         }
    204 
    205         Utf8Str GetSource() const
    206         {
    207             return mSource;
    208         }
    209 
    210         Utf8Str GetFilter() const
    211         {
    212             return mFilter;
    213         }
    214 
    215     private:
    216 
    217         int Parse(const char *pszPath)
    218         {
    219             AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
    220 
    221 /** @todo r=bird: Do ONE RTPathQueryInfo call here, and only do it when the source is on the HOST.
    222  * You're currently doing this for guest files too...
    223  *
    224  * You realize that a filter is a filter when you define it to be, not when the
    225  * file doesn't exist.  It something the command defines, nothing else. So, it
    226  * makes not sense. */
    227             if (   !RTFileExists(pszPath)
    228                 && !RTDirExists(pszPath))
    229             {
    230                 /* No file and no directory -- maybe a filter? */
    231                 char *pszFilename = RTPathFilename(pszPath);
    232                 if (   pszFilename
    233                     && strpbrk(pszFilename, "*?"))
    234                 {
    235                     /* Yep, get the actual filter part. */
    236                     mFilter = RTPathFilename(pszPath);
    237                     /* Remove the filter from actual sourcec directory name. */
    238                     RTPathStripFilename(mSource.mutableRaw());
    239                     mSource.jolt();
    240                 }
    241             }
    242 
    243             return VINF_SUCCESS; /** @todo */
    244         }
    245 
    246     private:
    247 
    248         Utf8Str mSource;
    249         Utf8Str mFilter;
     191class SourceFileEntry
     192{
     193public:
     194    SourceFileEntry(const char *pszSource, const char *pszFilter)
     195        : mSource(pszSource)
     196        , mFilter(pszFilter)
     197    {}
     198
     199    SourceFileEntry(const char *pszSource)
     200    {
     201/** @todo Using host parsing rules for guest filenames might be undesirable... */
     202
     203        /* Look for filter and split off the filter part if present. */
     204        const char *pszFilename = RTPathFilename(pszSource);
     205        if (   !pszFilename
     206            || !strpbrk(pszFilename, "*?"))
     207            mSource.assign(pszSource);
     208        else
     209        {
     210            mFilter = pszFilename;
     211            size_t cch = pszFilename - pszSource;
     212            if (cch > 0 && pszFilename[-1] != ':')
     213                cch--;
     214            mSource.assign(pszSource, cch);
     215        }
     216    }
     217
     218    const Utf8Str &GetSource() const
     219    {
     220        return mSource;
     221    }
     222
     223    const Utf8Str &GetFilter() const
     224    {
     225        return mFilter;
     226    }
     227
     228protected:
     229    Utf8Str mSource;
     230    Utf8Str mFilter;
    250231};
    251 typedef std::vector<SOURCEFILEENTRY> SOURCEVEC, *PSOURCEVEC;
     232typedef std::vector<SourceFileEntry> SourceVec;
    252233
    253234/**
     
    17601741    uint32_t uUsage = fHostToGuest ? USAGE_GSTCTRL_COPYTO : USAGE_GSTCTRL_COPYFROM;
    17611742
    1762     SOURCEVEC vecSources;
     1743    SourceVec vecSources;
    17631744
    17641745    int vrc = VINF_SUCCESS;
     
    17911772                {
    17921773                    try
    1793                     {   /* Save the source directory. */
    1794 /** @todo r=bird: Why the fudge do you do two 'ing stat() calls on the HOST when copy files from the GUEST?
    1795  * Guess it is just some stuff that happened while you were working on SOURCEFILEENTRY, but it doesn't make
    1796  * it more sensible.
    1797  */
    1798                         vecSources.push_back(SOURCEFILEENTRY(ValueUnion.psz));
     1774                    {
     1775                        vecSources.push_back(SourceFileEntry(ValueUnion.psz));
    17991776                    }
    18001777                    catch (std::bad_alloc &)
     
    18111788
    18121789    if (!vecSources.size())
    1813         return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage, "No source(s) specified!");
     1790        return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage, "No sources specified!");
    18141791
    18151792    if (pszDst == NULL)
    18161793        return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage, "No destination specified!");
     1794
     1795    char szAbsDst[RTPATH_MAX];
     1796    if (!fHostToGuest)
     1797    {
     1798        vrc = RTPathAbs(pszDst, szAbsDst, sizeof(szAbsDst));
     1799        if (RT_SUCCESS(vrc))
     1800            pszDst = szAbsDst;
     1801        else
     1802            return RTMsgErrorExitFailure("RTPathAbs failed on '%s': %Rrc", pszDst, vrc);
     1803    }
    18171804
    18181805    RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
     
    18311818    }
    18321819
     1820    HRESULT           rc = S_OK;
    18331821    ComPtr<IProgress> pProgress;
    1834     HRESULT rc = S_OK;
    1835 
    1836     for (unsigned long s = 0; s < vecSources.size(); s++)
    1837     {
    1838         Utf8Str strSrc    = vecSources[s].GetSource();
    1839         Utf8Str strFilter = vecSources[s].GetFilter();
     1822
     1823/** @todo r=bird: This codes does nothing to handle the case where there are
     1824 * multiple sources.  You need to do serveral thing before thats handled
     1825 * correctly.  For starters the progress object handling needs to be moved
     1826 * inside the loop.  Next you need to check what the destination is, because you
     1827 * can only copy multiple source files/directories to another directory.  You
     1828 * actually need to check whether the target exists and is a directory
     1829 * regardless of you have 1 or 10 source files/dirs.
     1830 *
     1831 * Btw. the original approach to error handling here was APPALING.  If some file
     1832 * couldn't be stat'ed or if it was a file/directory, you only spat out messages
     1833 * in verbose mode and never set the status code.
     1834 *
     1835 * The handling of the wildcard filtering expressions in sources was also just
     1836 * skipped.   I've corrected this, but you still need to make up your mind wrt
     1837 * wildcards or not.
     1838 */
     1839    if (vecSources.size() != 1)
     1840        return RTMsgErrorExitFailure("Only one source file or directory at the moment.");
     1841    for (size_t s = 0; s < vecSources.size(); s++)
     1842    {
     1843        Utf8Str const &strSrc    = vecSources[s].GetSource();
     1844        Utf8Str const &strFilter = vecSources[s].GetFilter();
     1845
    18401846        RT_NOREF(strFilter);
    1841         /* strFilter can be NULL if not set. */
    1842 
    1843         if (fHostToGuest)
    1844         {
    1845             if (RTFileExists(strSrc.c_str()))
     1847        if (strFilter.isNotEmpty())
     1848            rcExit = RTMsgErrorExitFailure("Skipping '%s/%s' because wildcard expansion isn't implemented yet\n");
     1849        else if (fHostToGuest)
     1850        {
     1851            /*
     1852             * Source is host, destiation guest.
     1853             */
     1854            char szAbsSrc[RTPATH_MAX];
     1855            vrc = RTPathAbs(strSrc.c_str(), szAbsSrc, sizeof(szAbsSrc));
     1856            if (RT_SUCCESS(vrc))
    18461857            {
    1847                 if (pCtx->cVerbose)
    1848                     RTPrintf("File '%s' -> '%s'\n", strSrc.c_str(), pszDst);
    1849 
    1850                 SafeArray<FileCopyFlag_T> copyFlags;
    1851                 rc = pCtx->pGuestSession->FileCopyToGuest(Bstr(strSrc).raw(), Bstr(pszDst).raw(),
    1852                                                           ComSafeArrayAsInParam(copyFlags), pProgress.asOutParam());
     1858                RTFSOBJINFO ObjInfo;
     1859                vrc = RTPathQueryInfo(szAbsSrc, &ObjInfo, RTFSOBJATTRADD_NOTHING);
     1860                if (RT_SUCCESS(vrc))
     1861                {
     1862                    if (RTFS_IS_FILE(ObjInfo.Attr.fMode))
     1863                    {
     1864                        if (pCtx->cVerbose)
     1865                            RTPrintf("File '%s' -> '%s'\n", szAbsSrc, pszDst);
     1866
     1867                        SafeArray<FileCopyFlag_T> copyFlags;
     1868                        rc = pCtx->pGuestSession->FileCopyToGuest(Bstr(szAbsSrc).raw(), Bstr(pszDst).raw(),
     1869                                                                  ComSafeArrayAsInParam(copyFlags), pProgress.asOutParam());
     1870                    }
     1871                    else if (RTFS_IS_DIRECTORY(ObjInfo.Attr.fMode))
     1872                    {
     1873                        if (pCtx->cVerbose)
     1874                            RTPrintf("Directory '%s' -> '%s'\n", szAbsSrc, pszDst);
     1875
     1876                        SafeArray<DirectoryCopyFlag_T> copyFlags;
     1877                        copyFlags.push_back(DirectoryCopyFlag_CopyIntoExisting);
     1878                        rc = pCtx->pGuestSession->DirectoryCopyToGuest(Bstr(szAbsSrc).raw(), Bstr(pszDst).raw(),
     1879                                                                       ComSafeArrayAsInParam(copyFlags), pProgress.asOutParam());
     1880                    }
     1881                    else
     1882                        rcExit = RTMsgErrorExitFailure("Not a file or directory: %s\n", szAbsSrc);
     1883                }
     1884                else
     1885                    rcExit = RTMsgErrorExitFailure("RTPathQueryInfo failed on '%s': %Rrc", szAbsSrc, vrc);
    18531886            }
    1854             else if (RTDirExists(strSrc.c_str()))
    1855             {
    1856                 if (pCtx->cVerbose)
    1857                     RTPrintf("Directory '%s' -> '%s'\n", strSrc.c_str(), pszDst);
    1858 
    1859                 SafeArray<DirectoryCopyFlag_T> copyFlags;
    1860                 copyFlags.push_back(DirectoryCopyFlag_CopyIntoExisting);
    1861                 rc = pCtx->pGuestSession->DirectoryCopyToGuest(Bstr(strSrc).raw(), Bstr(pszDst).raw(),
    1862                                                                ComSafeArrayAsInParam(copyFlags), pProgress.asOutParam());
    1863             }
    1864             else if (pCtx->cVerbose)
    1865                 RTPrintf("Warning: \"%s\" does not exist or is not a file/directory, skipping ...\n", strSrc.c_str());
     1887            else
     1888                rcExit = RTMsgErrorExitFailure("RTPathAbs failed on '%s': %Rrc", strSrc.c_str());
    18661889        }
    18671890        else
    18681891        {
     1892            /*
     1893             * Source guest, destination host.
     1894             */
    18691895            /* We need to query the source type on the guest first in order to know which copy flavor we need. */
    18701896            ComPtr<IGuestFsObjInfo> pFsObjInfo;
    1871             FsObjType_T enmObjType = FsObjType_Unknown; /* Shut up MSC */
    18721897            rc = pCtx->pGuestSession->FsObjQueryInfo(Bstr(strSrc).raw(), TRUE  /* fFollowSymlinks */, pFsObjInfo.asOutParam());
    18731898            if (SUCCEEDED(rc))
    1874                 rc = pFsObjInfo->COMGETTER(Type)(&enmObjType);
    1875             if (FAILED(rc))
    18761899            {
    1877                 if (pCtx->cVerbose)
    1878                     RTPrintf("Warning: Cannot stat for element '%s': No such element\n", strSrc.c_str());
    1879                 continue; /* Skip. */
     1900                FsObjType_T enmObjType;
     1901                CHECK_ERROR(pFsObjInfo,COMGETTER(Type)(&enmObjType));
     1902                if (SUCCEEDED(rc))
     1903                {
     1904                    /* Take action according to source file. */
     1905                    if (enmObjType == FsObjType_Directory)
     1906                    {
     1907                        if (pCtx->cVerbose)
     1908                            RTPrintf("Directory '%s' -> '%s'\n", strSrc.c_str(), pszDst);
     1909
     1910                        SafeArray<DirectoryCopyFlag_T> aCopyFlags;
     1911                        aCopyFlags.push_back(DirectoryCopyFlag_CopyIntoExisting);
     1912                        rc = pCtx->pGuestSession->DirectoryCopyFromGuest(Bstr(strSrc).raw(), Bstr(pszDst).raw(),
     1913                                                                         ComSafeArrayAsInParam(aCopyFlags), pProgress.asOutParam());
     1914                    }
     1915                    else if (enmObjType == FsObjType_File)
     1916                    {
     1917                        if (pCtx->cVerbose)
     1918                            RTPrintf("File '%s' -> '%s'\n", strSrc.c_str(), pszDst);
     1919
     1920                        SafeArray<FileCopyFlag_T> aCopyFlags;
     1921                        rc = pCtx->pGuestSession->FileCopyFromGuest(Bstr(strSrc).raw(), Bstr(pszDst).raw(),
     1922                                                                    ComSafeArrayAsInParam(aCopyFlags), pProgress.asOutParam());
     1923                    }
     1924                    else
     1925                        rcExit = RTMsgErrorExitFailure("Not a file or directory: %s\n", strSrc.c_str());
     1926                }
     1927                else
     1928                    rcExit = RTEXITCODE_FAILURE;
    18801929            }
    1881 
    1882             if (enmObjType == FsObjType_Directory)
    1883             {
    1884                 if (pCtx->cVerbose)
    1885                     RTPrintf("Directory '%s' -> '%s'\n", strSrc.c_str(), pszDst);
    1886 
    1887                 SafeArray<DirectoryCopyFlag_T> copyFlags;
    1888                 copyFlags.push_back(DirectoryCopyFlag_CopyIntoExisting);
    1889                 rc = pCtx->pGuestSession->DirectoryCopyFromGuest(Bstr(strSrc).raw(), Bstr(pszDst).raw(),
    1890                                                                  ComSafeArrayAsInParam(copyFlags), pProgress.asOutParam());
    1891             }
    1892             else if (enmObjType == FsObjType_File)
    1893             {
    1894                 if (pCtx->cVerbose)
    1895                     RTPrintf("File '%s' -> '%s'\n", strSrc.c_str(), pszDst);
    1896 
    1897                 SafeArray<FileCopyFlag_T> copyFlags;
    1898                 rc = pCtx->pGuestSession->FileCopyFromGuest(Bstr(strSrc).raw(), Bstr(pszDst).raw(),
    1899                                                             ComSafeArrayAsInParam(copyFlags), pProgress.asOutParam());
    1900             }
    1901             else if (pCtx->cVerbose)
    1902                 RTPrintf("Warning: Skipping '%s': Not handled\n", strSrc.c_str());
     1930            else
     1931                rcExit = RTMsgErrorExitFailure("FsObjQueryInfo failed on '%s': %Rrc", strSrc.c_str());
    19031932        }
    19041933    }
     
    19181947        vrc = gctlPrintProgressError(pProgress);
    19191948    }
    1920 
    1921     return RT_SUCCESS(vrc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
     1949    if (RT_FAILURE(vrc))
     1950        rcExit = RTEXITCODE_FAILURE;
     1951
     1952    return rcExit;
    19221953}
    19231954
     
    19321963}
    19331964
    1934 static DECLCALLBACK(RTEXITCODE) handleCtrtMkDir(PGCTLCMDCTX pCtx, int argc, char **argv)
     1965static DECLCALLBACK(RTEXITCODE) gctrlHandleMkDir(PGCTLCMDCTX pCtx, int argc, char **argv)
    19351966{
    19361967    AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
     
    19481979    RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
    19491980
    1950     SafeArray<DirectoryCreateFlag_T> dirCreateFlags;
     1981    SafeArray<DirectoryCreateFlag_T> aDirCreateFlags;
    19511982    uint32_t    fDirMode     = 0; /* Default mode. */
    19521983    uint32_t    cDirsCreated = 0;
     
    19651996
    19661997            case 'P': /* Create parents */
    1967                 dirCreateFlags.push_back(DirectoryCreateFlag_Parents);
     1998                aDirCreateFlags.push_back(DirectoryCreateFlag_Parents);
    19681999                break;
    19692000
     
    19992030                    HRESULT rc;
    20002031                    CHECK_ERROR(pCtx->pGuestSession, DirectoryCreate(Bstr(ValueUnion.psz).raw(),
    2001                                                                      fDirMode, ComSafeArrayAsInParam(dirCreateFlags)));
     2032                                                                     fDirMode, ComSafeArrayAsInParam(aDirCreateFlags)));
    20022033                    if (FAILED(rc))
    20032034                        rcExit = RTEXITCODE_FAILURE;
     
    20612092                        return rcExit;
    20622093                    if (pCtx->cVerbose)
    2063                         RTPrintf("Removing %RU32 directorie%ss...\n", argc - GetState.iNext + 1, fRecursive ? "trees" : "");
     2094                        RTPrintf("Removing %RU32 directorie%s(s)...\n", argc - GetState.iNext + 1, fRecursive ? "tree" : "");
    20642095                }
    20652096                if (g_fGuestCtrlCanceled)
     
    22232254    {
    22242255        GCTLCMD_COMMON_OPTION_DEFS()
     2256/** @todo Missing --force/-f flag.   */
    22252257    };
    22262258
     
    23042336
    23052337    std::vector< Utf8Str >::iterator it = vecSources.begin();
    2306     while (   (it != vecSources.end())
     2338    while (   it != vecSources.end()
    23072339           && !g_fGuestCtrlCanceled)
    23082340    {
     
    23172349        {
    23182350            if (pCtx->cVerbose)
    2319                 RTPrintf("Warning: Cannot stat for element \"%s\": No such element\n",
    2320                          strCurSource.c_str());
     2351                RTPrintf("Warning: Cannot stat for element \"%s\": No such file or directory\n", strCurSource.c_str());
    23212352            ++it;
    23222353            continue; /* Skip. */
     
    23392370                 * the same directory. */
    23402371/** @todo r=bird: You are being kind of windowsy (or just DOSish) about the 'sense' part here,
    2341  * while being totaly buggy about the behavior. 'VBoxGuest guestcontrol ren dir1 dir2 dstdir' will
     2372 * while being totaly buggy about the behavior. 'VBoxManage guestcontrol ren dir1 dir2 dstdir' will
    23422373 * stop after 'dir1' and SILENTLY ignore dir2.  If you tried this on Windows, you'd see an error
    23432374 * being displayed.  If you 'man mv' on a nearby unixy system, you'd see that they've made perfect
     
    24142445
    24152446            case VINF_GETOPT_NOT_OPTION:
    2416             {
    24172447                if (strTemplate.isEmpty())
    24182448                    strTemplate = ValueUnion.psz;
     
    24212451                                         "More than one template specified!\n");
    24222452                break;
    2423             }
    24242453
    24252454            default:
     
    24622491    if (fDirectory)
    24632492    {
    2464         Bstr directory;
     2493        Bstr bstrDirectory;
    24652494        CHECK_ERROR(pCtx->pGuestSession, DirectoryCreateTemp(Bstr(strTemplate).raw(),
    24662495                                                             fMode, Bstr(strTempDir).raw(),
    24672496                                                             fSecure,
    2468                                                              directory.asOutParam()));
     2497                                                             bstrDirectory.asOutParam()));
    24692498        if (SUCCEEDED(rc))
    2470             RTPrintf("Directory name: %ls\n", directory.raw());
     2499            RTPrintf("Directory name: %ls\n", bstrDirectory.raw());
    24712500    }
    24722501    else
     
    24992528    RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
    25002529
    2501     DESTDIRMAP mapObjs;
    2502 
    2503     while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
     2530    while (  (ch = RTGetOpt(&GetState, &ValueUnion)) != 0
     2531           && ch != VINF_GETOPT_NOT_OPTION)
    25042532    {
    25052533        /* For options that require an argument, ValueUnion has received the value. */
     
    25152543                                     "Command \"%s\" not implemented yet!", ValueUnion.psz);
    25162544
    2517             case VINF_GETOPT_NOT_OPTION:
    2518                 mapObjs[ValueUnion.psz]; /* Add element to check to map. */
    2519                 break;
    2520 
    25212545            default:
    25222546                return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_STAT, ch, &ValueUnion);
     
    25242548    }
    25252549
    2526     size_t cObjs = mapObjs.size();
    2527     if (!cObjs)
    2528         return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_STAT,
    2529                              "No element(s) to check specified!");
     2550    if (ch != VINF_GETOPT_NOT_OPTION)
     2551        return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_STAT, "Nothing to stat!");
    25302552
    25312553    RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
     
    25332555        return rcExit;
    25342556
    2535     HRESULT rc;
    25362557
    25372558    /*
    2538      * Doing the checks.
     2559     * Do the file stat'ing.
    25392560     */
    2540     DESTDIRMAPITER it = mapObjs.begin();
    2541     while (it != mapObjs.end())
     2561    while (ch == VINF_GETOPT_NOT_OPTION)
    25422562    {
    25432563        if (pCtx->cVerbose)
    2544             RTPrintf("Checking for element \"%s\" ...\n", it->first.c_str());
     2564            RTPrintf("Checking for element \"%s\" ...\n", ValueUnion.psz);
    25452565
    25462566        ComPtr<IGuestFsObjInfo> pFsObjInfo;
    2547         rc = pCtx->pGuestSession->FsObjQueryInfo(Bstr(it->first).raw(), FALSE /*followSymlinks*/, pFsObjInfo.asOutParam());
    2548         if (FAILED(rc))
     2567        HRESULT hrc = pCtx->pGuestSession->FsObjQueryInfo(Bstr(ValueUnion.psz).raw(), FALSE /*followSymlinks*/,
     2568                                                          pFsObjInfo.asOutParam());
     2569        if (FAILED(hrc))
    25492570        {
    25502571            /* If there's at least one element which does not exist on the guest,
    25512572             * drop out with exitcode 1. */
    25522573            if (pCtx->cVerbose)
    2553                 RTPrintf("Cannot stat for element \"%s\": No such element\n",
    2554                          it->first.c_str());
     2574                RTPrintf("Cannot stat for element \"%s\": No such element\n", ValueUnion.psz);
    25552575            rcExit = RTEXITCODE_FAILURE;
    25562576        }
     
    25622582            {
    25632583                case FsObjType_File:
    2564                     RTPrintf("Element \"%s\" found: Is a file\n", it->first.c_str());
     2584                    RTPrintf("Element \"%s\" found: Is a file\n", ValueUnion.psz);
    25652585                    break;
    25662586
    25672587                case FsObjType_Directory:
    2568                     RTPrintf("Element \"%s\" found: Is a directory\n", it->first.c_str());
     2588                    RTPrintf("Element \"%s\" found: Is a directory\n", ValueUnion.psz);
    25692589                    break;
    25702590
    25712591                case FsObjType_Symlink:
    2572                     RTPrintf("Element \"%s\" found: Is a symlink\n", it->first.c_str());
     2592                    RTPrintf("Element \"%s\" found: Is a symlink\n", ValueUnion.psz);
    25732593                    break;
    25742594
    25752595                default:
    2576                     RTPrintf("Element \"%s\" found, type unknown (%ld)\n", it->first.c_str(), objType);
     2596                    RTPrintf("Element \"%s\" found, type unknown (%ld)\n", ValueUnion.psz, objType);
    25772597                    break;
    25782598            }
     
    25812601        }
    25822602
    2583         ++it;
     2603        /* Next file. */
     2604        ch = RTGetOpt(&GetState, &ValueUnion);
    25842605    }
    25852606
     
    26862707        ComPtr<IProgress> pProgress;
    26872708        CHECK_ERROR(pCtx->pGuest, UpdateGuestAdditions(Bstr(strSource).raw(),
    2688                                                 ComSafeArrayAsInParam(aArgs),
    2689                                                 /* Wait for whole update process to complete. */
    2690                                                 ComSafeArrayAsInParam(aUpdateFlags),
    2691                                                 pProgress.asOutParam()));
     2709                                                       ComSafeArrayAsInParam(aArgs),
     2710                                                       /* Wait for whole update process to complete. */
     2711                                                       ComSafeArrayAsInParam(aUpdateFlags),
     2712                                                       pProgress.asOutParam()));
    26922713        if (FAILED(rc))
    26932714            vrc = gctlPrintError(pCtx->pGuest, COM_IIDOF(IGuest));
     
    28762897    }
    28772898
    2878     if (FAILED(rc))
     2899    if (FAILED(rc)) /** @todo yeah, right... Only the last error? */
    28792900        rcExit = RTEXITCODE_FAILURE;
    28802901
     
    28992920
    29002921    std::vector < uint32_t > vecPID;
    2901     ULONG ulSessionID = UINT32_MAX;
     2922    ULONG idSession = UINT32_MAX;
    29022923    Utf8Str strSessionName;
    29032924
     
    29142935
    29152936            case 'i': /* Session ID */
    2916                 ulSessionID = ValueUnion.u32;
     2937                idSession = ValueUnion.u32;
    29172938                break;
    29182939
     
    29422963                }
    29432964                else
    2944                     return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS,
    2945                                          "Error parsing PID value: %Rrc", rc);
     2965                    return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS, "Error parsing PID value: %Rrc", rc);
    29462966                break;
    29472967            }
     
    29572977
    29582978    if (   strSessionName.isEmpty()
    2959         && ulSessionID == UINT32_MAX)
     2979        && idSession == UINT32_MAX)
    29602980        return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS, "No session ID specified!");
    29612981
    29622982    if (   strSessionName.isNotEmpty()
    2963         && ulSessionID != UINT32_MAX)
     2983        && idSession != UINT32_MAX)
    29642984        return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS,
    29652985                             "Either session ID or name (pattern) must be specified");
     
    29762996    {
    29772997        uint32_t uProcsTerminated = 0;
    2978         bool fSessionFound = false;
    29792998
    29802999        SafeIfaceArray <IGuestSession> collSessions;
     
    29823001        size_t cSessions = collSessions.size();
    29833002
    2984         uint32_t uSessionsHandled = 0;
     3003        uint32_t cSessionsHandled = 0;
    29853004        for (size_t i = 0; i < cSessions; i++)
    29863005        {
     
    29933012            CHECK_ERROR_BREAK(pSession, COMGETTER(Name)(strName.asOutParam()));
    29943013            Utf8Str strNameUtf8(strName); /* Session name */
     3014
     3015            bool fSessionFound;
    29953016            if (strSessionName.isEmpty()) /* Search by ID. Slow lookup. */
    2996             {
    2997                 fSessionFound = uID == ulSessionID;
    2998             }
     3017                fSessionFound = uID == idSession;
    29993018            else /* ... or by naming pattern. */
    3000             {
    3001                 if (RTStrSimplePatternMatch(strSessionName.c_str(), strNameUtf8.c_str()))
    3002                     fSessionFound = true;
    3003             }
    3004 
     3019                fSessionFound = RTStrSimplePatternMatch(strSessionName.c_str(), strNameUtf8.c_str());
    30053020            if (fSessionFound)
    30063021            {
    30073022                AssertStmt(!pSession.isNull(), break);
    3008                 uSessionsHandled++;
     3023                cSessionsHandled++;
    30093024
    30103025                SafeIfaceArray <IGuestProcess> collProcs;
     
    30383053                    else
    30393054                    {
    3040                         if (ulSessionID != UINT32_MAX)
     3055                        if (idSession != UINT32_MAX)
    30413056                            RTPrintf("No matching process(es) for session ID %RU32 found\n",
    3042                                      ulSessionID);
     3057                                     idSession);
    30433058                    }
    30443059
     
    30503065        }
    30513066
    3052         if (!uSessionsHandled)
     3067        if (!cSessionsHandled)
    30533068            RTPrintf("No matching session(s) found\n");
    30543069
     
    30873102    RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
    30883103
    3089     ULONG ulSessionID = UINT32_MAX;
     3104    ULONG idSession = UINT32_MAX;
    30903105    Utf8Str strSessionName;
    30913106
     
    31023117
    31033118            case 'i': /* Session ID */
    3104                 ulSessionID = ValueUnion.u32;
     3119                idSession = ValueUnion.u32;
    31053120                break;
    31063121
     
    31183133
    31193134    if (   strSessionName.isEmpty()
    3120         && ulSessionID == UINT32_MAX)
     3135        && idSession == UINT32_MAX)
    31213136        return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSESESSION,
    31223137                             "No session ID specified!");
    31233138
    31243139    if (   !strSessionName.isEmpty()
    3125         && ulSessionID != UINT32_MAX)
     3140        && idSession != UINT32_MAX)
    31263141        return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSESESSION,
    31273142                             "Either session ID or name (pattern) must be specified");
     
    31353150    do
    31363151    {
    3137         bool fSessionFound = false;
    31383152        size_t cSessionsHandled = 0;
    31393153
     
    31533167            Utf8Str strNameUtf8(strName); /* Session name */
    31543168
     3169            bool fSessionFound;
    31553170            if (strSessionName.isEmpty()) /* Search by ID. Slow lookup. */
    3156             {
    3157                 fSessionFound = uID == ulSessionID;
    3158             }
     3171                fSessionFound = uID == idSession;
    31593172            else /* ... or by naming pattern. */
    3160             {
    3161                 if (RTStrSimplePatternMatch(strSessionName.c_str(), strNameUtf8.c_str()))
    3162                     fSessionFound = true;
    3163             }
    3164 
     3173                fSessionFound = RTStrSimplePatternMatch(strSessionName.c_str(), strNameUtf8.c_str());
    31653174            if (fSessionFound)
    31663175            {
     
    32553264            RTPrintf("Waiting for events ...\n");
    32563265
     3266/** @todo r=bird: This are-we-there-yet approach to things could easily be
     3267 *        replaced by a global event semaphore that gets signalled from the
     3268 *        signal handler and the callback event.  Please fix! */
    32573269        while (!g_fGuestCtrlCanceled)
    32583270        {
     
    33073319        { "copyto",             gctlHandleCopyTo,           USAGE_GSTCTRL_COPYTO,    0, },
    33083320
    3309         { "mkdir",              handleCtrtMkDir,            USAGE_GSTCTRL_MKDIR,     0, },
    3310         { "md",                 handleCtrtMkDir,            USAGE_GSTCTRL_MKDIR,     0, },
    3311         { "createdirectory",    handleCtrtMkDir,            USAGE_GSTCTRL_MKDIR,     0, },
    3312         { "createdir",          handleCtrtMkDir,            USAGE_GSTCTRL_MKDIR,     0, },
     3321        { "mkdir",              gctrlHandleMkDir,           USAGE_GSTCTRL_MKDIR,     0, },
     3322        { "md",                 gctrlHandleMkDir,           USAGE_GSTCTRL_MKDIR,     0, },
     3323        { "createdirectory",    gctrlHandleMkDir,           USAGE_GSTCTRL_MKDIR,     0, },
     3324        { "createdir",          gctrlHandleMkDir,           USAGE_GSTCTRL_MKDIR,     0, },
    33133325
    33143326        { "rmdir",              gctlHandleRmDir,            USAGE_GSTCTRL_RMDIR,     0, },
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