1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* conf_api.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Part of the code in here was originally in conf.c, which is now removed */ 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef CONF_DEBUG 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# undef NDEBUG /* avoid conflicting definitions */ 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define NDEBUG 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <assert.h> 67ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom#include <stdlib.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf.h> 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf_api.h> 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "e_os.h" 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void value_free_hash_doall_arg(CONF_VALUE *a, 74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom LHASH_OF(CONF_VALUE) *conf); 75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void value_free_stack_doall(CONF_VALUE *a); 76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_hash, CONF_VALUE, 77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom LHASH_OF(CONF_VALUE)) 78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_FN(value_free_stack, CONF_VALUE) 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Up until OpenSSL 0.9.5a, this was get_section */ 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCONF_VALUE *_CONF_get_section(const CONF *conf, const char *section) 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CONF_VALUE *v,vv; 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((conf == NULL) || (section == NULL)) return(NULL); 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vv.name=NULL; 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vv.section=(char *)section; 88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom v=lh_CONF_VALUE_retrieve(conf->data,&vv); 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(v); 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char *section) 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CONF_VALUE *v; 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project v=_CONF_get_section(conf,section); 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (v != NULL) 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return((STACK_OF(CONF_VALUE) *)v->value); 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(NULL); 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value) 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CONF_VALUE *v = NULL; 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(CONF_VALUE) *ts; 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ts = (STACK_OF(CONF_VALUE) *)section->value; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project value->section=section->section; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sk_CONF_VALUE_push(ts,value)) 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom v = lh_CONF_VALUE_insert(conf->data, value); 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (v != NULL) 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)sk_CONF_VALUE_delete_ptr(ts,v); 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(v->name); 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(v->value); 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(v); 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *_CONF_get_string(const CONF *conf, const char *section, const char *name) 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CONF_VALUE *v,vv; 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *p; 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (name == NULL) return(NULL); 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (conf != NULL) 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (section != NULL) 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vv.name=(char *)name; 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vv.section=(char *)section; 141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom v=lh_CONF_VALUE_retrieve(conf->data,&vv); 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (v != NULL) return(v->value); 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(section,"ENV") == 0) 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p=getenv(name); 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (p != NULL) return(p); 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vv.section="default"; 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vv.name=(char *)name; 151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom v=lh_CONF_VALUE_retrieve(conf->data,&vv); 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (v != NULL) 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(v->value); 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(NULL); 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(getenv(name)); 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 /* There's no way to provide error checking with this function, so 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project force implementors of the higher levels to get a string and read 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project the number themselves. */ 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong _CONF_get_number(CONF *conf, char *section, char *name) 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *str; 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long ret=0; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str=_CONF_get_string(conf,section,name); 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (str == NULL) return(0); 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (conf->meth->is_number(conf, *str)) 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=ret*10+conf->meth->to_int(conf, *str); 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str++; 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic unsigned long conf_value_hash(const CONF_VALUE *v) 183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return (lh_strhash(v->section)<<2)^lh_strhash(v->name); 185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_HASH_FN(conf_value, CONF_VALUE) 187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int conf_value_cmp(const CONF_VALUE *a, const CONF_VALUE *b) 189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int i; 191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (a->section != b->section) 193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom i=strcmp(a->section,b->section); 195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (i) return(i); 196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((a->name != NULL) && (b->name != NULL)) 199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom i=strcmp(a->name,b->name); 201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(i); 202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (a->name == b->name) 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(0); 205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return((a->name == NULL)?-1:1); 207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_COMP_FN(conf_value, CONF_VALUE) 209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint _CONF_new_data(CONF *conf) 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (conf == NULL) 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (conf->data == NULL) 217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((conf->data = lh_CONF_VALUE_new()) == NULL) 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid _CONF_free_data(CONF *conf) 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (conf == NULL || conf->data == NULL) return; 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_CONF_VALUE_down_load(conf->data)=0; /* evil thing to make 229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * sure the 'OPENSSL_free()' works as 230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * expected */ 231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_CONF_VALUE_doall_arg(conf->data, 232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom LHASH_DOALL_ARG_FN(value_free_hash), 233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom LHASH_OF(CONF_VALUE), conf->data); 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* We now have only 'section' entries in the hash table. 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Due to problems with */ 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_CONF_VALUE_doall(conf->data, LHASH_DOALL_FN(value_free_stack)); 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_CONF_VALUE_free(conf->data); 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void value_free_hash_doall_arg(CONF_VALUE *a, LHASH_OF(CONF_VALUE) *conf) 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->name != NULL) 245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (void)lh_CONF_VALUE_delete(conf,a); 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void value_free_stack_doall(CONF_VALUE *a) 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CONF_VALUE *vv; 251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(CONF_VALUE) *sk; 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->name != NULL) return; 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk=(STACK_OF(CONF_VALUE) *)a->value; 257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i=sk_CONF_VALUE_num(sk)-1; i>=0; i--) 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom vv=sk_CONF_VALUE_value(sk,i); 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(vv->value); 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(vv->name); 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(vv); 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sk != NULL) sk_CONF_VALUE_free(sk); 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a->section); 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a); 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Up until OpenSSL 0.9.5a, this was new_section */ 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCONF_VALUE *_CONF_new_section(CONF *conf, const char *section) 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(CONF_VALUE) *sk=NULL; 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ok=0,i; 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CONF_VALUE *v=NULL,*vv; 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((sk=sk_CONF_VALUE_new_null()) == NULL) 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((v=OPENSSL_malloc(sizeof(CONF_VALUE))) == NULL) 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=strlen(section)+1; 281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((v->section=OPENSSL_malloc(i)) == NULL) 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(v->section,section,i); 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project v->name=NULL; 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project v->value=(char *)sk; 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom vv=lh_CONF_VALUE_insert(conf->data,v); 28943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom OPENSSL_assert(vv == NULL); 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ok=1; 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr: 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ok) 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sk != NULL) sk_CONF_VALUE_free(sk); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (v != NULL) OPENSSL_free(v); 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project v=NULL; 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(v); 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(CONF_VALUE) 302