VirtualBox

Changeset 31037 in vbox


Ignore:
Timestamp:
Jul 23, 2010 8:30:33 AM (15 years ago)
Author:
vboxsync
Message:

VBoxService/VMInfo: Bugs fixed.

File:
1 edited

Legend:

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

    r31000 r31037  
    225225    rc = VERR_NOT_IMPLEMENTED;
    226226# endif
     227
    227228#elif defined(RT_OS_FREEBSD)
    228229    /** @todo FreeBSD: Port logged on user info retrival. */
    229230    rc = VERR_NOT_IMPLEMENTED;
     231
    230232#elif defined(RT_OS_OS2)
    231233    /** @todo OS/2: Port logged on (LAN/local/whatever) user info retrival. */
    232234    rc = VERR_NOT_IMPLEMENTED;
     235
    233236#else
    234237    /** @todo Add utmpx support? */
     
    248251    setutent();
    249252    utmp *ut_user;
    250     uint32_t cUtmpEntries = 0;
    251253    uint32_t cListSize = 32;
    252254
    253255    /* Allocate a first array to hold 32 users max. */
    254     char **aUsers = (char**)RTMemAllocZ(cListSize * sizeof(char*));
    255     if (aUsers == NULL)
     256    char **papszUsers = (char **)RTMemAllocZ(cListSize * sizeof(char *));
     257    if (papszUsers == NULL)
    256258        rc = VERR_NO_MEMORY;
    257259
     
    260262           && RT_SUCCESS(rc))
    261263    {
    262         VBoxServiceVerbose(1, "bar: %s\n", ut_user->ut_user);
    263 
    264         if (cUtmpEntries > cListSize)
     264        VBoxServiceVerbose(4, "VMInfo: Found logged in user \"%s\"\n", ut_user->ut_user);
     265
     266        if (cUsersInList > cListSize)
    265267        {
    266268            cListSize += 32;
    267             aUsers = (char**)RTMemRealloc(aUsers, cListSize * sizeof(char*));
    268             AssertPtrBreakStmt(aUsers, rc = VERR_NO_MEMORY);
     269            void *pvNew = RTMemRealloc(papszUsers, cListSize * sizeof(char*));
     270            AssertPtrBreakStmt(pvNew, cListSize -= 32);
     271            papszUsers = (char **)pvNew;
    269272        }
    270273
     
    273276        if (ut_user->ut_type == USER_PROCESS)
    274277        {
    275             cUtmpEntries++;
    276 
    277278            bool fFound = false;
    278             for (uint32_t u = 0; u < cUsersInList && !fFound; u++)
    279                 fFound = (strcmp((const char*)aUsers[u], ut_user->ut_user) == 0) ? true : false;
     279            for (uint32_t i = 0; i < cUsersInList && !fFound; i++)
     280                fFound = strcmp(papszUsers[i], ut_user->ut_user) == 0;
    280281
    281282            if (!fFound)
    282                 rc = RTStrAAppend(&aUsers[cUsersInList++], (const char*)ut_user->ut_user);
    283         }
    284     }
    285 
    286     /* Build final user list. */
    287     for (uint32_t u = 0; u < cUsersInList; u++)
    288     {
    289         if (u > 0)
    290         {
    291             rc = RTStrAAppend(&pszUserList, ",");
    292             AssertRCBreakStmt(rc, RTStrFree(pszUserList));
    293         }
    294         rc = RTStrAAppend(&pszUserList, (const char*)aUsers[u]);
    295         AssertRCBreakStmt(rc, RTStrFree(pszUserList));
     283            {
     284                rc = RTStrDupEx(&papszUsers[cUsersInList], (const char *)ut_user->ut_user);
     285                if (RT_FAILURE(rc))
     286                    break;
     287                cUsersInList++;
     288            }
     289        }
     290    }
     291
     292    /* Calc the string length. */
     293    size_t cchUserList = 0;
     294    for (uint32_t i = 0; i < cUsersInList; i++)
     295        cchUserList += (i != 0) + strlen(papszUsers[i]);
     296
     297    /* Build the user list. */
     298    rc = RTStrAllocEx(&pszUserList, cchUserList + 1);
     299    if (RT_SUCCESS(rc))
     300    {
     301        char *psz = pszUserList;
     302        for (uint32_t i = 0; i < cUsersInList; i++)
     303        {
     304            if (i != 0)
     305                *psz++ = ',';
     306            size_t cch = strlen(papszUsers[i]);
     307            memcpy(psz, papszUsers[i], cch);
     308            psz += cch;
     309        }
     310        *psz = '\0';
    296311    }
    297312
    298313    /* Cleanup. */
    299     for (uint32_t u = 0; u < cUsersInList; u++)
    300         RTStrFree(aUsers[u]);
    301     RTMemFree(aUsers);
     314    for (uint32_t i = 0; i < cUsersInList; i++)
     315        RTStrFree(papszUsers[i]);
     316    RTMemFree(papszUsers);
    302317
    303318    endutent(); /* Close utmp file. */
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