* Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include <extended_system_info.h>
#include <extended_system_info_defs.h>
#include <syscalls.h>
#include <AutoDeleter.h>
#include <util/KMessage.h>
namespace BPrivate {
status_t
get_extended_team_info(team_id teamID, uint32 flags, KMessage& info)
{
size_t bufferSize = 4096;
while (true) {
void* buffer = malloc(bufferSize);
if (buffer == NULL)
return B_NO_MEMORY;
MemoryDeleter bufferDeleter(buffer);
size_t sizeNeeded;
status_t error = _kern_get_extended_team_info(teamID, flags, buffer,
bufferSize, &sizeNeeded);
if (error == B_OK) {
return info.SetTo((const void*)buffer, sizeNeeded,
KMessage::KMESSAGE_CLONE_BUFFER);
}
if (error != B_BUFFER_OVERFLOW)
return error;
bufferSize = (sizeNeeded + 1023) / 1024 * 1024;
}
}
}