Should have been part of r39453. The libroot implementation of

get_extended_team_info().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39454 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2010-11-16 19:43:37 +00:00
parent 56d734a1aa
commit 698fcd85da
1 changed files with 52 additions and 0 deletions

View File

@ -0,0 +1,52 @@
/*
* 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)
{
// initial buffer size
size_t bufferSize = 4096;
// TODO: Pick it depending on the set flags.
while (true) {
// allocate the buffer
void* buffer = malloc(bufferSize);
if (buffer == NULL)
return B_NO_MEMORY;
MemoryDeleter bufferDeleter(buffer);
// get the info
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);
// TODO: Just transfer our buffer, if it isn't much larger.
}
if (error != B_BUFFER_OVERFLOW)
return error;
// The buffer was too small. Try again with a larger one.
bufferSize = (sizeNeeded + 1023) / 1024 * 1024;
}
}
} // namespace BPrivate