VirtualBox

忽略:
時間撮記:
2009-12-17 下午09:48:33 (15 年 以前)
作者:
vboxsync
訊息:

FreeBSD: Use sysctl instead of procfs to retrieve executable path and arguments. Contributed by Bernhard Froehlich and Baptiste Daroussin

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Runtime/r3/freebsd/rtProcInitExePath-freebsd.cpp

    r16024 r25472  
    3333*******************************************************************************/
    3434#define LOG_GROUP RTLOGGROUP_PROCESS
     35#include <sys/param.h>
     36#include <sys/sysctl.h>
    3537#include <unistd.h>
    3638#include <errno.h>
     
    4850DECLHIDDEN(int) rtProcInitExePath(char *pszPath, size_t cchPath)
    4951{
    50     /*
    51      * Read the /proc/curproc/file link, convert to native and return it.
    52      */
    53     int cchLink = readlink("/proc/curproc/file", pszPath, cchPath - 1);
    54     if (cchLink > 0 && (size_t)cchLink <= cchPath - 1)
     52    int aiName[4];
     53    size_t cchExePath;
     54
     55    aiName[0] = CTL_KERN;
     56    aiName[1] = KERN_PROC;
     57    aiName[2] = KERN_PROC_PATHNAME;
     58    aiName[3] = getpid();
     59
     60    cchExePath = cchPath - 1;
     61    if(sysctl(aiName, RT_ELEMENTS(aiName), pszPath, &cchExePath, NULL, 0) == 0)
    5562    {
    56         pszPath[cchLink] = '\0';
    57 
    5863        char *pszTmp = NULL;
    5964        int rc = rtPathFromNative(&pszTmp, pszPath);
    60         AssertMsgRCReturn(rc, ("rc=%Rrc pszLink=\"%s\"\nhex: %.*Rhsx\n", rc, pszPath, cchLink, pszPath), rc);
     65        AssertMsgRCReturn(rc, ("rc=%Rrc pszLink=\"%s\"\nhex: %.*Rhsx\n", rc, pszPath, cchExePath, pszPath), rc);
    6166
    6267        size_t cch = strlen(pszTmp);
     
    6974    }
    7075
    71     int err = errno;
    72 
    73     /*
    74      * Fall back on the dynamic linker since /proc is optional.
    75      */
    76     void *hExe = dlopen(NULL, 0);
    77     if (hExe)
    78     {
    79         struct link_map const *pLinkMap = 0;
    80         if (dlinfo(hExe, RTLD_DI_LINKMAP, &pLinkMap) == 0)
    81         {
    82             const char *pszImageName = pLinkMap->l_name;
    83             if (*pszImageName == '/') /* this may not always be absolute, despite the docs. :-( */
    84             {
    85                 char *pszTmp = NULL;
    86                 int rc = rtPathFromNative(&pszTmp, pszImageName);
    87                 AssertMsgRCReturn(rc, ("rc=%Rrc pszImageName=\"%s\"\n", rc, pszImageName), rc);
    88 
    89                 size_t cch = strlen(pszTmp);
    90                 AssertReturn(cch <= cchPath, VERR_BUFFER_OVERFLOW);
    91 
    92                 memcpy(pszPath, pszTmp, cch + 1);
    93                 RTStrFree(pszTmp);
    94 
    95                 return VINF_SUCCESS;
    96             }
    97             /** @todo Try search the PATH for the file name or append the current
    98              *        directory, which ever makes sense... */
    99         }
    100     }
    101 
    102     int rc = RTErrConvertFromErrno(err);
    103     AssertMsgFailed(("rc=%Rrc err=%d cchLink=%d hExe=%p\n", rc, err, cchLink, hExe));
     76    int rc = RTErrConvertFromErrno(errno);
     77    AssertMsgFailed(("rc=%Rrc errno=%d cchLink=%d\n", rc, errno, cchExePath));
    10478    return rc;
    10579}
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette