Changeset 31037 in vbox
- Timestamp:
- Jul 23, 2010 8:30:33 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
r31000 r31037 225 225 rc = VERR_NOT_IMPLEMENTED; 226 226 # endif 227 227 228 #elif defined(RT_OS_FREEBSD) 228 229 /** @todo FreeBSD: Port logged on user info retrival. */ 229 230 rc = VERR_NOT_IMPLEMENTED; 231 230 232 #elif defined(RT_OS_OS2) 231 233 /** @todo OS/2: Port logged on (LAN/local/whatever) user info retrival. */ 232 234 rc = VERR_NOT_IMPLEMENTED; 235 233 236 #else 234 237 /** @todo Add utmpx support? */ … … 248 251 setutent(); 249 252 utmp *ut_user; 250 uint32_t cUtmpEntries = 0;251 253 uint32_t cListSize = 32; 252 254 253 255 /* 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) 256 258 rc = VERR_NO_MEMORY; 257 259 … … 260 262 && RT_SUCCESS(rc)) 261 263 { 262 VBoxServiceVerbose( 1, "bar: %s\n", ut_user->ut_user);263 264 if (cU tmpEntries> cListSize)264 VBoxServiceVerbose(4, "VMInfo: Found logged in user \"%s\"\n", ut_user->ut_user); 265 266 if (cUsersInList > cListSize) 265 267 { 266 268 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; 269 272 } 270 273 … … 273 276 if (ut_user->ut_type == USER_PROCESS) 274 277 { 275 cUtmpEntries++;276 277 278 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; 280 281 281 282 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'; 296 311 } 297 312 298 313 /* 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); 302 317 303 318 endutent(); /* Close utmp file. */
Note:
See TracChangeset
for help on using the changeset viewer.