void (*cb_err_del)(void);
ERR_STRING_DATA *(*cb_err_get_item)(const ERR_STRING_DATA *);
ERR_STRING_DATA *(*cb_err_set_item)(ERR_STRING_DATA *);
+ ERR_STRING_DATA *(*cb_err_del_item)(ERR_STRING_DATA *);
/* Works on the "thread_hash" error-state table */
LHASH *(*cb_thread_get)(void);
ERR_STATE *(*cb_thread_get_item)(const ERR_STATE *);
static void int_err_del(void);
static ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *);
static ERR_STRING_DATA *int_err_set_item(ERR_STRING_DATA *);
+static ERR_STRING_DATA *int_err_del_item(ERR_STRING_DATA *);
static LHASH *int_thread_get(void);
static ERR_STATE *int_thread_get_item(const ERR_STATE *);
static ERR_STATE *int_thread_set_item(ERR_STATE *);
int_err_del,
int_err_get_item,
int_err_set_item,
+ int_err_del_item,
int_thread_get,
int_thread_get_item,
int_thread_set_item,
CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
return p;
}
+static ERR_STRING_DATA *int_err_del_item(ERR_STRING_DATA *d)
+ {
+ ERR_STRING_DATA *p;
+ LHASH *hash;
+ err_fns_check();
+ hash = ERRFN(err_get)();
+ if(!hash)
+ return NULL;
+ CRYPTO_r_lock(CRYPTO_LOCK_ERR);
+ p = (ERR_STRING_DATA *)lh_delete(hash, d);
+ CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
+ return p;
+ }
static LHASH *int_thread_get(void)
{
LHASH *toret = NULL;
}
}
+void ERR_unload_strings(int lib, ERR_STRING_DATA *str)
+ {
+ while(str->error)
+ {
+ str->error|=ERR_PACK(lib,0,0);
+ ERRFN(err_del_item)(str);
+ str++;
+ }
+ }
+
void ERR_free_strings(void)
{
err_fns_check();
void ERR_add_error_data(int num, ...);
#endif
void ERR_load_strings(int lib,ERR_STRING_DATA str[]);
+void ERR_unload_strings(int lib,ERR_STRING_DATA str[]);
void ERR_load_ERR_strings(void);
void ERR_load_crypto_strings(void);
void ERR_free_strings(void);