From 698fcd85da20830527aa3da3791c54b35c6c9aa4 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 16 Nov 2010 19:43:37 +0000 Subject: [PATCH] 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 --- .../libroot/os/extended_system_info.cpp | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/system/libroot/os/extended_system_info.cpp diff --git a/src/system/libroot/os/extended_system_info.cpp b/src/system/libroot/os/extended_system_info.cpp new file mode 100644 index 0000000000..ff61ae7611 --- /dev/null +++ b/src/system/libroot/os/extended_system_info.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include +#include + +#include +#include + +#include + + +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