const char *OBJ_NAME_get(const char *name, int type) { OBJ_NAME on, *ret; int num = 0, alias; if (name == NULL) return (NULL); if ((names_lh == NULL) && !OBJ_NAME_init()) return (NULL); alias = type & OBJ_NAME_ALIAS; type &= ~OBJ_NAME_ALIAS; on.name = name; on.type = type; for (;;) { ret = lh_OBJ_NAME_retrieve(names_lh, &on); if (ret == NULL) return (NULL); if ((ret->alias) && !alias) { if (++num > 10) return (NULL); on.name = ret->data; } else { return (ret->data); } } }
int OBJ_NAME_add(const char *name, int type, const char *data) { OBJ_NAME *onp,*ret; int alias; if ((names_lh == NULL) && !OBJ_NAME_init()) return(0); alias=type&OBJ_NAME_ALIAS; type&= ~OBJ_NAME_ALIAS; onp=(OBJ_NAME *)OPENSSL_malloc(sizeof(OBJ_NAME)); if (onp == NULL) { /* ERROR */ return(0); } onp->name=name; onp->alias=alias; onp->type=type; onp->data=data; ret=(OBJ_NAME *)lh_insert(names_lh,onp); if (ret != NULL) { /* free things */ if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > ret->type)) { /* XXX: I'm not sure I understand why the free * function should get three arguments... * -- Richard Levitte */ sk_NAME_FUNCS_value(name_funcs_stack,ret->type) ->free_func(ret->name,ret->type,ret->data); } OPENSSL_free(ret); } else { if (lh_error(names_lh)) { /* ERROR */ return(0); } } return(1); }