VirtualBox

儲存庫 vbox 的更動 17011


忽略:
時間撮記:
2009-2-23 下午12:27:38 (16 年 以前)
作者:
vboxsync
訊息:

RTProcIsRunningByName cleanup.

位置:
trunk/src/VBox/Runtime
檔案:
修改 3 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Runtime/generic/RTProcIsRunningByName-generic.cpp

    r16999 r17011  
    3232*   Header Files                                                               *
    3333*******************************************************************************/
    34 #include <iprt/string.h>
    3534#include <iprt/process.h>
    3635
  • trunk/src/VBox/Runtime/r3/linux/RTProcIsRunningByName-linux.cpp

    r17003 r17011  
    3333*******************************************************************************/
    3434#define LOG_GROUP RTLOGGROUP_PROCESS
     35#include <iprt/process.h>
    3536#include <iprt/string.h>
    36 #include <iprt/process.h>
    3737#include <iprt/dir.h>
    3838#include <iprt/path.h>
     
    4040#include <iprt/param.h>
    4141#include <iprt/assert.h>
    42 
    43 #include <unistd.h>
    4442
    4543
     
    5250        return false;
    5351
     52    bool fFoundIt = false;
    5453    PRTDIR pDir;
    5554    int rc = RTDirOpen(&pDir, "/proc");
     
    5857    {
    5958        RTDIRENTRY DirEntry;
    60         while(RT_SUCCESS(RTDirRead(pDir, &DirEntry, NULL)))
     59        while (RT_SUCCESS(RTDirRead(pDir, &DirEntry, NULL)))
    6160        {
    6261            /*
    6362             * Filter numeric directory entries only.
    6463             */
    65             if (DirEntry.enmType == RTDIRENTRYTYPE_DIRECTORY &&
    66                 RTStrToUInt32(DirEntry.szName) > 0)
     64            if (    DirEntry.enmType == RTDIRENTRYTYPE_DIRECTORY
     65                &&  RTStrToUInt32(DirEntry.szName) > 0)
    6766            {
    6867                /*
    69                  * Build the path to the proc cmdline file of this process.
     68                 * The first line of the 'cmdline' file is the argv[0] passed to
     69                 * execv, which is what we're interested in... (Alternatively we
     70                 * could try readlink 'exe'. Check what happens to set-uid procs.)
    7071                 */
    71                 char *pszPath;
    72                 RTStrAPrintf(&pszPath, "/proc/%s/cmdline", DirEntry.szName);
    7372                PRTSTREAM pStream;
    74                 rc = RTStrmOpen(pszPath, "r", &pStream);
    75                 if(RT_SUCCESS(rc))
     73                rc = RTStrmOpenF("r", &pStream, "/proc/%s/cmdline", &DirEntry.szName[0]);
     74                if (RT_SUCCESS(rc))
    7675                {
    7776                    char szLine[RTPATH_MAX];
    78                     /*
    79                      * The fist line should be the application path always.
    80                      */
    81                     RTStrmGetLine(pStream, szLine, sizeof(szLine));
    82                     /*
    83                      * We are interested on the file name part only.
    84                      */
    85                     char *pszFilename = RTPathFilename(szLine);
    86                     if (RTStrCmp(pszFilename, pszName) == 0)
     77                    rc = RTStrmGetLine(pStream, szLine, sizeof(szLine));
     78                    RTStrmClose(pStream);
     79                    if (    RT_SUCCESS(rc)
     80                        ||  rc == VERR_BUFFER_OVERFLOW)
    8781                    {
    8882                        /*
    89                          * Clean up
     83                         * We are interested on the file name part only.
    9084                         */
    91                         RTStrmClose(pStream);
    92                         RTStrFree(pszPath);
    93                         RTDirClose(pDir);
    94                         return true;
     85                        char const *pszFilename = RTPathFilename(szLine);
     86                        if (RTStrCmp(pszFilename, pszName) == 0)
     87                        {
     88                            /* Found it! */
     89                            RTDirClose(pDir);
     90                            return true;
     91                        }
    9592                    }
    96                     RTStrmClose(pStream);
    9793                }
    98                 RTStrFree(pszPath);
    9994            }
    10095        }
  • trunk/src/VBox/Runtime/testcase/tstRTProcIsRunningByName.cpp

    r16999 r17011  
    2929 */
    3030
    31 
    3231/*******************************************************************************
    3332*   Header Files                                                               *
    3433*******************************************************************************/
     34#include <iprt/process.h>
    3535#include <iprt/initterm.h>
    3636#include <iprt/stream.h>
    3737#include <iprt/err.h>
    38 #include <iprt/process.h>
    3938#include <iprt/param.h>
    4039#include <iprt/path.h>
     
    4443int main(int argc, char **argv)
    4544{
     45    int cErrors = 0;
     46
    4647    RTR3Init();
     48    RTPrintf("tstRTPRocIsRunningByName: TESTING...\n");
    4749
     50    /*
     51     * Test 1: Check for a definitely not running process.
     52     */
    4853    int rc = VERR_GENERAL_FAILURE;
    49 
    5054    char szExecPath[RTPATH_MAX] = { "vbox-5b05e1ff-6ae2-4d10-885a-7d25018c4c5b" };
    51     /* Check for a definitely not running process. */
    52     RTPrintf("tstRTProcIsRunningByName: Searching for a not running process with the name %s...\n", szExecPath);
    5355    bool fRunning = RTProcIsRunningByName(szExecPath);
    5456    if (!fRunning)
     57        RTPrintf("tstRTProcIsRunningByName: Process '%s' is not running (expected).\n", szExecPath);
     58    else
    5559    {
    56         RTPrintf("tstRTProcIsRunningByName: Success!\n");
    57         rc = VINF_SUCCESS;
     60        RTPrintf("tstRTProcIsRunningByName: FAILURE - '%s' is running! (test 1)\n", szExecPath);
     61        cErrors++;
     62    }
     63
     64    /*
     65     * Test 2: Check for our own process.
     66     */
     67    if (RTProcGetExecutableName(szExecPath, RTPATH_MAX))
     68    {
     69        /* Strip any path components */
     70        char *pszFilename = RTPathFilename(szExecPath);
     71        if (pszFilename)
     72        {
     73            bool fRunning = RTProcIsRunningByName(pszFilename);
     74            if (fRunning)
     75                RTPrintf("tstRTProcIsRunningByName: Process '%s' (self) is running\n", pszFilename);
     76            else
     77            {
     78                RTPrintf("tstRTProcIsRunningByName: FAILURE - Process '%s' (self) is not running!\n", pszFilename);
     79                cErrors++;
     80            }
     81        }
     82        else
     83        {
     84            RTPrintf("tstRTProcIsRunningByName: FAILURE - RTPathFilename failed!\n");
     85            cErrors++;
     86        }
    5887    }
    5988    else
    60         RTPrintf("tstRTProcIsRunningByName: Expected failure but got success!\n");
    61     /* If the first test succeeded, check for a running process. For that we
    62      * use the name of this testcase. */
    63     if (RT_SUCCESS(rc))
    6489    {
    65         /* Reset */
    66         rc = VERR_GENERAL_FAILURE;
    67         if (RTProcGetExecutableName(szExecPath, RTPATH_MAX))
    68         {
    69             /* Strip any path components */
    70             char *pszFilename;
    71             if ((pszFilename = RTPathFilename(szExecPath)))
    72             {
    73                 RTPrintf("tstRTProcIsRunningByName: Searching for a running process with the name %s...\n", pszFilename);
    74                 bool fRunning = RTProcIsRunningByName(pszFilename);
    75                 if (fRunning)
    76                 {
    77                     RTPrintf("tstRTProcIsRunningByName: Success!\n");
    78                     rc = VINF_SUCCESS;
    79                 }
    80                 else
    81                     RTPrintf("tstRTProcIsRunningByName: Expected success but got failure!\n");
    82             }
    83             else
    84                 RTPrintf("tstRTProcIsRunningByName: RTPathFilename failed!\n", rc);
    85         }
    86         else
    87             RTPrintf("tstRTProcIsRunningByName: RTProcGetExecutableName failed!\n", rc);
     90        RTPrintf("tstRTProcIsRunningByName: FAILURE - RTProcGetExecutableName failed!\n");
     91        cErrors++;
    8892    }
    8993
    90     return RT_SUCCESS(rc) ? 0 : 1;
     94    /*
     95     * Summary.
     96     */
     97    if (!cErrors)
     98        RTPrintf("tstRTProcIsRunningByName: SUCCESS\n");
     99    else
     100        RTPrintf("tstRTProcIsRunningByName: FAILURE - %d errors\n", cErrors);
     101    return cErrors ? 1 : 0;
    91102}
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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