Changeset 0499235 in mainline
- Timestamp:
- 2012-03-02T17:20:23Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5608deba, 98cb0495, c30a015
- Parents:
- 3113d47
- Location:
- uspace
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sysinfo/sysinfo.c
r3113d47 r0499235 92 92 } 93 93 94 static int print_item_property(char *ipath, char *iprop) 95 { 96 size_t size; 97 void *data = sysinfo_get_property(ipath, iprop, &size); 98 if (data == NULL) { 99 printf("Error reading property '%s' of item '%s'.\n", iprop, 100 ipath); 101 return -1; 102 } 103 104 printf("%s property %s -> ", ipath, iprop); 105 dump_bytes_hex(data, size); 106 fputs(" ('", stdout); 107 dump_bytes_text(data, size); 108 fputs("')\n", stdout); 109 110 return EOK; 111 } 112 94 113 static void print_spaces(size_t spaces) 95 114 { … … 143 162 int main(int argc, char *argv[]) 144 163 { 145 if (argc != 2) { 164 int rc = 0; 165 166 if (argc < 2) { 146 167 /* Print keys */ 147 168 print_keys("", 0); 148 return 0;169 return rc; 149 170 } 150 171 151 172 char *ipath = argv[1]; 152 sysinfo_item_val_type_t tag = sysinfo_get_val_type(ipath); 153 154 /* Silence warning */ 155 int rc = 0; 156 157 switch (tag) { 158 case SYSINFO_VAL_UNDEFINED: 159 printf("Error: Sysinfo item '%s' not defined.\n", ipath); 160 rc = 2; 161 break; 162 case SYSINFO_VAL_VAL: 163 rc = print_item_val(ipath); 164 break; 165 case SYSINFO_VAL_DATA: 166 rc = print_item_data(ipath); 167 break; 168 default: 169 printf("Error: Sysinfo item '%s' with unknown value type.\n", 170 ipath); 171 rc = 2; 172 break; 173 } 174 173 174 if (argc < 3) { 175 sysinfo_item_val_type_t tag = sysinfo_get_val_type(ipath); 176 177 switch (tag) { 178 case SYSINFO_VAL_UNDEFINED: 179 printf("Error: Sysinfo item '%s' not defined.\n", ipath); 180 rc = 2; 181 break; 182 case SYSINFO_VAL_VAL: 183 rc = print_item_val(ipath); 184 break; 185 case SYSINFO_VAL_DATA: 186 rc = print_item_data(ipath); 187 break; 188 default: 189 printf("Error: Sysinfo item '%s' with unknown value type.\n", 190 ipath); 191 rc = 2; 192 break; 193 } 194 195 return rc; 196 } 197 198 char *iprop = argv[2]; 199 rc = print_item_property(ipath, iprop); 175 200 return rc; 176 201 } -
uspace/lib/c/generic/sysinfo.c
r3113d47 r0499235 134 134 /** Get sysinfo binary data size 135 135 * 136 * @param path 137 * @param value Pointer to store the binary data size.136 * @param path Sysinfo path. 137 * @param size Pointer to store the binary data size. 138 138 * 139 139 * @return EOK if the value was successfully read and … … 149 149 /** Get sysinfo binary data 150 150 * 151 * @param path 152 * @param value Pointer to store the binary data size.151 * @param path Sysinfo path. 152 * @param size Pointer to store the binary data size. 153 153 * 154 154 * @return Binary data read from sysinfo or NULL if the … … 198 198 } 199 199 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 200 263 /** @} 201 264 */ -
uspace/lib/c/include/sysinfo.h
r3113d47 r0499235 44 44 extern int sysinfo_get_value(const char *, sysarg_t *); 45 45 extern void *sysinfo_get_data(const char *, size_t *); 46 extern void *sysinfo_get_property(const char *, const char *, size_t *); 46 47 47 48 #endif
Note:
See TracChangeset
for help on using the changeset viewer.