Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/sysinfo.c

    r0499235 r9a426d1f  
    4040#include <bool.h>
    4141
    42 /** Get sysinfo keys size
    43  *
    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 keys
    57  *
    58  * @param path  Sysinfo path.
    59  * @param value Pointer to store the keys size.
    60  *
    61  * @return Keys read from sysinfo or NULL if the
    62  *         sysinfo item has no subkeys.
    63  *         The returned non-NULL pointer should be
    64  *         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 buffer
    72          * 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 
    10642/** Get sysinfo item type
    10743 *
     
    13470/** Get sysinfo binary data size
    13571 *
    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.
    13874 *
    13975 * @return EOK if the value was successfully read and
     
    14985/** Get sysinfo binary data
    15086 *
    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.
    15389 *
    15490 * @return Binary data read from sysinfo or NULL if the
     
    198134}
    199135
    200 /** Get sysinfo property
    201  *
    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 the
    207  *         sysinfo item value type is not binary data.
    208  *         The returned non-NULL pointer should be
    209  *         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 
    263136/** @}
    264137 */
Note: See TracChangeset for help on using the changeset viewer.