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:
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010, Ingo Weinhold, [email protected].
|
||||||
|
* 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
|
||||||
Reference in New Issue
Block a user