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:
parent
56d734a1aa
commit
698fcd85da
|
@ -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
|
Loading…
Reference in New Issue