summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/conf/conf_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/conf/conf_api.c')
-rw-r--r--src/lib/libcrypto/conf/conf_api.c134
1 files changed, 63 insertions, 71 deletions
diff --git a/src/lib/libcrypto/conf/conf_api.c b/src/lib/libcrypto/conf/conf_api.c
index 909d72b4b8..22617e5fa1 100644
--- a/src/lib/libcrypto/conf/conf_api.c
+++ b/src/lib/libcrypto/conf/conf_api.c
@@ -69,16 +69,12 @@
69#include <openssl/conf_api.h> 69#include <openssl/conf_api.h>
70#include "e_os.h" 70#include "e_os.h"
71 71
72static void value_free_hash(CONF_VALUE *a, LHASH *conf); 72static void value_free_hash_doall_arg(CONF_VALUE *a,
73static void value_free_stack(CONF_VALUE *a,LHASH *conf); 73 LHASH_OF(CONF_VALUE) *conf);
74static IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_hash, CONF_VALUE *, LHASH *) 74static void value_free_stack_doall(CONF_VALUE *a);
75static IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_stack, CONF_VALUE *, LHASH *) 75static IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_hash, CONF_VALUE,
76/* We don't use function pointer casting or wrapper functions - but cast each 76 LHASH_OF(CONF_VALUE))
77 * callback parameter inside the callback functions. */ 77static IMPLEMENT_LHASH_DOALL_FN(value_free_stack, CONF_VALUE)
78/* static unsigned long hash(CONF_VALUE *v); */
79static unsigned long hash(const void *v_void);
80/* static int cmp_conf(CONF_VALUE *a,CONF_VALUE *b); */
81static int cmp_conf(const void *a_void,const void *b_void);
82 78
83/* Up until OpenSSL 0.9.5a, this was get_section */ 79/* Up until OpenSSL 0.9.5a, this was get_section */
84CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section) 80CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section)
@@ -88,7 +84,7 @@ CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section)
88 if ((conf == NULL) || (section == NULL)) return(NULL); 84 if ((conf == NULL) || (section == NULL)) return(NULL);
89 vv.name=NULL; 85 vv.name=NULL;
90 vv.section=(char *)section; 86 vv.section=(char *)section;
91 v=(CONF_VALUE *)lh_retrieve(conf->data,&vv); 87 v=lh_CONF_VALUE_retrieve(conf->data,&vv);
92 return(v); 88 return(v);
93 } 89 }
94 90
@@ -118,7 +114,7 @@ int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value)
118 return 0; 114 return 0;
119 } 115 }
120 116
121 v = (CONF_VALUE *)lh_insert(conf->data, value); 117 v = lh_CONF_VALUE_insert(conf->data, value);
122 if (v != NULL) 118 if (v != NULL)
123 { 119 {
124 (void)sk_CONF_VALUE_delete_ptr(ts,v); 120 (void)sk_CONF_VALUE_delete_ptr(ts,v);
@@ -141,24 +137,24 @@ char *_CONF_get_string(const CONF *conf, const char *section, const char *name)
141 { 137 {
142 vv.name=(char *)name; 138 vv.name=(char *)name;
143 vv.section=(char *)section; 139 vv.section=(char *)section;
144 v=(CONF_VALUE *)lh_retrieve(conf->data,&vv); 140 v=lh_CONF_VALUE_retrieve(conf->data,&vv);
145 if (v != NULL) return(v->value); 141 if (v != NULL) return(v->value);
146 if (strcmp(section,"ENV") == 0) 142 if (strcmp(section,"ENV") == 0)
147 { 143 {
148 p=Getenv(name); 144 p=getenv(name);
149 if (p != NULL) return(p); 145 if (p != NULL) return(p);
150 } 146 }
151 } 147 }
152 vv.section="default"; 148 vv.section="default";
153 vv.name=(char *)name; 149 vv.name=(char *)name;
154 v=(CONF_VALUE *)lh_retrieve(conf->data,&vv); 150 v=lh_CONF_VALUE_retrieve(conf->data,&vv);
155 if (v != NULL) 151 if (v != NULL)
156 return(v->value); 152 return(v->value);
157 else 153 else
158 return(NULL); 154 return(NULL);
159 } 155 }
160 else 156 else
161 return(Getenv(name)); 157 return(getenv(name));
162 } 158 }
163 159
164#if 0 /* There's no way to provide error checking with this function, so 160#if 0 /* There's no way to provide error checking with this function, so
@@ -182,6 +178,34 @@ long _CONF_get_number(CONF *conf, char *section, char *name)
182 } 178 }
183#endif 179#endif
184 180
181static unsigned long conf_value_hash(const CONF_VALUE *v)
182 {
183 return (lh_strhash(v->section)<<2)^lh_strhash(v->name);
184 }
185static IMPLEMENT_LHASH_HASH_FN(conf_value, CONF_VALUE)
186
187static int conf_value_cmp(const CONF_VALUE *a, const CONF_VALUE *b)
188 {
189 int i;
190
191 if (a->section != b->section)
192 {
193 i=strcmp(a->section,b->section);
194 if (i) return(i);
195 }
196
197 if ((a->name != NULL) && (b->name != NULL))
198 {
199 i=strcmp(a->name,b->name);
200 return(i);
201 }
202 else if (a->name == b->name)
203 return(0);
204 else
205 return((a->name == NULL)?-1:1);
206 }
207static IMPLEMENT_LHASH_COMP_FN(conf_value, CONF_VALUE)
208
185int _CONF_new_data(CONF *conf) 209int _CONF_new_data(CONF *conf)
186 { 210 {
187 if (conf == NULL) 211 if (conf == NULL)
@@ -189,7 +213,7 @@ int _CONF_new_data(CONF *conf)
189 return 0; 213 return 0;
190 } 214 }
191 if (conf->data == NULL) 215 if (conf->data == NULL)
192 if ((conf->data = lh_new(hash, cmp_conf)) == NULL) 216 if ((conf->data = lh_CONF_VALUE_new()) == NULL)
193 { 217 {
194 return 0; 218 return 0;
195 } 219 }
@@ -200,105 +224,73 @@ void _CONF_free_data(CONF *conf)
200 { 224 {
201 if (conf == NULL || conf->data == NULL) return; 225 if (conf == NULL || conf->data == NULL) return;
202 226
203 conf->data->down_load=0; /* evil thing to make sure the 'OPENSSL_free()' 227 lh_CONF_VALUE_down_load(conf->data)=0; /* evil thing to make
204 * works as expected */ 228 * sure the 'OPENSSL_free()' works as
205 lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(value_free_hash), 229 * expected */
206 conf->data); 230 lh_CONF_VALUE_doall_arg(conf->data,
231 LHASH_DOALL_ARG_FN(value_free_hash),
232 LHASH_OF(CONF_VALUE), conf->data);
207 233
208 /* We now have only 'section' entries in the hash table. 234 /* We now have only 'section' entries in the hash table.
209 * Due to problems with */ 235 * Due to problems with */
210 236
211 lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(value_free_stack), 237 lh_CONF_VALUE_doall(conf->data, LHASH_DOALL_FN(value_free_stack));
212 conf->data); 238 lh_CONF_VALUE_free(conf->data);
213 lh_free(conf->data);
214 } 239 }
215 240
216static void value_free_hash(CONF_VALUE *a, LHASH *conf) 241static void value_free_hash_doall_arg(CONF_VALUE *a, LHASH_OF(CONF_VALUE) *conf)
217 { 242 {
218 if (a->name != NULL) 243 if (a->name != NULL)
219 { 244 (void)lh_CONF_VALUE_delete(conf,a);
220 a=(CONF_VALUE *)lh_delete(conf,a);
221 }
222 } 245 }
223 246
224static void value_free_stack(CONF_VALUE *a, LHASH *conf) 247static void value_free_stack_doall(CONF_VALUE *a)
225 { 248 {
226 CONF_VALUE *vv; 249 CONF_VALUE *vv;
227 STACK *sk; 250 STACK_OF(CONF_VALUE) *sk;
228 int i; 251 int i;
229 252
230 if (a->name != NULL) return; 253 if (a->name != NULL) return;
231 254
232 sk=(STACK *)a->value; 255 sk=(STACK_OF(CONF_VALUE) *)a->value;
233 for (i=sk_num(sk)-1; i>=0; i--) 256 for (i=sk_CONF_VALUE_num(sk)-1; i>=0; i--)
234 { 257 {
235 vv=(CONF_VALUE *)sk_value(sk,i); 258 vv=sk_CONF_VALUE_value(sk,i);
236 OPENSSL_free(vv->value); 259 OPENSSL_free(vv->value);
237 OPENSSL_free(vv->name); 260 OPENSSL_free(vv->name);
238 OPENSSL_free(vv); 261 OPENSSL_free(vv);
239 } 262 }
240 if (sk != NULL) sk_free(sk); 263 if (sk != NULL) sk_CONF_VALUE_free(sk);
241 OPENSSL_free(a->section); 264 OPENSSL_free(a->section);
242 OPENSSL_free(a); 265 OPENSSL_free(a);
243 } 266 }
244 267
245/* static unsigned long hash(CONF_VALUE *v) */
246static unsigned long hash(const void *v_void)
247 {
248 CONF_VALUE *v = (CONF_VALUE *)v_void;
249 return((lh_strhash(v->section)<<2)^lh_strhash(v->name));
250 }
251
252/* static int cmp_conf(CONF_VALUE *a, CONF_VALUE *b) */
253static int cmp_conf(const void *a_void,const void *b_void)
254 {
255 int i;
256 CONF_VALUE *a = (CONF_VALUE *)a_void;
257 CONF_VALUE *b = (CONF_VALUE *)b_void;
258
259 if (a->section != b->section)
260 {
261 i=strcmp(a->section,b->section);
262 if (i) return(i);
263 }
264
265 if ((a->name != NULL) && (b->name != NULL))
266 {
267 i=strcmp(a->name,b->name);
268 return(i);
269 }
270 else if (a->name == b->name)
271 return(0);
272 else
273 return((a->name == NULL)?-1:1);
274 }
275
276/* Up until OpenSSL 0.9.5a, this was new_section */ 268/* Up until OpenSSL 0.9.5a, this was new_section */
277CONF_VALUE *_CONF_new_section(CONF *conf, const char *section) 269CONF_VALUE *_CONF_new_section(CONF *conf, const char *section)
278 { 270 {
279 STACK *sk=NULL; 271 STACK_OF(CONF_VALUE) *sk=NULL;
280 int ok=0,i; 272 int ok=0,i;
281 CONF_VALUE *v=NULL,*vv; 273 CONF_VALUE *v=NULL,*vv;
282 274
283 if ((sk=sk_new_null()) == NULL) 275 if ((sk=sk_CONF_VALUE_new_null()) == NULL)
284 goto err; 276 goto err;
285 if ((v=(CONF_VALUE *)OPENSSL_malloc(sizeof(CONF_VALUE))) == NULL) 277 if ((v=OPENSSL_malloc(sizeof(CONF_VALUE))) == NULL)
286 goto err; 278 goto err;
287 i=strlen(section)+1; 279 i=strlen(section)+1;
288 if ((v->section=(char *)OPENSSL_malloc(i)) == NULL) 280 if ((v->section=OPENSSL_malloc(i)) == NULL)
289 goto err; 281 goto err;
290 282
291 memcpy(v->section,section,i); 283 memcpy(v->section,section,i);
292 v->name=NULL; 284 v->name=NULL;
293 v->value=(char *)sk; 285 v->value=(char *)sk;
294 286
295 vv=(CONF_VALUE *)lh_insert(conf->data,v); 287 vv=lh_CONF_VALUE_insert(conf->data,v);
296 assert(vv == NULL); 288 assert(vv == NULL);
297 ok=1; 289 ok=1;
298err: 290err:
299 if (!ok) 291 if (!ok)
300 { 292 {
301 if (sk != NULL) sk_free(sk); 293 if (sk != NULL) sk_CONF_VALUE_free(sk);
302 if (v != NULL) OPENSSL_free(v); 294 if (v != NULL) OPENSSL_free(v);
303 v=NULL; 295 v=NULL;
304 } 296 }