1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/lhash.h> 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h> 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/safestack.h> 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/e_os2.h> 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Later versions of DEC C has started to add lnkage information to certain 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * functions, which makes it tricky to use them as values to regular function 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * pointers. One way is to define a macro that takes care of casting them 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * correctly. 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS_DECC 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define OPENSSL_strcmp (int (*)(const char *,const char *))strcmp 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define OPENSSL_strcmp strcmp 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* I use the ex_data stuff to manage the identifiers for the obj_name_types 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * that applications may define. I only really use the free function field. 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 25221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_LHASH_OF(OBJ_NAME); 26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic LHASH_OF(OBJ_NAME) *names_lh=NULL; 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int names_type_num=OBJ_NAME_TYPE_NUM; 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct name_funcs_st 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long (*hash_func)(const char *name); 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int (*cmp_func)(const char *a,const char *b); 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void (*free_func)(const char *, int, const char *); 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } NAME_FUNCS; 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_STACK_OF(NAME_FUNCS) 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(NAME_FUNCS) 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STACK_OF(NAME_FUNCS) *name_funcs_stack; 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The LHASH callbacks now use the raw "void *" prototypes and do per-variable 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * casting in the functions. This prevents function pointer casting without the 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * need for macro-generated wrapper functions. */ 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* static unsigned long obj_name_hash(OBJ_NAME *a); */ 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long obj_name_hash(const void *a_void); 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* static int obj_name_cmp(OBJ_NAME *a,OBJ_NAME *b); */ 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int obj_name_cmp(const void *a_void,const void *b_void); 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 50221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_HASH_FN(obj_name, OBJ_NAME) 51221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_COMP_FN(obj_name, OBJ_NAME) 52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_NAME_init(void) 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (names_lh != NULL) return(1); 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_off(); 57221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom names_lh=lh_OBJ_NAME_new(); 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_on(); 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(names_lh != NULL); 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_NAME_new_index(unsigned long (*hash_func)(const char *), 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int (*cmp_func)(const char *, const char *), 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void (*free_func)(const char *, int, const char *)) 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret; 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NAME_FUNCS *name_funcs; 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (name_funcs_stack == NULL) 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_off(); 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs_stack=sk_NAME_FUNCS_new_null(); 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_on(); 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 7604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom if (name_funcs_stack == NULL) 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* ERROR */ 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=names_type_num; 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project names_type_num++; 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=sk_NAME_FUNCS_num(name_funcs_stack); i<names_type_num; i++) 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_off(); 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs = OPENSSL_malloc(sizeof(NAME_FUNCS)); 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_on(); 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!name_funcs) 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJerr(OBJ_F_OBJ_NAME_NEW_INDEX,ERR_R_MALLOC_FAILURE); 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs->hash_func = lh_strhash; 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs->cmp_func = OPENSSL_strcmp; 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs->free_func = 0; /* NULL is often declared to 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ((void *)0), which according 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to Compaq C is not really 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * compatible with a function 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * pointer. -- Richard Levitte*/ 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_off(); 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_NAME_FUNCS_push(name_funcs_stack,name_funcs); 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_on(); 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs = sk_NAME_FUNCS_value(name_funcs_stack, ret); 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (hash_func != NULL) 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs->hash_func = hash_func; 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cmp_func != NULL) 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs->cmp_func = cmp_func; 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (free_func != NULL) 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs->free_func = free_func; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* static int obj_name_cmp(OBJ_NAME *a, OBJ_NAME *b) */ 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int obj_name_cmp(const void *a_void, const void *b_void) 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const OBJ_NAME *a = (const OBJ_NAME *)a_void; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const OBJ_NAME *b = (const OBJ_NAME *)b_void; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=a->type-b->type; 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == 0) 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((name_funcs_stack != NULL) 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=sk_NAME_FUNCS_value(name_funcs_stack, 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project a->type)->cmp_func(a->name,b->name); 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=strcmp(a->name,b->name); 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* static unsigned long obj_name_hash(OBJ_NAME *a) */ 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long obj_name_hash(const void *a_void) 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long ret; 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const OBJ_NAME *a = (const OBJ_NAME *)a_void; 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=sk_NAME_FUNCS_value(name_funcs_stack, 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project a->type)->hash_func(a->name); 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=lh_strhash(a->name); 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret^=a->type; 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char *OBJ_NAME_get(const char *name, int type) 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJ_NAME on,*ret; 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int num=0,alias; 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (name == NULL) return(NULL); 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((names_lh == NULL) && !OBJ_NAME_init()) return(NULL); 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project alias=type&OBJ_NAME_ALIAS; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project type&= ~OBJ_NAME_ALIAS; 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project on.name=name; 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project on.type=type; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret=lh_OBJ_NAME_retrieve(names_lh,&on); 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) return(NULL); 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret->alias) && !alias) 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (++num > 10) return(NULL); 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project on.name=ret->data; 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret->data); 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_NAME_add(const char *name, int type, const char *data) 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJ_NAME *onp,*ret; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int alias; 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((names_lh == NULL) && !OBJ_NAME_init()) return(0); 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project alias=type&OBJ_NAME_ALIAS; 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project type&= ~OBJ_NAME_ALIAS; 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project onp=(OBJ_NAME *)OPENSSL_malloc(sizeof(OBJ_NAME)); 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (onp == NULL) 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* ERROR */ 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project onp->name=name; 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project onp->alias=alias; 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project onp->type=type; 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project onp->data=data; 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret=lh_OBJ_NAME_insert(names_lh,onp); 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret != NULL) 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* free things */ 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > ret->type)) 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* XXX: I'm not sure I understand why the free 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * function should get three arguments... 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -- Richard Levitte 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_NAME_FUNCS_value(name_funcs_stack, 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->type)->free_func(ret->name,ret->type,ret->data); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(ret); 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (lh_OBJ_NAME_error(names_lh)) 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* ERROR */ 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_NAME_remove(const char *name, int type) 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJ_NAME on,*ret; 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (names_lh == NULL) return(0); 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project type&= ~OBJ_NAME_ALIAS; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project on.name=name; 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project on.type=type; 242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret=lh_OBJ_NAME_delete(names_lh,&on); 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret != NULL) 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* free things */ 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > ret->type)) 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* XXX: I'm not sure I understand why the free 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * function should get three arguments... 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -- Richard Levitte 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_NAME_FUNCS_value(name_funcs_stack, 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->type)->free_func(ret->name,ret->type,ret->data); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(ret); 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct doall 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int type; 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void (*fn)(const OBJ_NAME *,void *arg); 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *arg; 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project }; 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void do_all_fn_doall_arg(const OBJ_NAME *name,struct doall *d) 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(name->type == d->type) 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->fn(name,d->arg); 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_ARG_FN(do_all_fn, const OBJ_NAME, struct doall) 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid OBJ_NAME_do_all(int type,void (*fn)(const OBJ_NAME *,void *arg),void *arg) 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct doall d; 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d.type=type; 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d.fn=fn; 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d.arg=arg; 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_OBJ_NAME_doall_arg(names_lh, LHASH_DOALL_ARG_FN(do_all_fn), 286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct doall, &d); 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct doall_sorted 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int type; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int n; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const OBJ_NAME **names; 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project }; 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void do_all_sorted_fn(const OBJ_NAME *name,void *d_) 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct doall_sorted *d=d_; 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(name->type != d->type) 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d->names[d->n++]=name; 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_all_sorted_cmp(const void *n1_,const void *n2_) 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const OBJ_NAME * const *n1=n1_; 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const OBJ_NAME * const *n2=n2_; 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return strcmp((*n1)->name,(*n2)->name); 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid OBJ_NAME_do_all_sorted(int type,void (*fn)(const OBJ_NAME *,void *arg), 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *arg) 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct doall_sorted d; 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int n; 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d.type=type; 321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom d.names=OPENSSL_malloc(lh_OBJ_NAME_num_items(names_lh)*sizeof *d.names); 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project d.n=0; 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJ_NAME_do_all(type,do_all_sorted_fn,&d); 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project qsort((void *)d.names,d.n,sizeof *d.names,do_all_sorted_cmp); 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for(n=0 ; n < d.n ; ++n) 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project fn(d.names[n],arg); 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free((void *)d.names); 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int free_type; 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void names_lh_free_doall(OBJ_NAME *onp) 336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (onp == NULL) 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (free_type < 0 || free_type == onp->type) 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJ_NAME_remove(onp->name,onp->type); 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 344221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_FN(names_lh_free, OBJ_NAME) 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void name_funcs_free(NAME_FUNCS *ptr) 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(ptr); 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid OBJ_NAME_cleanup(int type) 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long down_load; 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (names_lh == NULL) return; 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project free_type=type; 358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom down_load=lh_OBJ_NAME_down_load(names_lh); 359221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_OBJ_NAME_down_load(names_lh)=0; 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 361221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_OBJ_NAME_doall(names_lh,LHASH_DOALL_FN(names_lh_free)); 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (type < 0) 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 364221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_OBJ_NAME_free(names_lh); 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_NAME_FUNCS_pop_free(name_funcs_stack,name_funcs_free); 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project names_lh=NULL; 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project name_funcs_stack = NULL; 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lh_OBJ_NAME_down_load(names_lh)=down_load; 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 373