xref: /third_party/openssl/crypto/conf/conf_lib.c (revision e1051a39)
1e1051a39Sopenharmony_ci/*
2e1051a39Sopenharmony_ci * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci *
4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci * this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci */
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci#include "e_os.h"
11e1051a39Sopenharmony_ci#include <stdio.h>
12e1051a39Sopenharmony_ci#include <string.h>
13e1051a39Sopenharmony_ci#include "internal/conf.h"
14e1051a39Sopenharmony_ci#include "crypto/ctype.h"
15e1051a39Sopenharmony_ci#include <openssl/crypto.h>
16e1051a39Sopenharmony_ci#include <openssl/err.h>
17e1051a39Sopenharmony_ci#include <openssl/conf.h>
18e1051a39Sopenharmony_ci#include <openssl/conf_api.h>
19e1051a39Sopenharmony_ci#include "conf_local.h"
20e1051a39Sopenharmony_ci#include <openssl/lhash.h>
21e1051a39Sopenharmony_ci
22e1051a39Sopenharmony_cistatic CONF_METHOD *default_CONF_method = NULL;
23e1051a39Sopenharmony_ci
24e1051a39Sopenharmony_ci/* Init a 'CONF' structure from an old LHASH */
25e1051a39Sopenharmony_ci
26e1051a39Sopenharmony_civoid CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash)
27e1051a39Sopenharmony_ci{
28e1051a39Sopenharmony_ci    if (default_CONF_method == NULL)
29e1051a39Sopenharmony_ci        default_CONF_method = NCONF_default();
30e1051a39Sopenharmony_ci
31e1051a39Sopenharmony_ci    default_CONF_method->init(conf);
32e1051a39Sopenharmony_ci    conf->data = hash;
33e1051a39Sopenharmony_ci}
34e1051a39Sopenharmony_ci
35e1051a39Sopenharmony_ci/*
36e1051a39Sopenharmony_ci * The following section contains the "CONF classic" functions, rewritten in
37e1051a39Sopenharmony_ci * terms of the new CONF interface.
38e1051a39Sopenharmony_ci */
39e1051a39Sopenharmony_ci
40e1051a39Sopenharmony_ciint CONF_set_default_method(CONF_METHOD *meth)
41e1051a39Sopenharmony_ci{
42e1051a39Sopenharmony_ci    default_CONF_method = meth;
43e1051a39Sopenharmony_ci    return 1;
44e1051a39Sopenharmony_ci}
45e1051a39Sopenharmony_ci
46e1051a39Sopenharmony_ciLHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file,
47e1051a39Sopenharmony_ci                                long *eline)
48e1051a39Sopenharmony_ci{
49e1051a39Sopenharmony_ci    LHASH_OF(CONF_VALUE) *ltmp;
50e1051a39Sopenharmony_ci    BIO *in = NULL;
51e1051a39Sopenharmony_ci
52e1051a39Sopenharmony_ci#ifdef OPENSSL_SYS_VMS
53e1051a39Sopenharmony_ci    in = BIO_new_file(file, "r");
54e1051a39Sopenharmony_ci#else
55e1051a39Sopenharmony_ci    in = BIO_new_file(file, "rb");
56e1051a39Sopenharmony_ci#endif
57e1051a39Sopenharmony_ci    if (in == NULL) {
58e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, ERR_R_SYS_LIB);
59e1051a39Sopenharmony_ci        return NULL;
60e1051a39Sopenharmony_ci    }
61e1051a39Sopenharmony_ci
62e1051a39Sopenharmony_ci    ltmp = CONF_load_bio(conf, in, eline);
63e1051a39Sopenharmony_ci    BIO_free(in);
64e1051a39Sopenharmony_ci
65e1051a39Sopenharmony_ci    return ltmp;
66e1051a39Sopenharmony_ci}
67e1051a39Sopenharmony_ci
68e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_STDIO
69e1051a39Sopenharmony_ciLHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp,
70e1051a39Sopenharmony_ci                                   long *eline)
71e1051a39Sopenharmony_ci{
72e1051a39Sopenharmony_ci    BIO *btmp;
73e1051a39Sopenharmony_ci    LHASH_OF(CONF_VALUE) *ltmp;
74e1051a39Sopenharmony_ci    if ((btmp = BIO_new_fp(fp, BIO_NOCLOSE)) == NULL) {
75e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, ERR_R_BUF_LIB);
76e1051a39Sopenharmony_ci        return NULL;
77e1051a39Sopenharmony_ci    }
78e1051a39Sopenharmony_ci    ltmp = CONF_load_bio(conf, btmp, eline);
79e1051a39Sopenharmony_ci    BIO_free(btmp);
80e1051a39Sopenharmony_ci    return ltmp;
81e1051a39Sopenharmony_ci}
82e1051a39Sopenharmony_ci#endif
83e1051a39Sopenharmony_ci
84e1051a39Sopenharmony_ciLHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp,
85e1051a39Sopenharmony_ci                                    long *eline)
86e1051a39Sopenharmony_ci{
87e1051a39Sopenharmony_ci    CONF ctmp;
88e1051a39Sopenharmony_ci    int ret;
89e1051a39Sopenharmony_ci
90e1051a39Sopenharmony_ci    CONF_set_nconf(&ctmp, conf);
91e1051a39Sopenharmony_ci
92e1051a39Sopenharmony_ci    ret = NCONF_load_bio(&ctmp, bp, eline);
93e1051a39Sopenharmony_ci    if (ret)
94e1051a39Sopenharmony_ci        return ctmp.data;
95e1051a39Sopenharmony_ci    return NULL;
96e1051a39Sopenharmony_ci}
97e1051a39Sopenharmony_ci
98e1051a39Sopenharmony_ciSTACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf,
99e1051a39Sopenharmony_ci                                       const char *section)
100e1051a39Sopenharmony_ci{
101e1051a39Sopenharmony_ci    if (conf == NULL) {
102e1051a39Sopenharmony_ci        return NULL;
103e1051a39Sopenharmony_ci    } else {
104e1051a39Sopenharmony_ci        CONF ctmp;
105e1051a39Sopenharmony_ci
106e1051a39Sopenharmony_ci        CONF_set_nconf(&ctmp, conf);
107e1051a39Sopenharmony_ci        return NCONF_get_section(&ctmp, section);
108e1051a39Sopenharmony_ci    }
109e1051a39Sopenharmony_ci}
110e1051a39Sopenharmony_ci
111e1051a39Sopenharmony_cichar *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group,
112e1051a39Sopenharmony_ci                      const char *name)
113e1051a39Sopenharmony_ci{
114e1051a39Sopenharmony_ci    if (conf == NULL) {
115e1051a39Sopenharmony_ci        return NCONF_get_string(NULL, group, name);
116e1051a39Sopenharmony_ci    } else {
117e1051a39Sopenharmony_ci        CONF ctmp;
118e1051a39Sopenharmony_ci
119e1051a39Sopenharmony_ci        CONF_set_nconf(&ctmp, conf);
120e1051a39Sopenharmony_ci        return NCONF_get_string(&ctmp, group, name);
121e1051a39Sopenharmony_ci    }
122e1051a39Sopenharmony_ci}
123e1051a39Sopenharmony_ci
124e1051a39Sopenharmony_cilong CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group,
125e1051a39Sopenharmony_ci                     const char *name)
126e1051a39Sopenharmony_ci{
127e1051a39Sopenharmony_ci    int status;
128e1051a39Sopenharmony_ci    long result = 0;
129e1051a39Sopenharmony_ci
130e1051a39Sopenharmony_ci    ERR_set_mark();
131e1051a39Sopenharmony_ci    if (conf == NULL) {
132e1051a39Sopenharmony_ci        status = NCONF_get_number_e(NULL, group, name, &result);
133e1051a39Sopenharmony_ci    } else {
134e1051a39Sopenharmony_ci        CONF ctmp;
135e1051a39Sopenharmony_ci
136e1051a39Sopenharmony_ci        CONF_set_nconf(&ctmp, conf);
137e1051a39Sopenharmony_ci        status = NCONF_get_number_e(&ctmp, group, name, &result);
138e1051a39Sopenharmony_ci    }
139e1051a39Sopenharmony_ci    ERR_pop_to_mark();
140e1051a39Sopenharmony_ci    return status == 0 ? 0L : result;
141e1051a39Sopenharmony_ci}
142e1051a39Sopenharmony_ci
143e1051a39Sopenharmony_civoid CONF_free(LHASH_OF(CONF_VALUE) *conf)
144e1051a39Sopenharmony_ci{
145e1051a39Sopenharmony_ci    CONF ctmp;
146e1051a39Sopenharmony_ci    CONF_set_nconf(&ctmp, conf);
147e1051a39Sopenharmony_ci    NCONF_free_data(&ctmp);
148e1051a39Sopenharmony_ci}
149e1051a39Sopenharmony_ci
150e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_STDIO
151e1051a39Sopenharmony_ciint CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out)
152e1051a39Sopenharmony_ci{
153e1051a39Sopenharmony_ci    BIO *btmp;
154e1051a39Sopenharmony_ci    int ret;
155e1051a39Sopenharmony_ci
156e1051a39Sopenharmony_ci    if ((btmp = BIO_new_fp(out, BIO_NOCLOSE)) == NULL) {
157e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, ERR_R_BUF_LIB);
158e1051a39Sopenharmony_ci        return 0;
159e1051a39Sopenharmony_ci    }
160e1051a39Sopenharmony_ci    ret = CONF_dump_bio(conf, btmp);
161e1051a39Sopenharmony_ci    BIO_free(btmp);
162e1051a39Sopenharmony_ci    return ret;
163e1051a39Sopenharmony_ci}
164e1051a39Sopenharmony_ci#endif
165e1051a39Sopenharmony_ci
166e1051a39Sopenharmony_ciint CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out)
167e1051a39Sopenharmony_ci{
168e1051a39Sopenharmony_ci    CONF ctmp;
169e1051a39Sopenharmony_ci
170e1051a39Sopenharmony_ci    CONF_set_nconf(&ctmp, conf);
171e1051a39Sopenharmony_ci    return NCONF_dump_bio(&ctmp, out);
172e1051a39Sopenharmony_ci}
173e1051a39Sopenharmony_ci
174e1051a39Sopenharmony_ci/*
175e1051a39Sopenharmony_ci * The following section contains the "New CONF" functions.  They are
176e1051a39Sopenharmony_ci * completely centralised around a new CONF structure that may contain
177e1051a39Sopenharmony_ci * basically anything, but at least a method pointer and a table of data.
178e1051a39Sopenharmony_ci * These functions are also written in terms of the bridge functions used by
179e1051a39Sopenharmony_ci * the "CONF classic" functions, for consistency.
180e1051a39Sopenharmony_ci */
181e1051a39Sopenharmony_ci
182e1051a39Sopenharmony_ciCONF *NCONF_new_ex(OSSL_LIB_CTX *libctx, CONF_METHOD *meth)
183e1051a39Sopenharmony_ci{
184e1051a39Sopenharmony_ci    CONF *ret;
185e1051a39Sopenharmony_ci
186e1051a39Sopenharmony_ci    if (meth == NULL)
187e1051a39Sopenharmony_ci        meth = NCONF_default();
188e1051a39Sopenharmony_ci
189e1051a39Sopenharmony_ci    ret = meth->create(meth);
190e1051a39Sopenharmony_ci    if (ret == NULL) {
191e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, ERR_R_MALLOC_FAILURE);
192e1051a39Sopenharmony_ci        return NULL;
193e1051a39Sopenharmony_ci    }
194e1051a39Sopenharmony_ci    ret->libctx = libctx;
195e1051a39Sopenharmony_ci
196e1051a39Sopenharmony_ci    return ret;
197e1051a39Sopenharmony_ci}
198e1051a39Sopenharmony_ci
199e1051a39Sopenharmony_ciCONF *NCONF_new(CONF_METHOD *meth)
200e1051a39Sopenharmony_ci{
201e1051a39Sopenharmony_ci    return NCONF_new_ex(NULL, meth);
202e1051a39Sopenharmony_ci}
203e1051a39Sopenharmony_ci
204e1051a39Sopenharmony_civoid NCONF_free(CONF *conf)
205e1051a39Sopenharmony_ci{
206e1051a39Sopenharmony_ci    if (conf == NULL)
207e1051a39Sopenharmony_ci        return;
208e1051a39Sopenharmony_ci    conf->meth->destroy(conf);
209e1051a39Sopenharmony_ci}
210e1051a39Sopenharmony_ci
211e1051a39Sopenharmony_civoid NCONF_free_data(CONF *conf)
212e1051a39Sopenharmony_ci{
213e1051a39Sopenharmony_ci    if (conf == NULL)
214e1051a39Sopenharmony_ci        return;
215e1051a39Sopenharmony_ci    conf->meth->destroy_data(conf);
216e1051a39Sopenharmony_ci}
217e1051a39Sopenharmony_ci
218e1051a39Sopenharmony_ciOSSL_LIB_CTX *NCONF_get0_libctx(const CONF *conf)
219e1051a39Sopenharmony_ci{
220e1051a39Sopenharmony_ci    return conf->libctx;
221e1051a39Sopenharmony_ci}
222e1051a39Sopenharmony_ci
223e1051a39Sopenharmony_citypedef STACK_OF(OPENSSL_CSTRING) SECTION_NAMES;
224e1051a39Sopenharmony_ci
225e1051a39Sopenharmony_ciIMPLEMENT_LHASH_DOALL_ARG_CONST(CONF_VALUE, SECTION_NAMES);
226e1051a39Sopenharmony_ci
227e1051a39Sopenharmony_cistatic void collect_section_name(const CONF_VALUE *v, SECTION_NAMES *names)
228e1051a39Sopenharmony_ci{
229e1051a39Sopenharmony_ci    /* A section is a CONF_VALUE with name == NULL */
230e1051a39Sopenharmony_ci    if (v->name == NULL)
231e1051a39Sopenharmony_ci        sk_OPENSSL_CSTRING_push(names, v->section);
232e1051a39Sopenharmony_ci}
233e1051a39Sopenharmony_ci
234e1051a39Sopenharmony_cistatic int section_name_cmp(OPENSSL_CSTRING const *a, OPENSSL_CSTRING const *b)
235e1051a39Sopenharmony_ci{
236e1051a39Sopenharmony_ci    return strcmp(*a, *b);
237e1051a39Sopenharmony_ci}
238e1051a39Sopenharmony_ci
239e1051a39Sopenharmony_ciSTACK_OF(OPENSSL_CSTRING) *NCONF_get_section_names(const CONF *cnf)
240e1051a39Sopenharmony_ci{
241e1051a39Sopenharmony_ci    SECTION_NAMES *names;
242e1051a39Sopenharmony_ci
243e1051a39Sopenharmony_ci    if ((names = sk_OPENSSL_CSTRING_new(section_name_cmp)) == NULL)
244e1051a39Sopenharmony_ci        return NULL;
245e1051a39Sopenharmony_ci    lh_CONF_VALUE_doall_SECTION_NAMES(cnf->data, collect_section_name, names);
246e1051a39Sopenharmony_ci    sk_OPENSSL_CSTRING_sort(names);
247e1051a39Sopenharmony_ci    return names;
248e1051a39Sopenharmony_ci}
249e1051a39Sopenharmony_ci
250e1051a39Sopenharmony_ciint NCONF_load(CONF *conf, const char *file, long *eline)
251e1051a39Sopenharmony_ci{
252e1051a39Sopenharmony_ci    if (conf == NULL) {
253e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, CONF_R_NO_CONF);
254e1051a39Sopenharmony_ci        return 0;
255e1051a39Sopenharmony_ci    }
256e1051a39Sopenharmony_ci
257e1051a39Sopenharmony_ci    return conf->meth->load(conf, file, eline);
258e1051a39Sopenharmony_ci}
259e1051a39Sopenharmony_ci
260e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_STDIO
261e1051a39Sopenharmony_ciint NCONF_load_fp(CONF *conf, FILE *fp, long *eline)
262e1051a39Sopenharmony_ci{
263e1051a39Sopenharmony_ci    BIO *btmp;
264e1051a39Sopenharmony_ci    int ret;
265e1051a39Sopenharmony_ci    if ((btmp = BIO_new_fp(fp, BIO_NOCLOSE)) == NULL) {
266e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, ERR_R_BUF_LIB);
267e1051a39Sopenharmony_ci        return 0;
268e1051a39Sopenharmony_ci    }
269e1051a39Sopenharmony_ci    ret = NCONF_load_bio(conf, btmp, eline);
270e1051a39Sopenharmony_ci    BIO_free(btmp);
271e1051a39Sopenharmony_ci    return ret;
272e1051a39Sopenharmony_ci}
273e1051a39Sopenharmony_ci#endif
274e1051a39Sopenharmony_ci
275e1051a39Sopenharmony_ciint NCONF_load_bio(CONF *conf, BIO *bp, long *eline)
276e1051a39Sopenharmony_ci{
277e1051a39Sopenharmony_ci    if (conf == NULL) {
278e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, CONF_R_NO_CONF);
279e1051a39Sopenharmony_ci        return 0;
280e1051a39Sopenharmony_ci    }
281e1051a39Sopenharmony_ci
282e1051a39Sopenharmony_ci    return conf->meth->load_bio(conf, bp, eline);
283e1051a39Sopenharmony_ci}
284e1051a39Sopenharmony_ci
285e1051a39Sopenharmony_ciSTACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, const char *section)
286e1051a39Sopenharmony_ci{
287e1051a39Sopenharmony_ci    if (conf == NULL) {
288e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, CONF_R_NO_CONF);
289e1051a39Sopenharmony_ci        return NULL;
290e1051a39Sopenharmony_ci    }
291e1051a39Sopenharmony_ci
292e1051a39Sopenharmony_ci    if (section == NULL) {
293e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, CONF_R_NO_SECTION);
294e1051a39Sopenharmony_ci        return NULL;
295e1051a39Sopenharmony_ci    }
296e1051a39Sopenharmony_ci
297e1051a39Sopenharmony_ci    return _CONF_get_section_values(conf, section);
298e1051a39Sopenharmony_ci}
299e1051a39Sopenharmony_ci
300e1051a39Sopenharmony_cichar *NCONF_get_string(const CONF *conf, const char *group, const char *name)
301e1051a39Sopenharmony_ci{
302e1051a39Sopenharmony_ci    char *s = _CONF_get_string(conf, group, name);
303e1051a39Sopenharmony_ci
304e1051a39Sopenharmony_ci    /*
305e1051a39Sopenharmony_ci     * Since we may get a value from an environment variable even if conf is
306e1051a39Sopenharmony_ci     * NULL, let's check the value first
307e1051a39Sopenharmony_ci     */
308e1051a39Sopenharmony_ci    if (s)
309e1051a39Sopenharmony_ci        return s;
310e1051a39Sopenharmony_ci
311e1051a39Sopenharmony_ci    if (conf == NULL) {
312e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE);
313e1051a39Sopenharmony_ci        return NULL;
314e1051a39Sopenharmony_ci    }
315e1051a39Sopenharmony_ci    ERR_raise_data(ERR_LIB_CONF, CONF_R_NO_VALUE,
316e1051a39Sopenharmony_ci                   "group=%s name=%s", group, name);
317e1051a39Sopenharmony_ci    return NULL;
318e1051a39Sopenharmony_ci}
319e1051a39Sopenharmony_ci
320e1051a39Sopenharmony_cistatic int default_is_number(const CONF *conf, char c)
321e1051a39Sopenharmony_ci{
322e1051a39Sopenharmony_ci    return ossl_isdigit(c);
323e1051a39Sopenharmony_ci}
324e1051a39Sopenharmony_ci
325e1051a39Sopenharmony_cistatic int default_to_int(const CONF *conf, char c)
326e1051a39Sopenharmony_ci{
327e1051a39Sopenharmony_ci    return (int)(c - '0');
328e1051a39Sopenharmony_ci}
329e1051a39Sopenharmony_ci
330e1051a39Sopenharmony_ciint NCONF_get_number_e(const CONF *conf, const char *group, const char *name,
331e1051a39Sopenharmony_ci                       long *result)
332e1051a39Sopenharmony_ci{
333e1051a39Sopenharmony_ci    char *str;
334e1051a39Sopenharmony_ci    long res;
335e1051a39Sopenharmony_ci    int (*is_number)(const CONF *, char) = &default_is_number;
336e1051a39Sopenharmony_ci    int (*to_int)(const CONF *, char) = &default_to_int;
337e1051a39Sopenharmony_ci
338e1051a39Sopenharmony_ci    if (result == NULL) {
339e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, ERR_R_PASSED_NULL_PARAMETER);
340e1051a39Sopenharmony_ci        return 0;
341e1051a39Sopenharmony_ci    }
342e1051a39Sopenharmony_ci
343e1051a39Sopenharmony_ci    str = NCONF_get_string(conf, group, name);
344e1051a39Sopenharmony_ci
345e1051a39Sopenharmony_ci    if (str == NULL)
346e1051a39Sopenharmony_ci        return 0;
347e1051a39Sopenharmony_ci
348e1051a39Sopenharmony_ci    if (conf != NULL) {
349e1051a39Sopenharmony_ci        if (conf->meth->is_number != NULL)
350e1051a39Sopenharmony_ci            is_number = conf->meth->is_number;
351e1051a39Sopenharmony_ci        if (conf->meth->to_int != NULL)
352e1051a39Sopenharmony_ci            to_int = conf->meth->to_int;
353e1051a39Sopenharmony_ci    }
354e1051a39Sopenharmony_ci    for (res = 0; is_number(conf, *str); str++) {
355e1051a39Sopenharmony_ci        const int d = to_int(conf, *str);
356e1051a39Sopenharmony_ci
357e1051a39Sopenharmony_ci        if (res > (LONG_MAX - d) / 10L) {
358e1051a39Sopenharmony_ci            ERR_raise(ERR_LIB_CONF, CONF_R_NUMBER_TOO_LARGE);
359e1051a39Sopenharmony_ci            return 0;
360e1051a39Sopenharmony_ci        }
361e1051a39Sopenharmony_ci        res = res * 10 + d;
362e1051a39Sopenharmony_ci    }
363e1051a39Sopenharmony_ci
364e1051a39Sopenharmony_ci    *result = res;
365e1051a39Sopenharmony_ci    return 1;
366e1051a39Sopenharmony_ci}
367e1051a39Sopenharmony_ci
368e1051a39Sopenharmony_cilong _CONF_get_number(const CONF *conf, const char *section,
369e1051a39Sopenharmony_ci                      const char *name)
370e1051a39Sopenharmony_ci{
371e1051a39Sopenharmony_ci    int status;
372e1051a39Sopenharmony_ci    long result = 0;
373e1051a39Sopenharmony_ci
374e1051a39Sopenharmony_ci    ERR_set_mark();
375e1051a39Sopenharmony_ci    status = NCONF_get_number_e(conf, section, name, &result);
376e1051a39Sopenharmony_ci    ERR_pop_to_mark();
377e1051a39Sopenharmony_ci    return status == 0 ? 0L : result;
378e1051a39Sopenharmony_ci}
379e1051a39Sopenharmony_ci
380e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_STDIO
381e1051a39Sopenharmony_ciint NCONF_dump_fp(const CONF *conf, FILE *out)
382e1051a39Sopenharmony_ci{
383e1051a39Sopenharmony_ci    BIO *btmp;
384e1051a39Sopenharmony_ci    int ret;
385e1051a39Sopenharmony_ci    if ((btmp = BIO_new_fp(out, BIO_NOCLOSE)) == NULL) {
386e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, ERR_R_BUF_LIB);
387e1051a39Sopenharmony_ci        return 0;
388e1051a39Sopenharmony_ci    }
389e1051a39Sopenharmony_ci    ret = NCONF_dump_bio(conf, btmp);
390e1051a39Sopenharmony_ci    BIO_free(btmp);
391e1051a39Sopenharmony_ci    return ret;
392e1051a39Sopenharmony_ci}
393e1051a39Sopenharmony_ci#endif
394e1051a39Sopenharmony_ci
395e1051a39Sopenharmony_ciint NCONF_dump_bio(const CONF *conf, BIO *out)
396e1051a39Sopenharmony_ci{
397e1051a39Sopenharmony_ci    if (conf == NULL) {
398e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_CONF, CONF_R_NO_CONF);
399e1051a39Sopenharmony_ci        return 0;
400e1051a39Sopenharmony_ci    }
401e1051a39Sopenharmony_ci
402e1051a39Sopenharmony_ci    return conf->meth->dump(conf, out);
403e1051a39Sopenharmony_ci}
404e1051a39Sopenharmony_ci
405e1051a39Sopenharmony_ci/*
406e1051a39Sopenharmony_ci * These routines call the C malloc/free, to avoid intermixing with
407e1051a39Sopenharmony_ci * OpenSSL function pointers before the library is initialized.
408e1051a39Sopenharmony_ci */
409e1051a39Sopenharmony_ciOPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void)
410e1051a39Sopenharmony_ci{
411e1051a39Sopenharmony_ci    OPENSSL_INIT_SETTINGS *ret = malloc(sizeof(*ret));
412e1051a39Sopenharmony_ci
413e1051a39Sopenharmony_ci    if (ret == NULL)
414e1051a39Sopenharmony_ci        return NULL;
415e1051a39Sopenharmony_ci
416e1051a39Sopenharmony_ci    memset(ret, 0, sizeof(*ret));
417e1051a39Sopenharmony_ci    ret->flags = DEFAULT_CONF_MFLAGS;
418e1051a39Sopenharmony_ci
419e1051a39Sopenharmony_ci    return ret;
420e1051a39Sopenharmony_ci}
421e1051a39Sopenharmony_ci
422e1051a39Sopenharmony_ci
423e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_STDIO
424e1051a39Sopenharmony_ciint OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings,
425e1051a39Sopenharmony_ci                                     const char *filename)
426e1051a39Sopenharmony_ci{
427e1051a39Sopenharmony_ci    char *newfilename = NULL;
428e1051a39Sopenharmony_ci
429e1051a39Sopenharmony_ci    if (filename != NULL) {
430e1051a39Sopenharmony_ci        newfilename = strdup(filename);
431e1051a39Sopenharmony_ci        if (newfilename == NULL)
432e1051a39Sopenharmony_ci            return 0;
433e1051a39Sopenharmony_ci    }
434e1051a39Sopenharmony_ci
435e1051a39Sopenharmony_ci    free(settings->filename);
436e1051a39Sopenharmony_ci    settings->filename = newfilename;
437e1051a39Sopenharmony_ci
438e1051a39Sopenharmony_ci    return 1;
439e1051a39Sopenharmony_ci}
440e1051a39Sopenharmony_ci
441e1051a39Sopenharmony_civoid OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS *settings,
442e1051a39Sopenharmony_ci                                        unsigned long flags)
443e1051a39Sopenharmony_ci{
444e1051a39Sopenharmony_ci    settings->flags = flags;
445e1051a39Sopenharmony_ci}
446e1051a39Sopenharmony_ci
447e1051a39Sopenharmony_ciint OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings,
448e1051a39Sopenharmony_ci                                    const char *appname)
449e1051a39Sopenharmony_ci{
450e1051a39Sopenharmony_ci    char *newappname = NULL;
451e1051a39Sopenharmony_ci
452e1051a39Sopenharmony_ci    if (appname != NULL) {
453e1051a39Sopenharmony_ci        newappname = strdup(appname);
454e1051a39Sopenharmony_ci        if (newappname == NULL)
455e1051a39Sopenharmony_ci            return 0;
456e1051a39Sopenharmony_ci    }
457e1051a39Sopenharmony_ci
458e1051a39Sopenharmony_ci    free(settings->appname);
459e1051a39Sopenharmony_ci    settings->appname = newappname;
460e1051a39Sopenharmony_ci
461e1051a39Sopenharmony_ci    return 1;
462e1051a39Sopenharmony_ci}
463e1051a39Sopenharmony_ci#endif
464e1051a39Sopenharmony_ci
465e1051a39Sopenharmony_civoid OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings)
466e1051a39Sopenharmony_ci{
467e1051a39Sopenharmony_ci    free(settings->filename);
468e1051a39Sopenharmony_ci    free(settings->appname);
469e1051a39Sopenharmony_ci    free(settings);
470e1051a39Sopenharmony_ci}
471