| Index: openssl/crypto/conf/conf_api.c
|
| ===================================================================
|
| --- openssl/crypto/conf/conf_api.c (revision 105093)
|
| +++ openssl/crypto/conf/conf_api.c (working copy)
|
| @@ -64,21 +64,18 @@
|
| #endif
|
|
|
| #include <assert.h>
|
| +#include <stdlib.h>
|
| #include <string.h>
|
| #include <openssl/conf.h>
|
| #include <openssl/conf_api.h>
|
| #include "e_os.h"
|
|
|
| -static void value_free_hash(CONF_VALUE *a, LHASH *conf);
|
| -static void value_free_stack(CONF_VALUE *a,LHASH *conf);
|
| -static IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_hash, CONF_VALUE *, LHASH *)
|
| -static IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_stack, CONF_VALUE *, LHASH *)
|
| -/* We don't use function pointer casting or wrapper functions - but cast each
|
| - * callback parameter inside the callback functions. */
|
| -/* static unsigned long hash(CONF_VALUE *v); */
|
| -static unsigned long hash(const void *v_void);
|
| -/* static int cmp_conf(CONF_VALUE *a,CONF_VALUE *b); */
|
| -static int cmp_conf(const void *a_void,const void *b_void);
|
| +static void value_free_hash_doall_arg(CONF_VALUE *a,
|
| + LHASH_OF(CONF_VALUE) *conf);
|
| +static void value_free_stack_doall(CONF_VALUE *a);
|
| +static IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_hash, CONF_VALUE,
|
| + LHASH_OF(CONF_VALUE))
|
| +static IMPLEMENT_LHASH_DOALL_FN(value_free_stack, CONF_VALUE)
|
|
|
| /* Up until OpenSSL 0.9.5a, this was get_section */
|
| CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section)
|
| @@ -88,7 +85,7 @@
|
| if ((conf == NULL) || (section == NULL)) return(NULL);
|
| vv.name=NULL;
|
| vv.section=(char *)section;
|
| - v=(CONF_VALUE *)lh_retrieve(conf->data,&vv);
|
| + v=lh_CONF_VALUE_retrieve(conf->data,&vv);
|
| return(v);
|
| }
|
|
|
| @@ -118,7 +115,7 @@
|
| return 0;
|
| }
|
|
|
| - v = (CONF_VALUE *)lh_insert(conf->data, value);
|
| + v = lh_CONF_VALUE_insert(conf->data, value);
|
| if (v != NULL)
|
| {
|
| (void)sk_CONF_VALUE_delete_ptr(ts,v);
|
| @@ -141,24 +138,24 @@
|
| {
|
| vv.name=(char *)name;
|
| vv.section=(char *)section;
|
| - v=(CONF_VALUE *)lh_retrieve(conf->data,&vv);
|
| + v=lh_CONF_VALUE_retrieve(conf->data,&vv);
|
| if (v != NULL) return(v->value);
|
| if (strcmp(section,"ENV") == 0)
|
| {
|
| - p=Getenv(name);
|
| + p=getenv(name);
|
| if (p != NULL) return(p);
|
| }
|
| }
|
| vv.section="default";
|
| vv.name=(char *)name;
|
| - v=(CONF_VALUE *)lh_retrieve(conf->data,&vv);
|
| + v=lh_CONF_VALUE_retrieve(conf->data,&vv);
|
| if (v != NULL)
|
| return(v->value);
|
| else
|
| return(NULL);
|
| }
|
| else
|
| - return(Getenv(name));
|
| + return(getenv(name));
|
| }
|
|
|
| #if 0 /* There's no way to provide error checking with this function, so
|
| @@ -182,6 +179,34 @@
|
| }
|
| #endif
|
|
|
| +static unsigned long conf_value_hash(const CONF_VALUE *v)
|
| + {
|
| + return (lh_strhash(v->section)<<2)^lh_strhash(v->name);
|
| + }
|
| +static IMPLEMENT_LHASH_HASH_FN(conf_value, CONF_VALUE)
|
| +
|
| +static int conf_value_cmp(const CONF_VALUE *a, const CONF_VALUE *b)
|
| + {
|
| + int i;
|
| +
|
| + if (a->section != b->section)
|
| + {
|
| + i=strcmp(a->section,b->section);
|
| + if (i) return(i);
|
| + }
|
| +
|
| + if ((a->name != NULL) && (b->name != NULL))
|
| + {
|
| + i=strcmp(a->name,b->name);
|
| + return(i);
|
| + }
|
| + else if (a->name == b->name)
|
| + return(0);
|
| + else
|
| + return((a->name == NULL)?-1:1);
|
| + }
|
| +static IMPLEMENT_LHASH_COMP_FN(conf_value, CONF_VALUE)
|
| +
|
| int _CONF_new_data(CONF *conf)
|
| {
|
| if (conf == NULL)
|
| @@ -189,7 +214,7 @@
|
| return 0;
|
| }
|
| if (conf->data == NULL)
|
| - if ((conf->data = lh_new(hash, cmp_conf)) == NULL)
|
| + if ((conf->data = lh_CONF_VALUE_new()) == NULL)
|
| {
|
| return 0;
|
| }
|
| @@ -200,105 +225,73 @@
|
| {
|
| if (conf == NULL || conf->data == NULL) return;
|
|
|
| - conf->data->down_load=0; /* evil thing to make sure the 'OPENSSL_free()'
|
| - * works as expected */
|
| - lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(value_free_hash),
|
| - conf->data);
|
| + lh_CONF_VALUE_down_load(conf->data)=0; /* evil thing to make
|
| + * sure the 'OPENSSL_free()' works as
|
| + * expected */
|
| + lh_CONF_VALUE_doall_arg(conf->data,
|
| + LHASH_DOALL_ARG_FN(value_free_hash),
|
| + LHASH_OF(CONF_VALUE), conf->data);
|
|
|
| /* We now have only 'section' entries in the hash table.
|
| * Due to problems with */
|
|
|
| - lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(value_free_stack),
|
| - conf->data);
|
| - lh_free(conf->data);
|
| + lh_CONF_VALUE_doall(conf->data, LHASH_DOALL_FN(value_free_stack));
|
| + lh_CONF_VALUE_free(conf->data);
|
| }
|
|
|
| -static void value_free_hash(CONF_VALUE *a, LHASH *conf)
|
| +static void value_free_hash_doall_arg(CONF_VALUE *a, LHASH_OF(CONF_VALUE) *conf)
|
| {
|
| if (a->name != NULL)
|
| - {
|
| - a=(CONF_VALUE *)lh_delete(conf,a);
|
| - }
|
| + (void)lh_CONF_VALUE_delete(conf,a);
|
| }
|
|
|
| -static void value_free_stack(CONF_VALUE *a, LHASH *conf)
|
| +static void value_free_stack_doall(CONF_VALUE *a)
|
| {
|
| CONF_VALUE *vv;
|
| - STACK *sk;
|
| + STACK_OF(CONF_VALUE) *sk;
|
| int i;
|
|
|
| if (a->name != NULL) return;
|
|
|
| - sk=(STACK *)a->value;
|
| - for (i=sk_num(sk)-1; i>=0; i--)
|
| + sk=(STACK_OF(CONF_VALUE) *)a->value;
|
| + for (i=sk_CONF_VALUE_num(sk)-1; i>=0; i--)
|
| {
|
| - vv=(CONF_VALUE *)sk_value(sk,i);
|
| + vv=sk_CONF_VALUE_value(sk,i);
|
| OPENSSL_free(vv->value);
|
| OPENSSL_free(vv->name);
|
| OPENSSL_free(vv);
|
| }
|
| - if (sk != NULL) sk_free(sk);
|
| + if (sk != NULL) sk_CONF_VALUE_free(sk);
|
| OPENSSL_free(a->section);
|
| OPENSSL_free(a);
|
| }
|
|
|
| -/* static unsigned long hash(CONF_VALUE *v) */
|
| -static unsigned long hash(const void *v_void)
|
| - {
|
| - CONF_VALUE *v = (CONF_VALUE *)v_void;
|
| - return((lh_strhash(v->section)<<2)^lh_strhash(v->name));
|
| - }
|
| -
|
| -/* static int cmp_conf(CONF_VALUE *a, CONF_VALUE *b) */
|
| -static int cmp_conf(const void *a_void,const void *b_void)
|
| - {
|
| - int i;
|
| - CONF_VALUE *a = (CONF_VALUE *)a_void;
|
| - CONF_VALUE *b = (CONF_VALUE *)b_void;
|
| -
|
| - if (a->section != b->section)
|
| - {
|
| - i=strcmp(a->section,b->section);
|
| - if (i) return(i);
|
| - }
|
| -
|
| - if ((a->name != NULL) && (b->name != NULL))
|
| - {
|
| - i=strcmp(a->name,b->name);
|
| - return(i);
|
| - }
|
| - else if (a->name == b->name)
|
| - return(0);
|
| - else
|
| - return((a->name == NULL)?-1:1);
|
| - }
|
| -
|
| /* Up until OpenSSL 0.9.5a, this was new_section */
|
| CONF_VALUE *_CONF_new_section(CONF *conf, const char *section)
|
| {
|
| - STACK *sk=NULL;
|
| + STACK_OF(CONF_VALUE) *sk=NULL;
|
| int ok=0,i;
|
| CONF_VALUE *v=NULL,*vv;
|
|
|
| - if ((sk=sk_new_null()) == NULL)
|
| + if ((sk=sk_CONF_VALUE_new_null()) == NULL)
|
| goto err;
|
| - if ((v=(CONF_VALUE *)OPENSSL_malloc(sizeof(CONF_VALUE))) == NULL)
|
| + if ((v=OPENSSL_malloc(sizeof(CONF_VALUE))) == NULL)
|
| goto err;
|
| i=strlen(section)+1;
|
| - if ((v->section=(char *)OPENSSL_malloc(i)) == NULL)
|
| + if ((v->section=OPENSSL_malloc(i)) == NULL)
|
| goto err;
|
|
|
| memcpy(v->section,section,i);
|
| v->name=NULL;
|
| v->value=(char *)sk;
|
|
|
| - vv=(CONF_VALUE *)lh_insert(conf->data,v);
|
| - assert(vv == NULL);
|
| + vv=lh_CONF_VALUE_insert(conf->data,v);
|
| + OPENSSL_assert(vv == NULL);
|
| ok=1;
|
| err:
|
| if (!ok)
|
| {
|
| - if (sk != NULL) sk_free(sk);
|
| + if (sk != NULL) sk_CONF_VALUE_free(sk);
|
| if (v != NULL) OPENSSL_free(v);
|
| v=NULL;
|
| }
|
|
|