1 | /*␊ |
2 | * CoreHash usage example␊ |
3 | *␊ |
4 | */␊ |
5 | ␊ |
6 | #include "libsaio.h"␊ |
7 | #include "bootstruct.h"␊ |
8 | #include "pci.h"␊ |
9 | #include "platform.h"␊ |
10 | #include "cpu.h"␊ |
11 | #include "CoreHash.h"␊ |
12 | ␊ |
13 | ␊ |
14 | #ifndef DEBUG_PLATFORM␊ |
15 | #define DEBUG_PLATFORM 0␊ |
16 | #endif␊ |
17 | ␊ |
18 | #if DEBUG_PLATFORM␊ |
19 | #define DBG(x...)␉printf(x)␊ |
20 | #else␊ |
21 | #define DBG(x...)␊ |
22 | #endif␊ |
23 | ␊ |
24 | char *gboardproduct = NULL;␊ |
25 | char *gPlatformName = NULL;␊ |
26 | char *gRootDevice = NULL;␊ |
27 | ␊ |
28 | typedef enum envtype {␊ |
29 | kEnvPtr = 0,␊ |
30 | kEnvValue = 1␊ |
31 | } envtype;␊ |
32 | ␊ |
33 | struct env_struct {␊ |
34 | CoreHashHeader ␊ |
35 | ␉unsigned long value;␊ |
36 | ␉void * ptr;␊ |
37 | enum envtype Type;␊ |
38 | };␊ |
39 | ␊ |
40 | // CoreHash Declarations␊ |
41 | CHInitStr(env_struct)␊ |
42 | CHUnInit(env_struct)␊ |
43 | ␊ |
44 | static void CopyVarPtr (struct env_struct *var, void* ptr, size_t size);␊ |
45 | static struct env_struct *find_env(const char *name);␊ |
46 | static void _re_set_env_copy(struct env_struct *var , void* ptr,size_t size);␊ |
47 | struct env_struct *platform_env = NULL;␊ |
48 | ␊ |
49 | static void CopyVarPtr (struct env_struct *var, void* ptr, size_t size)␊ |
50 | {␊ |
51 | var->ptr = malloc(size);␊ |
52 | memcpy(var->ptr, ptr, size);␊ |
53 | }␊ |
54 | ␊ |
55 | static struct env_struct *find_env(const char *name) {␊ |
56 | ␊ |
57 | return env_struct_FindStrVar(name,platform_env);␊ |
58 | }␊ |
59 | ␊ |
60 | static void _re_set_env_copy(struct env_struct *var , void* ptr,size_t size) {␊ |
61 | ␊ |
62 | ␉if (var->Type == kEnvPtr) {␊ |
63 | ␉␉return ;␊ |
64 | ␉} ␊ |
65 | ␊ |
66 | if (var->ptr) {␊ |
67 | free(var->ptr);␊ |
68 | var->ptr = NULL;␊ |
69 | }␊ |
70 | ␊ |
71 | CopyVarPtr(var, ptr, size);␊ |
72 | ␉␊ |
73 | ␉return; ␊ |
74 | }␊ |
75 | ␊ |
76 | void re_set_env_copy(const char *name , void* ptr,size_t size) {␊ |
77 | ␉struct env_struct *var;␊ |
78 | ␊ |
79 | ␉var = find_env(name);␊ |
80 | ␉if (!var|| (var->Type == kEnvPtr)) {␊ |
81 | ␉␉printf("Unable to find environement variable %s\n",name);␊ |
82 | ␉␉return ;␊ |
83 | ␉} ␊ |
84 | ␊ |
85 | _re_set_env_copy(var , ptr, size);␊ |
86 | ␉␊ |
87 | ␉return; ␊ |
88 | }␊ |
89 | ␊ |
90 | static void _set_env(const char *name, unsigned long value, enum envtype Type, void* ptr, size_t size ) {␊ |
91 | struct env_struct *var;␊ |
92 | ␊ |
93 | var = env_struct_NewStrVar(name, &platform_env);␊ |
94 | ␉if (!var) {␊ |
95 | ␉␉return;␊ |
96 | ␉}␊ |
97 | if (Type == kEnvPtr) {␊ |
98 | CopyVarPtr( var, ptr, size);␊ |
99 | } ␊ |
100 | else if (Type == kEnvValue) ␊ |
101 | var->value = value;␊ |
102 | else␊ |
103 | return;␊ |
104 | ␊ |
105 | var->Type = Type; ␊ |
106 | ␊ |
107 | }␊ |
108 | ␊ |
109 | /* Warning: set_env will create a new variable each time it will be called, ␊ |
110 | * if you want to set again an existing variable, please use safe_set_env or re_set_env .␊ |
111 | * NOTE: If you set several times the "same variable" by using this function,␊ |
112 | * the HASH_COUNT will grow up, ␊ |
113 | * but hopefully find_env will return the last variable that you have set with the same name␊ |
114 | * ex: set_env("test",10);␊ |
115 | * set_env("test",20);␊ |
116 | *␊ |
117 | * HASH_COUNT will be equal to 2, get_env("test") will return 20␊ |
118 | *␊ |
119 | * safe_set_env("test",10);␊ |
120 | * safe_set_env("test",20);␊ |
121 | * ␊ |
122 | * HASH_COUNT will be equal to 1, get_env("test") will return 20␊ |
123 | *␊ |
124 | * set_env("test",10);␊ |
125 | * re_set_env("test",20);␊ |
126 | *␊ |
127 | * HASH_COUNT will be equal to 1, get_env("test") will return 20␊ |
128 | *␊ |
129 | */␊ |
130 | void set_env(const char *name, unsigned long value ) {␊ |
131 | _set_env(name, value, kEnvValue,0,0);␊ |
132 | }␊ |
133 | ␊ |
134 | void set_env_copy(const char *name, void * ptr, size_t size ) {␊ |
135 | _set_env(name, 0, kEnvPtr,ptr,size);␊ |
136 | }␊ |
137 | ␊ |
138 | unsigned long get_env_var(const char *name) {␊ |
139 | ␉struct env_struct *var;␊ |
140 | ␊ |
141 | ␉var = find_env(name);␊ |
142 | ␉if (!var) {␊ |
143 | ␉␉printf("Unable to find environement variable %s\n",name);␊ |
144 | ␉␉return 0;␊ |
145 | ␉}␊ |
146 | ␊ |
147 | if (var->Type != kEnvValue) {␊ |
148 | printf("Variable %s is not a value\n",name);␊ |
149 | return 0;␊ |
150 | }␊ |
151 | ␉␊ |
152 | ␉return var->value;␊ |
153 | ␊ |
154 | }␊ |
155 | ␊ |
156 | unsigned long get_env(const char *name) {␉␊ |
157 | ␉␊ |
158 | ␉return get_env_var(name);␊ |
159 | ␊ |
160 | }␊ |
161 | ␊ |
162 | void * get_env_ptr(const char *name) {␊ |
163 | ␉struct env_struct *var;␊ |
164 | ␊ |
165 | ␉var = find_env(name);␊ |
166 | ␉if (!var) {␊ |
167 | ␉␉printf("Unable to get environement ptr variable %s\n",name);␊ |
168 | ␉␉return 0;␊ |
169 | ␉}␊ |
170 | ␊ |
171 | if (var->Type != kEnvPtr) {␊ |
172 | printf("Variable %s is not a ptr\n",name);␊ |
173 | return 0;␊ |
174 | }␊ |
175 | ␉␊ |
176 | ␉return var->ptr;␊ |
177 | ␊ |
178 | }␊ |
179 | ␊ |
180 | /* If no specified variable exist, safe_set_env will create one, else it only modify the value */␊ |
181 | static void _safe_set_env(const char *name, unsigned long long value, enum envtype Type, void* ptr, size_t size )␊ |
182 | {␊ |
183 | ␉struct env_struct *var;␊ |
184 | ␊ |
185 | ␉var = find_env(name);␊ |
186 | ␊ |
187 | if (!var) {␊ |
188 | if (Type == kEnvPtr) {␊ |
189 | _set_env(name, 0, kEnvPtr,ptr,size);␊ |
190 | } ␊ |
191 | else if (Type == kEnvValue) {␊ |
192 | _set_env(name, value, kEnvValue,0,0);␊ |
193 | }␊ |
194 | } ␊ |
195 | else if (var->Type != Type) {␊ |
196 | return; ␊ |
197 | ␉} ␊ |
198 | else {␊ |
199 | if (Type == kEnvValue) ␊ |
200 | var->value = value;␊ |
201 | else if (Type == kEnvPtr)␊ |
202 | _re_set_env_copy(var,ptr,size); ␊ |
203 | }␊ |
204 | ␉␊ |
205 | ␉return; ␊ |
206 | }␊ |
207 | ␊ |
208 | void safe_set_env_copy(const char *name , void * ptr, size_t size ) {␊ |
209 | ␊ |
210 | _safe_set_env(name, 0, kEnvPtr,ptr,size);␊ |
211 | ␉␊ |
212 | ␉return; ␊ |
213 | }␊ |
214 | ␊ |
215 | void safe_set_env(const char *name , unsigned long value) {␊ |
216 | ␊ |
217 | _safe_set_env(name, value, kEnvValue,0,0);␊ |
218 | ␉␊ |
219 | ␉return; ␊ |
220 | }␊ |
221 | ␊ |
222 | void re_set_env(const char *name , unsigned long value) {␊ |
223 | ␉struct env_struct *var;␊ |
224 | ␊ |
225 | ␉var = find_env(name);␊ |
226 | ␉if (!var || (var->Type != kEnvValue)/* kEnvPtr currently unsupported */) {␊ |
227 | ␉␉printf("Unable to reset environement value variable %s\n",name);␊ |
228 | ␉␉return ;␊ |
229 | ␉} ␊ |
230 | ␊ |
231 | var->value = value;␊ |
232 | ␉␊ |
233 | ␉return; ␊ |
234 | }␊ |
235 | ␊ |
236 | void unset_env(const char *name) {␊ |
237 | ␉env_struct_DeleteStrVar(name, platform_env); ␊ |
238 | }␊ |
239 | ␊ |
240 | void free_platform_env(void) {␊ |
241 | env_struct_DeleteAll(platform_env ); ␊ |
242 | } |