1/*
2 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <extended_system_info.h>
8#include <extended_system_info_defs.h>
9
10#include <syscalls.h>
11#include <AutoDeleter.h>
12
13#include <util/KMessage.h>
14
15
16namespace BPrivate {
17
18
19status_t
20get_extended_team_info(team_id teamID, uint32 flags, KMessage& info)
21{
22	// initial buffer size
23	size_t bufferSize = 4096;
24		// TODO: Pick it depending on the set flags.
25
26	while (true) {
27		// allocate the buffer
28		void* buffer = malloc(bufferSize);
29		if (buffer == NULL)
30			return B_NO_MEMORY;
31		MemoryDeleter bufferDeleter(buffer);
32
33		// get the info
34		size_t sizeNeeded;
35		status_t error = _kern_get_extended_team_info(teamID, flags, buffer,
36			bufferSize, &sizeNeeded);
37		if (error == B_OK) {
38			return info.SetTo((const void*)buffer, sizeNeeded,
39				KMessage::KMESSAGE_CLONE_BUFFER);
40				// TODO: Just transfer our buffer, if it isn't much larger.
41		}
42
43		if (error != B_BUFFER_OVERFLOW)
44			return error;
45
46		// The buffer was too small. Try again with a larger one.
47		bufferSize = (sizeNeeded + 1023) / 1024 * 1024;
48	}
49}
50
51
52}	// namespace BPrivate
53