VirtualBox

Changeset 40825 in vbox


Ignore:
Timestamp:
Apr 8, 2012 5:06:59 PM (13 years ago)
Author:
vboxsync
Message:

Implemented RTPROC_FLAGS_SEARCH_PATH on windows.

Location:
trunk/src/VBox/Runtime/r3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/posix/process-creation-posix.cpp

    r40571 r40825  
    272272        || errno == EPERM)
    273273        return RTErrConvertFromErrno(errno);
    274     return VINF_TRY_AGAIN;
     274    return VERR_TRY_AGAIN;
    275275}
    276276
  • trunk/src/VBox/Runtime/r3/win/process-win.cpp

    r40497 r40825  
    10161016}
    10171017
     1018
     1019/**
     1020 * RTPathTraverseList callback used by RTProcCreateEx to locate the executable.
     1021 */
     1022static DECLCALLBACK(int) rtPathFindExec(char const *pchPath, size_t cchPath, void *pvUser1, void *pvUser2)
     1023{
     1024    const char *pszExec     = (const char *)pvUser1;
     1025    char       *pszRealExec = (char *)pvUser2;
     1026    int rc = RTPathJoinEx(pszRealExec, RTPATH_MAX, pchPath, cchPath, pszExec, RTSTR_MAX);
     1027    if (RT_FAILURE(rc))
     1028        return rc;
     1029    if (RTFileExists(pszRealExec))
     1030        return VINF_SUCCESS;
     1031    return VERR_TRY_AGAIN;
     1032}
     1033
     1034
    10181035RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArgs, RTENV hEnv, uint32_t fFlags,
    10191036                               PCRTHANDLE phStdIn, PCRTHANDLE phStdOut, PCRTHANDLE phStdErr, const char *pszAsUser,
     
    10251042    AssertPtrReturn(pszExec, VERR_INVALID_POINTER);
    10261043    AssertReturn(*pszExec, VERR_INVALID_PARAMETER);
    1027     AssertReturn(!(fFlags & ~(RTPROC_FLAGS_DETACHED | RTPROC_FLAGS_HIDDEN | RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_SAME_CONTRACT | RTPROC_FLAGS_NO_PROFILE | RTPROC_FLAGS_NO_WINDOW)), VERR_INVALID_PARAMETER);
     1044    AssertReturn(!(fFlags & ~(RTPROC_FLAGS_DETACHED | RTPROC_FLAGS_HIDDEN | RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_SAME_CONTRACT
     1045                              | RTPROC_FLAGS_NO_PROFILE | RTPROC_FLAGS_NO_WINDOW | RTPROC_FLAGS_SEARCH_PATH)),
     1046                 VERR_INVALID_PARAMETER);
    10281047    AssertReturn(!(fFlags & RTPROC_FLAGS_DETACHED) || !phProcess, VERR_INVALID_PARAMETER);
    10291048    AssertReturn(hEnv != NIL_RTENV, VERR_INVALID_PARAMETER);
     
    10401059    int rc = RTOnce(&g_rtProcWinInitOnce, rtProcWinInitOnce, NULL, NULL);
    10411060    AssertRCReturn(rc, rc);
     1061
     1062    /*
     1063     * Resolve the executable name via the PATH if requested.
     1064     */
     1065    char szRealExec[RTPATH_MAX];
     1066    if (   (fFlags & RTPROC_FLAGS_SEARCH_PATH)
     1067        && !RTPathHavePath(pszExec)
     1068        && !RTPathExists(pszExec) )
     1069    {
     1070        /* search */
     1071        char *pszPath;
     1072        if (RTEnvExistEx(hEnv, "PATH"))
     1073            pszPath = RTEnvDupEx(hEnv, "PATH");
     1074        else
     1075            pszPath = RTEnvDupEx(hEnv, "Path");
     1076        rc = RTPathTraverseList(pszPath, ';', rtPathFindExec, (void *)pszExec, &szRealExec[0]);
     1077        RTStrFree(pszPath);
     1078        if (RT_FAILURE(rc))
     1079            return rc == VERR_END_OF_STRING ? VERR_FILE_NOT_FOUND : rc;
     1080        pszExec = szRealExec;
     1081    }
    10421082
    10431083    /*
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