Index: uspace/lib/c/generic/sysinfo.c
===================================================================
--- uspace/lib/c/generic/sysinfo.c	(revision 76f382b9b45e8460f46017535a7dbebc23d9e5e1)
+++ uspace/lib/c/generic/sysinfo.c	(revision 4d194beedbc53e41134a652c4e3d8be31fecff2b)
@@ -134,6 +134,6 @@
 /** Get sysinfo binary data size
  *
- * @param path  Sysinfo path.
- * @param value Pointer to store the binary data size.
+ * @param path Sysinfo path.
+ * @param size Pointer to store the binary data size.
  *
  * @return EOK if the value was successfully read and
@@ -149,6 +149,6 @@
 /** Get sysinfo binary data
  *
- * @param path  Sysinfo path.
- * @param value Pointer to store the binary data size.
+ * @param path Sysinfo path.
+ * @param size Pointer to store the binary data size.
  *
  * @return Binary data read from sysinfo or NULL if the
@@ -198,4 +198,67 @@
 }
 
+/** Get sysinfo property
+ *
+ * @param path Sysinfo path.
+ * @param name Property name.
+ * @param size Pointer to store the binary data size.
+ *
+ * @return Property value read from sysinfo or NULL if the
+ *         sysinfo item value type is not binary data.
+ *         The returned non-NULL pointer should be
+ *         freed by free().
+ *
+ */
+void *sysinfo_get_property(const char *path, const char *name, size_t *size)
+{
+	size_t total_size;
+	void *data = sysinfo_get_data(path, &total_size);
+	if ((data == NULL) || (total_size == 0)) {
+		*size = 0;
+		return NULL;
+	}
+	
+	size_t pos = 0;
+	while (pos < total_size) {
+		/* Process each property with sanity checks */
+		size_t cur_size = str_nsize(data + pos, total_size - pos);
+		if (((char *) data)[pos + cur_size] != 0)
+			break;
+		
+		bool found = (str_cmp(data + pos, name) == 0);
+		
+		pos += cur_size + 1;
+		if (pos >= total_size)
+			break;
+		
+		/* Process value size */
+		size_t value_size;
+		memcpy(&value_size, data + pos, sizeof(value_size));
+		
+		pos += sizeof(value_size);
+		if ((pos >= total_size) || (pos + value_size > total_size))
+			break;
+		
+		if (found) {
+			void *value = malloc(value_size);
+			if (value == NULL)
+				break;
+			
+			memcpy(value, data + pos, value_size);
+			free(data);
+			
+			*size = value_size;
+			return value;
+		}
+		
+		pos += value_size;
+	}
+	
+	free(data);
+	
+	*size = 0;
+	return NULL;
+}
+
 /** @}
  */
