VirtualBox

Changeset 30870 in vbox for trunk/src


Ignore:
Timestamp:
Jul 16, 2010 10:05:50 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
63701
Message:

VBoxService/VMInfo: Rewrote utmp lookup (now takes redundant user names into account).

File:
1 edited

Legend:

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

    r30048 r30870  
    232232    rc = VERR_NOT_IMPLEMENTED;
    233233#else
     234    /** @todo Add utmpx support? */
    234235    rc = utmpname(UTMP_FILE);
    235236# ifdef RT_OS_SOLARIS
     
    244245    else
    245246        rc = VINF_SUCCESS;
     247
    246248    setutent();
    247249    utmp *ut_user;
     250    uint32_t cUtmpEntries = 0;
     251
     252    /* Count all users to allocate a sufficient big array. */
    248253    while ((ut_user = getutent()))
    249254    {
    250255        /* Make sure we don't add user names which are not
    251256         * part of type USER_PROCESS. */
    252 
    253         /** @todo Do we want to filter out user names? What if a user is logged in twice? */
    254257        if (ut_user->ut_type == USER_PROCESS)
    255         {
    256             if (cUsersInList > 0)
     258            cUtmpEntries++;
     259    }
     260
     261    if (cUtmpEntries) /* Do we have some users at all? */
     262    {
     263        setutent(); /* Rewind utmp file pointer to start from beginning. */
     264
     265        /* Build up array with logged in users. */
     266        char *aUsers = RTMemAlloc(cUtmpEntries * sizeof(char*));
     267        if (aUsers)
     268        {
     269            /* Store user in array. */
     270            while (   (ut_user = getutent())
     271                   && RT_SUCCESS(rc))
    257272            {
    258                 rc = RTStrAAppend(&pszUserList, ",");
     273                if (ut_user->ut_type == USER_PROCESS)
     274                {
     275                    bool fFound = false;
     276                    for (uint32_t u = 0; u < cUsersInList && !fFound; u++)
     277                        fFound = (strcmp(aUsers[u], ut_user->ut_user) == 0) ? true : false;
     278
     279                    if (!fFound)
     280                        rc = RTStrAAppend(aUsers[cUsersInList++], ut_user->ut_user);
     281                }
     282            }
     283
     284            /* Build final user list. */
     285            for (uint32_t u = 0; u < cUsersInList; u++)
     286            {
     287                if (u > 0)
     288                {
     289                    rc = RTStrAAppend(&pszUserList, ",");
     290                    AssertRCBreakStmt(rc, RTStrFree(pszUserList));
     291                }
     292                rc = RTStrAAppend(&pszUserList, aUsers[u]);
    259293                AssertRCBreakStmt(rc, RTStrFree(pszUserList));
    260294            }
    261             rc = RTStrAAppend(&pszUserList, ut_user->ut_user);
    262             AssertRCBreakStmt(rc, RTStrFree(pszUserList));
    263             cUsersInList++;
    264         }
    265     }
    266     endutent();
     295
     296            /* Cleanup. */
     297            for (uint32_t u = 0; u < cUsersInList; u++)
     298                RTStrFree(aUsers[u]);
     299            RTMemFree(aUsers);
     300        }
     301        else
     302            rc = VERR_NO_MEMORY;
     303    }
     304    endutent(); /* Close utmp file. */
    267305#endif
    268306    Assert(RT_FAILURE(rc) || cUsersInList == 0 || (pszUserList && *pszUserList));
Note: See TracChangeset for help on using the changeset viewer.

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