source: mainline/generic/src/sysinfo/sysinfo.c@ 6eb96fce

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 6eb96fce was 749122b, checked in by Martin Decky <martin@…>, 19 years ago

fix conding style, make it compile again

  • Property mode set to 100644
File size: 7.7 KB
Line 
1/*
2 * Copyright (C) 2006 Jakub Vana
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sysinfo/sysinfo.h>
30#include <mm/slab.h>
31#include <print.h>
32#include <syscall/copy.h>
33
34sysinfo_item_t *_root = NULL;
35
36
37static sysinfo_item_t *sysinfo_find_item(const char *name, sysinfo_item_t *subtree)
38{
39 if (subtree == NULL)
40 return NULL;
41
42 while (subtree != NULL) {
43 int i = 0;
44 char *a = (char *) name;
45 char *b = subtree->name;
46
47 while ((a[i] == b[i]) && (b[i]))
48 i++;
49
50 if ((!a[i]) && (!b[i])) /* Last name in path matches */
51 return subtree;
52
53 if ((a[i] == '.') && (!b[i])) { /* Middle name in path matches */
54 if (subtree->subinfo_type == SYSINFO_SUBINFO_TABLE)
55 return sysinfo_find_item(a + i + 1, subtree->subinfo.table);
56
57 //if (subtree->subinfo_type == SYSINFO_SUBINFO_FUNCTION) /* Subinfo managed by subsystem */
58 // return NULL;
59
60 return NULL; /* No subinfo */
61 }
62 /* No matches try next */
63 subtree = subtree->next;
64 i = 0;
65 }
66 return NULL;
67}
68
69static sysinfo_item_t *sysinfo_create_path(const char *name, sysinfo_item_t **psubtree)
70{
71 sysinfo_item_t *subtree;
72 subtree = *psubtree;
73
74 if (subtree == NULL) {
75 sysinfo_item_t *item = malloc(sizeof(sysinfo_item_t), 0);
76 int i = 0, j;
77
78 ASSERT(item);
79 *psubtree = item;
80 item->next = NULL;
81 item->val_type = SYSINFO_VAL_UNDEFINED;
82 item->subinfo.table = NULL;
83
84 while (name[i] && (name[i] != '.'))
85 i++;
86
87 item->name = malloc(i, 0);
88 ASSERT(item->name);
89
90 for (j = 0; j < i; j++)
91 item->name[j] = name[j];
92 item->name[j] = 0;
93
94 if (name[i]) { /* =='.' */
95 item->subinfo_type = SYSINFO_SUBINFO_TABLE;
96 return sysinfo_create_path(name + i + 1, &(item->subinfo.table));
97 }
98 item->subinfo_type = SYSINFO_SUBINFO_NONE;
99 return item;
100 }
101
102 while (subtree != NULL) {
103 int i = 0, j;
104 char *a = (char *) name;
105 char *b = subtree->name;
106
107 while ((a[i] == b[i]) && (b[i]))
108 i++;
109
110 if ((!a[i]) && (!b[i])) /* Last name in path matches */
111 return subtree;
112
113 if ((a[i] == '.') && (!b[i])) { /* Middle name in path matches */
114 if (subtree->subinfo_type == SYSINFO_SUBINFO_TABLE)
115 return sysinfo_create_path(a + i + 1, &(subtree->subinfo.table));
116
117 if (subtree->subinfo_type == SYSINFO_SUBINFO_NONE) {
118 subtree->subinfo_type = SYSINFO_SUBINFO_TABLE;
119 return sysinfo_create_path(a + i + 1,&(subtree->subinfo.table));
120 }
121
122 //if (subtree->subinfo_type == SYSINFO_SUBINFO_FUNCTION) /* Subinfo managed by subsystem */
123 // return NULL;
124
125 return NULL;
126 }
127 /* No matches try next or create new*/
128 if (subtree->next == NULL) {
129 sysinfo_item_t *item = malloc(sizeof(sysinfo_item_t), 0);
130
131 ASSERT(item);
132 subtree->next = item;
133 item->next = NULL;
134 item->val_type = SYSINFO_VAL_UNDEFINED;
135 item->subinfo.table = NULL;
136
137 i = 0;
138 while (name[i] && (name[i] != '.'))
139 i++;
140
141 item->name = malloc(i, 0);
142 ASSERT(item->name);
143
144 for (j = 0; j < i; j++)
145 item->name[j] = name[j];
146
147 item->name[j] = 0;
148
149 if(name[i]) { /* =='.' */
150 item->subinfo_type = SYSINFO_SUBINFO_TABLE;
151 return sysinfo_create_path(name + i + 1, &(item->subinfo.table));
152 }
153 item->subinfo_type = SYSINFO_SUBINFO_NONE;
154 return item;
155 } else {
156 subtree = subtree->next;
157 i = 0;
158 }
159 }
160 panic("Not reached\n");
161 return NULL;
162}
163
164void sysinfo_set_item_val(const char *name, sysinfo_item_t **root, __native val)
165{
166 if (root == NULL)
167 root = &_root;
168
169 /* If already created create only returns pointer
170 If not, create it */
171 sysinfo_item_t *item = sysinfo_create_path(name, root);
172
173 if (item != NULL) { /* If in subsystem, unable to create or return so unable to set */
174 item->val.val=val;
175 item->val_type = SYSINFO_VAL_VAL;
176 }
177}
178
179void sysinfo_set_item_function(const char *name, sysinfo_item_t **root, sysinfo_val_fn_t fn)
180{
181 if (root == NULL)
182 root = &_root;
183
184 /* If already created create only returns pointer
185 If not, create it */
186 sysinfo_item_t *item = sysinfo_create_path(name, root);
187
188 if (item != NULL) { /* If in subsystem, unable to create or return so unable to set */
189 item->val.fn=fn;
190 item->val_type = SYSINFO_VAL_FUNCTION;
191 }
192}
193
194
195void sysinfo_set_item_undefined(const char *name, sysinfo_item_t **root)
196{
197 if (root == NULL)
198 root = &_root;
199
200 /* If already created create only returns pointer
201 If not, create it */
202 sysinfo_item_t *item = sysinfo_create_path(name, root);
203
204 if (item != NULL)
205 item->val_type = SYSINFO_VAL_UNDEFINED;
206}
207
208
209void sysinfo_dump(sysinfo_item_t **proot, int depth)
210{
211 sysinfo_item_t *root;
212 if (proot == NULL)
213 proot = &_root;
214
215 root = *proot;
216
217 while (root != NULL) {
218 int i;
219 __native val = 0;
220 char *vtype = NULL;
221
222
223 for (i = 0; i < depth; i++)
224 printf(" ");
225
226 switch (root->val_type) {
227 case SYSINFO_VAL_UNDEFINED:
228 val = 0;
229 vtype = "UND";
230 break;
231 case SYSINFO_VAL_VAL:
232 val = root->val.val;
233 vtype = "VAL";
234 break;
235 case SYSINFO_VAL_FUNCTION:
236 val = ((sysinfo_val_fn_t) (root->val.fn)) (root);
237 vtype = "FUN";
238 break;
239 }
240
241 printf("%s %s val:%d(%X) sub:%s\n", root->name, vtype, val, val, (root->subinfo_type == SYSINFO_SUBINFO_NONE) ? "NON" : ((root->subinfo_type == SYSINFO_SUBINFO_TABLE) ? "TAB" : "FUN"));
242
243 if (root->subinfo_type == SYSINFO_SUBINFO_TABLE)
244 sysinfo_dump(&(root -> subinfo.table), depth + 1);
245
246 root = root->next;
247 }
248}
249
250sysinfo_rettype_t sysinfo_get_val(const char *name, sysinfo_item_t **root)
251{
252 // TODO: Implement Subsystem subinfo (by function implemented subinfo)
253
254 sysinfo_rettype_t ret = {0, false};
255
256 if (root == NULL)
257 root = &_root;
258
259 sysinfo_item_t *item = sysinfo_find_item(name, *root);
260
261 if (item != NULL) {
262 if (item->val_type == SYSINFO_VAL_UNDEFINED)
263 return ret;
264 else
265 ret.valid = true;
266
267 if (item->val_type == SYSINFO_VAL_VAL)
268 ret.val = item->val.val;
269 else
270 ret.val = ((sysinfo_val_fn_t) (item->val.fn)) (item);
271 }
272 return ret;
273}
274
275__native sys_sysinfo_valid(__native ptr, __native len)
276{
277 char *str;
278 sysinfo_rettype_t ret = {0, 0};
279 str = malloc(len + 1, 0);
280
281 ASSERT(str);
282 if (!((copy_from_uspace(str, (void *) ptr, len + 1)) || (str[len])))
283 ret = sysinfo_get_val(str, NULL);
284
285 free(str);
286 return ret.valid;
287}
288
289__native sys_sysinfo_value(__native ptr, __native len)
290{
291 char *str;
292 sysinfo_rettype_t ret = {0, 0};
293 str = malloc(len + 1, 0);
294
295 ASSERT(str);
296 if (!((copy_from_uspace(str, (void *) ptr, len + 1)) || (str[len])))
297 ret = sysinfo_get_val(str, NULL);
298
299 free(str);
300 return ret.val;
301}
Note: See TracBrowser for help on using the repository browser.