1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* conf_lib.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project 2000.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    licensing@OpenSSL.org.
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/crypto.h>
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf_api.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/lhash.h>
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char CONF_version[]="CONF" OPENSSL_VERSION_PTEXT;
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic CONF_METHOD *default_CONF_method=NULL;
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Init a 'CONF' structure from an old LHASH */
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash)
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (default_CONF_method == NULL)
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		default_CONF_method = NCONF_default();
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	default_CONF_method->init(conf);
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	conf->data = hash;
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The following section contains the "CONF classic" functions,
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   rewritten in terms of the new CONF interface. */
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint CONF_set_default_method(CONF_METHOD *meth)
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	default_CONF_method = meth;
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromLHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file,
91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				long *eline)
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	LHASH_OF(CONF_VALUE) *ltmp;
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *in=NULL;
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	in=BIO_new_file(file, "r");
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	in=BIO_new_file(file, "rb");
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (in == NULL)
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB);
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ltmp = CONF_load_bio(conf, in, eline);
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_free(in);
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ltmp;
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_FP_API
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromLHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp,
115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				   long *eline)
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *btmp;
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	LHASH_OF(CONF_VALUE) *ltmp;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(btmp = BIO_new_fp(fp, BIO_NOCLOSE))) {
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_CONF_LOAD_FP,ERR_R_BUF_LIB);
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ltmp = CONF_load_bio(conf, btmp, eline);
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_free(btmp);
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ltmp;
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromLHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp,
130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				    long *eline)
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF ctmp;
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_set_nconf(&ctmp, conf);
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = NCONF_load_bio(&ctmp, bp, eline);
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret)
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return ctmp.data;
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromSTACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf,
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				       const char *section)
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONF ctmp;
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONF_set_nconf(&ctmp, conf);
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NCONF_get_section(&ctmp, section);
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromchar *CONF_get_string(LHASH_OF(CONF_VALUE) *conf,const char *group,
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		      const char *name)
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NCONF_get_string(NULL, group, name);
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONF ctmp;
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONF_set_nconf(&ctmp, conf);
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NCONF_get_string(&ctmp, group, name);
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromlong CONF_get_number(LHASH_OF(CONF_VALUE) *conf,const char *group,
174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     const char *name)
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int status;
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long result = 0;
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		status = NCONF_get_number_e(NULL, group, name, &result);
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONF ctmp;
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONF_set_nconf(&ctmp, conf);
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		status = NCONF_get_number_e(&ctmp, group, name, &result);
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (status == 0)
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* This function does not believe in errors... */
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_clear_error();
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return result;
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid CONF_free(LHASH_OF(CONF_VALUE) *conf)
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF ctmp;
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_set_nconf(&ctmp, conf);
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NCONF_free_data(&ctmp);
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_FP_API
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out)
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *btmp;
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(btmp = BIO_new_fp(out, BIO_NOCLOSE))) {
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_CONF_DUMP_FP,ERR_R_BUF_LIB);
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = CONF_dump_bio(conf, btmp);
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_free(btmp);
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out)
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF ctmp;
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_set_nconf(&ctmp, conf);
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NCONF_dump_bio(&ctmp, out);
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The following section contains the "New CONF" functions.  They are
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   completely centralised around a new CONF structure that may contain
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   basically anything, but at least a method pointer and a table of data.
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   These functions are also written in terms of the bridge functions used
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   by the "CONF classic" functions, for consistency.  */
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCONF *NCONF_new(CONF_METHOD *meth)
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF *ret;
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (meth == NULL)
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		meth = NCONF_default();
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = meth->create(meth);
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret == NULL)
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_NEW,ERR_R_MALLOC_FAILURE);
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NULL);
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid NCONF_free(CONF *conf)
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return;
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	conf->meth->destroy(conf);
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid NCONF_free_data(CONF *conf)
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return;
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	conf->meth->destroy_data(conf);
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint NCONF_load(CONF *conf, const char *file, long *eline)
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_LOAD,CONF_R_NO_CONF);
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return conf->meth->load(conf, file, eline);
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_FP_API
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint NCONF_load_fp(CONF *conf, FILE *fp,long *eline)
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *btmp;
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(btmp = BIO_new_fp(fp, BIO_NOCLOSE)))
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_LOAD_FP,ERR_R_BUF_LIB);
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = NCONF_load_bio(conf, btmp, eline);
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_free(btmp);
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint NCONF_load_bio(CONF *conf, BIO *bp,long *eline)
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_LOAD_BIO,CONF_R_NO_CONF);
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return conf->meth->load_bio(conf, bp, eline);
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf,const char *section)
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_GET_SECTION,CONF_R_NO_CONF);
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (section == NULL)
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_GET_SECTION,CONF_R_NO_SECTION);
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return _CONF_get_section_values(conf, section);
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *NCONF_get_string(const CONF *conf,const char *group,const char *name)
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *s = _CONF_get_string(conf, group, name);
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /* Since we may get a value from an environment variable even
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project           if conf is NULL, let's check the value first */
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (s) return s;
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_GET_STRING,
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE);
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONFerr(CONF_F_NCONF_GET_STRING,
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONF_R_NO_VALUE);
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ERR_add_error_data(4,"group=",group," name=",name);
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint NCONF_get_number_e(const CONF *conf,const char *group,const char *name,
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		       long *result)
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *str;
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (result == NULL)
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_GET_NUMBER_E,ERR_R_PASSED_NULL_PARAMETER);
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str = NCONF_get_string(conf,group,name);
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (str == NULL)
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (*result = 0;conf->meth->is_number(conf, *str);)
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*result = (*result)*10 + conf->meth->to_int(conf, *str);
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		str++;
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_FP_API
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint NCONF_dump_fp(const CONF *conf, FILE *out)
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *btmp;
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(btmp = BIO_new_fp(out, BIO_NOCLOSE))) {
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_DUMP_FP,ERR_R_BUF_LIB);
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = NCONF_dump_bio(conf, btmp);
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_free(btmp);
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint NCONF_dump_bio(const CONF *conf, BIO *out)
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (conf == NULL)
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CONFerr(CONF_F_NCONF_DUMP_BIO,CONF_R_NO_CONF);
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return conf->meth->dump(conf, out);
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This function should be avoided */
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong NCONF_get_number(CONF *conf,char *group,char *name)
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int status;
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long ret=0;
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	status = NCONF_get_number_e(conf, group, name, &ret);
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (status == 0)
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* This function does not believe in errors... */
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_get_error();
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
408