[haiku-commits] r39454 - haiku/trunk/src/system/libroot/os

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 16 Nov 2010 20:43:37 +0100 (CET)

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


Other related posts:

  • » [haiku-commits] r39454 - haiku/trunk/src/system/libroot/os - ingo_weinhold