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