Author: bonefish Date: 2010-11-16 20:43:37 +0100 (Tue, 16 Nov 2010) New Revision: 39454 Changeset: http://dev.haiku-os.org/changeset/39454 Added: haiku/trunk/src/system/libroot/os/extended_system_info.cpp Log: Should have been part of r39453. The libroot implementation of get_extended_team_info(). Added: haiku/trunk/src/system/libroot/os/extended_system_info.cpp =================================================================== --- haiku/trunk/src/system/libroot/os/extended_system_info.cpp (rev 0) +++ haiku/trunk/src/system/libroot/os/extended_system_info.cpp 2010-11-16 19:43:37 UTC (rev 39454) @@ -0,0 +1,52 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@xxxxxxx + * 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