VirtualBox

Changeset 36755 in vbox


Ignore:
Timestamp:
Apr 20, 2011 2:38:32 PM (14 years ago)
Author:
vboxsync
Message:

Main/VBoxService/GuestCtrl: More argv0 fixes.

Location:
trunk/src/VBox
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp

    r36745 r36755  
    717717
    718718
    719 #ifdef VBOXSERVICE_TOOLBOX
    720719/**
    721720 * Constructs the argv command line by resolving environment variables
     
    731730                                             const char * const *papszArgs, char ***ppapszArgv)
    732731{
    733     AssertPtrReturn(pszArgv0, VERR_INVALID_PARAMETER);
    734     AssertPtrReturn(ppapszArgv, VERR_INVALID_PARAMETER);
    735 
    736732/** @todo RTGetOptArgvToString converts to MSC quoted string, while
    737733 *        RTGetOptArgvFromString takes bourne shell according to the docs...
    738734 * Actually, converting to and from here is a very roundabout way of prepending
    739735 * an entry (pszFilename) to an array (*ppapszArgv). */
    740     char *pszArgs;
    741     int rc = RTGetOptArgvToString(&pszArgs, papszArgs,
     736    int rc = VINF_SUCCESS;
     737    char *pszNewArgs = NULL;
     738    if (pszArgv0)
     739        rc = RTStrAAppend(&pszNewArgs, pszArgv0);
     740    if (   RT_SUCCESS(rc)
     741        && papszArgs)
     742
     743    {
     744        char *pszArgs;
     745        rc = RTGetOptArgvToString(&pszArgs, papszArgs,
    742746                                  RTGETOPTARGV_CNV_QUOTE_MS_CRT); /* RTGETOPTARGV_CNV_QUOTE_BOURNE_SH */
    743     if (   RT_SUCCESS(rc)
    744         && *pszArgs)
    745     {
    746         /*
    747          * Construct the new command line by appending the actual
    748          * tool name to new process' command line.
    749          */
    750         char szArgsExp[RTPATH_MAX];
    751         rc = VBoxServiceControlExecMakeFullPath(pszArgs, szArgsExp, sizeof(szArgsExp));
    752747        if (RT_SUCCESS(rc))
    753748        {
    754             char *pszNewArgs;
    755             if (RTStrAPrintf(&pszNewArgs, "%s %s", pszArgv0, szArgsExp))
    756             {
    757 #ifdef DEBUG
    758                 VBoxServiceVerbose(3, "ControlExec: VBoxServiceControlExecPrepareArgv: %s\n",
    759                                    pszNewArgs);
    760 #endif
    761                 int iNumArgsIgnored;
    762                 rc = RTGetOptArgvFromString(ppapszArgv, &iNumArgsIgnored,
    763                                             pszNewArgs, NULL /* Use standard separators. */);
    764                 RTStrFree(pszNewArgs);
    765             }
    766         }
    767         RTStrFree(pszArgs);
    768     }
    769     else /* No arguments given, just use the resolved file name as argv[0]. */
     749            rc = RTStrAAppend(&pszNewArgs, " ");
     750            if (RT_SUCCESS(rc))
     751                rc = RTStrAAppend(&pszNewArgs, pszArgs);
     752        }
     753    }
     754
     755    if (RT_SUCCESS(rc))
    770756    {
    771757        int iNumArgsIgnored;
    772758        rc = RTGetOptArgvFromString(ppapszArgv, &iNumArgsIgnored,
    773                                     pszArgv0, NULL /* Use standard separators. */);
    774     }
    775     return rc;
    776 }
    777 #endif
     759                                    pszNewArgs ? pszNewArgs : "", NULL /* Use standard separators. */);
     760    }
     761
     762VBoxServiceVerbose(3, "args: %s\n", pszNewArgs);
     763
     764    if (pszNewArgs)
     765        RTStrFree(pszNewArgs);
     766    return rc;
     767}
    778768
    779769
     
    834824        {
    835825            char **papszArgsExp;
    836             rc = VBoxServiceControlExecPrepareArgv(szSysprepCmd /* argv0 */, &papszArgs[1], &papszArgsExp);
     826            rc = VBoxServiceControlExecPrepareArgv(szSysprepCmd /* argv0 */, papszArgs, &papszArgsExp);
    837827            if (RT_SUCCESS(rc))
    838828            {
     
    867857    {
    868858        char **papszArgsExp;
    869         rc = VBoxServiceControlExecPrepareArgv(papszArgs[0], &papszArgs[1], &papszArgsExp);
     859        rc = VBoxServiceControlExecPrepareArgv(pszExec /* Always use the unmodified executable name as argv0. */,
     860                                               papszArgs /* Append the rest of the argument vector (if any). */, &papszArgsExp);
    870861        if (RT_SUCCESS(rc))
    871862        {
     
    888879#ifdef DEBUG
    889880            VBoxServiceVerbose(3, "Command: %s\n", szExecExp);
    890             for (size_t i = 0; papszArgsExp[i]; i++)
    891                 VBoxServiceVerbose(3, "\targv[%ld]: %s\n", i, papszArgsExp[i]);
     881            for (size_t i = 0; papszArgs[i]; i++)
     882                VBoxServiceVerbose(3, "\targv[%ld]: %s\n", i, papszArgs[i]);
    892883#endif
     884
     885    VBoxServiceVerbose(3, "%p %p %p\n", papszArgs, papszArgs[0], papszArgs[1]);
     886
    893887            /* Do normal execution. */
    894888            rc = RTProcCreateEx(szExecExp, papszArgsExp, hEnv, uProcFlags,
  • trunk/src/VBox/Main/src-client/GuestCtrlImpl.cpp

    r36741 r36755  
    256256                        }
    257257
    258                         args.push_back(Bstr(VBOXSERVICE_TOOL_CAT).raw()); /* The actual (internal) tool to use (as argv[0]). */
    259258                        args.push_back(Bstr(szOutput).raw());             /* We want to write a file ... */
    260259                    }
     
    569568                com::SafeArray<IN_BSTR> env;
    570569
    571                 args.push_back(Bstr(VBOXSERVICE_TOOL_CAT).raw());     /* The actual (internal) tool to use (as argv[0]). */
    572570                args.push_back(Bstr("--output").raw());               /* We want to write a file ... */
    573571                args.push_back(Bstr(strInstallerPath.c_str()).raw()); /* ... with this path. */
     
    24052403         * Prepare tool command line.
    24062404         */
    2407         args.push_back(Bstr(VBOXSERVICE_TOOL_MKDIR).raw()); /* The actual (internal) tool to use (as argv[0]). */
    24082405        if (aFlags & CreateDirectoryFlag_Parents)
    24092406            args.push_back(Bstr("--parents").raw());        /* We also want to create the parent directories. */
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