Changes in uspace/lib/c/generic/sysinfo.c [0499235:9a426d1f] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/sysinfo.c
r0499235 r9a426d1f 40 40 #include <bool.h> 41 41 42 /** Get sysinfo keys size43 *44 * @param path Sysinfo path.45 * @param value Pointer to store the keys size.46 *47 * @return EOK if the keys were successfully read.48 *49 */50 static int sysinfo_get_keys_size(const char *path, size_t *size)51 {52 return (int) __SYSCALL3(SYS_SYSINFO_GET_KEYS_SIZE, (sysarg_t) path,53 (sysarg_t) str_size(path), (sysarg_t) size);54 }55 56 /** Get sysinfo keys57 *58 * @param path Sysinfo path.59 * @param value Pointer to store the keys size.60 *61 * @return Keys read from sysinfo or NULL if the62 * sysinfo item has no subkeys.63 * The returned non-NULL pointer should be64 * freed by free().65 *66 */67 char *sysinfo_get_keys(const char *path, size_t *size)68 {69 /*70 * The size of the keys might change during time.71 * Unfortunatelly we cannot allocate the buffer72 * and transfer the keys as a single atomic operation.73 */74 75 /* Get the keys size */76 int ret = sysinfo_get_keys_size(path, size);77 if ((ret != EOK) || (size == 0)) {78 /*79 * Item with no subkeys.80 */81 *size = 0;82 return NULL;83 }84 85 char *data = malloc(*size);86 if (data == NULL) {87 *size = 0;88 return NULL;89 }90 91 /* Get the data */92 size_t sz;93 ret = __SYSCALL5(SYS_SYSINFO_GET_KEYS, (sysarg_t) path,94 (sysarg_t) str_size(path), (sysarg_t) data, (sysarg_t) *size,95 (sysarg_t) &sz);96 if (ret == EOK) {97 *size = sz;98 return data;99 }100 101 free(data);102 *size = 0;103 return NULL;104 }105 106 42 /** Get sysinfo item type 107 43 * … … 134 70 /** Get sysinfo binary data size 135 71 * 136 * @param path Sysinfo path.137 * @param size Pointer to store the binary data size.72 * @param path Sysinfo path. 73 * @param value Pointer to store the binary data size. 138 74 * 139 75 * @return EOK if the value was successfully read and … … 149 85 /** Get sysinfo binary data 150 86 * 151 * @param path Sysinfo path.152 * @param size Pointer to store the binary data size.87 * @param path Sysinfo path. 88 * @param value Pointer to store the binary data size. 153 89 * 154 90 * @return Binary data read from sysinfo or NULL if the … … 198 134 } 199 135 200 /** Get sysinfo property201 *202 * @param path Sysinfo path.203 * @param name Property name.204 * @param size Pointer to store the binary data size.205 *206 * @return Property value read from sysinfo or NULL if the207 * sysinfo item value type is not binary data.208 * The returned non-NULL pointer should be209 * freed by free().210 *211 */212 void *sysinfo_get_property(const char *path, const char *name, size_t *size)213 {214 size_t total_size;215 void *data = sysinfo_get_data(path, &total_size);216 if ((data == NULL) || (total_size == 0)) {217 *size = 0;218 return NULL;219 }220 221 size_t pos = 0;222 while (pos < total_size) {223 /* Process each property with sanity checks */224 size_t cur_size = str_nsize(data + pos, total_size - pos);225 if (((char *) data)[pos + cur_size] != 0)226 break;227 228 bool found = (str_cmp(data + pos, name) == 0);229 230 pos += cur_size + 1;231 if (pos >= total_size)232 break;233 234 /* Process value size */235 size_t value_size;236 memcpy(&value_size, data + pos, sizeof(value_size));237 238 pos += sizeof(value_size);239 if ((pos >= total_size) || (pos + value_size > total_size))240 break;241 242 if (found) {243 void *value = malloc(value_size);244 if (value == NULL)245 break;246 247 memcpy(value, data + pos, value_size);248 free(data);249 250 *size = value_size;251 return value;252 }253 254 pos += value_size;255 }256 257 free(data);258 259 *size = 0;260 return NULL;261 }262 263 136 /** @} 264 137 */
Note:
See TracChangeset
for help on using the changeset viewer.