]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/conf/conf_api.c
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 /* Part of the code in here was originally in conf.c, which is now removed */
15 #include <openssl/conf.h>
16 #include <openssl/conf_api.h>
18 static void value_free_hash(const CONF_VALUE
*a
, LHASH_OF(CONF_VALUE
) *conf
);
19 static void value_free_stack_doall(CONF_VALUE
*a
);
21 /* Up until OpenSSL 0.9.5a, this was get_section */
22 CONF_VALUE
*_CONF_get_section(const CONF
*conf
, const char *section
)
26 if ((conf
== NULL
) || (section
== NULL
))
29 vv
.section
= (char *)section
;
30 v
= lh_CONF_VALUE_retrieve(conf
->data
, &vv
);
34 /* Up until OpenSSL 0.9.5a, this was CONF_get_section */
35 STACK_OF(CONF_VALUE
) *_CONF_get_section_values(const CONF
*conf
,
40 v
= _CONF_get_section(conf
, section
);
42 return ((STACK_OF(CONF_VALUE
) *)v
->value
);
47 int _CONF_add_string(CONF
*conf
, CONF_VALUE
*section
, CONF_VALUE
*value
)
50 STACK_OF(CONF_VALUE
) *ts
;
52 ts
= (STACK_OF(CONF_VALUE
) *)section
->value
;
54 value
->section
= section
->section
;
55 if (!sk_CONF_VALUE_push(ts
, value
)) {
59 v
= lh_CONF_VALUE_insert(conf
->data
, value
);
61 (void)sk_CONF_VALUE_delete_ptr(ts
, v
);
62 OPENSSL_free(v
->name
);
63 OPENSSL_free(v
->value
);
69 char *_CONF_get_string(const CONF
*conf
, const char *section
,
78 if (section
!= NULL
) {
79 vv
.name
= (char *)name
;
80 vv
.section
= (char *)section
;
81 v
= lh_CONF_VALUE_retrieve(conf
->data
, &vv
);
84 if (strcmp(section
, "ENV") == 0) {
90 vv
.section
= "default";
91 vv
.name
= (char *)name
;
92 v
= lh_CONF_VALUE_retrieve(conf
->data
, &vv
);
101 static unsigned long conf_value_hash(const CONF_VALUE
*v
)
103 return (OPENSSL_LH_strhash(v
->section
) << 2) ^ OPENSSL_LH_strhash(v
->name
);
106 static int conf_value_cmp(const CONF_VALUE
*a
, const CONF_VALUE
*b
)
110 if (a
->section
!= b
->section
) {
111 i
= strcmp(a
->section
, b
->section
);
116 if ((a
->name
!= NULL
) && (b
->name
!= NULL
)) {
117 i
= strcmp(a
->name
, b
->name
);
119 } else if (a
->name
== b
->name
)
122 return ((a
->name
== NULL
) ? -1 : 1);
125 int _CONF_new_data(CONF
*conf
)
130 if (conf
->data
== NULL
) {
131 conf
->data
= lh_CONF_VALUE_new(conf_value_hash
, conf_value_cmp
);
132 if (conf
->data
== NULL
)
138 typedef LHASH_OF(CONF_VALUE
) LH_CONF_VALUE
;
140 IMPLEMENT_LHASH_DOALL_ARG_CONST(CONF_VALUE
, LH_CONF_VALUE
);
142 void _CONF_free_data(CONF
*conf
)
144 if (conf
== NULL
|| conf
->data
== NULL
)
147 /* evil thing to make sure the 'OPENSSL_free()' works as expected */
148 lh_CONF_VALUE_set_down_load(conf
->data
, 0);
149 lh_CONF_VALUE_doall_LH_CONF_VALUE(conf
->data
, value_free_hash
, conf
->data
);
152 * We now have only 'section' entries in the hash table. Due to problems
156 lh_CONF_VALUE_doall(conf
->data
, value_free_stack_doall
);
157 lh_CONF_VALUE_free(conf
->data
);
160 static void value_free_hash(const CONF_VALUE
*a
, LHASH_OF(CONF_VALUE
) *conf
)
163 (void)lh_CONF_VALUE_delete(conf
, a
);
166 static void value_free_stack_doall(CONF_VALUE
*a
)
169 STACK_OF(CONF_VALUE
) *sk
;
175 sk
= (STACK_OF(CONF_VALUE
) *)a
->value
;
176 for (i
= sk_CONF_VALUE_num(sk
) - 1; i
>= 0; i
--) {
177 vv
= sk_CONF_VALUE_value(sk
, i
);
178 OPENSSL_free(vv
->value
);
179 OPENSSL_free(vv
->name
);
182 sk_CONF_VALUE_free(sk
);
183 OPENSSL_free(a
->section
);
187 /* Up until OpenSSL 0.9.5a, this was new_section */
188 CONF_VALUE
*_CONF_new_section(CONF
*conf
, const char *section
)
190 STACK_OF(CONF_VALUE
) *sk
= NULL
;
192 CONF_VALUE
*v
= NULL
, *vv
;
194 if ((sk
= sk_CONF_VALUE_new_null()) == NULL
)
196 if ((v
= OPENSSL_malloc(sizeof(*v
))) == NULL
)
198 i
= strlen(section
) + 1;
199 if ((v
->section
= OPENSSL_malloc(i
)) == NULL
)
202 memcpy(v
->section
, section
, i
);
204 v
->value
= (char *)sk
;
206 vv
= lh_CONF_VALUE_insert(conf
->data
, v
);
212 sk_CONF_VALUE_free(sk
);