- Timestamp:
- Jul 16, 2010 10:05:50 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 63701
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
r30048 r30870 232 232 rc = VERR_NOT_IMPLEMENTED; 233 233 #else 234 /** @todo Add utmpx support? */ 234 235 rc = utmpname(UTMP_FILE); 235 236 # ifdef RT_OS_SOLARIS … … 244 245 else 245 246 rc = VINF_SUCCESS; 247 246 248 setutent(); 247 249 utmp *ut_user; 250 uint32_t cUtmpEntries = 0; 251 252 /* Count all users to allocate a sufficient big array. */ 248 253 while ((ut_user = getutent())) 249 254 { 250 255 /* Make sure we don't add user names which are not 251 256 * part of type USER_PROCESS. */ 252 253 /** @todo Do we want to filter out user names? What if a user is logged in twice? */254 257 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)) 257 272 { 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]); 259 293 AssertRCBreakStmt(rc, RTStrFree(pszUserList)); 260 294 } 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. */ 267 305 #endif 268 306 Assert(RT_FAILURE(rc) || cUsersInList == 0 || (pszUserList && *pszUserList));
Note:
See TracChangeset
for help on using the changeset viewer.