typedef size_t (*RAD_XLAT_FUNC)(void *instance, REQUEST *, char *, char *, size_t, RADIUS_ESCAPE_STRING func);
int xlat_register(const char *module, RAD_XLAT_FUNC func,
void *instance);
-void xlat_unregister(const char *module, RAD_XLAT_FUNC func);
+void xlat_unregister(const char *module, RAD_XLAT_FUNC func,
+ void *instance);
void xlat_free(void);
/* threads.c */
* @param func Unused
* @return Void.
*/
-void xlat_unregister(const char *module, RAD_XLAT_FUNC func)
+void xlat_unregister(const char *module, RAD_XLAT_FUNC func, void *instance)
{
- rbnode_t *node;
+ xlat_t *c;
xlat_t my_xlat;
func = func; /* -Wunused */
strlcpy(my_xlat.module, module, sizeof(my_xlat.module));
my_xlat.length = strlen(my_xlat.module);
- node = rbtree_find(xlat_root, &my_xlat);
- if (!node) return;
+ c = rbtree_finddata(xlat_root, &my_xlat);
+ if (!c) return;
+
+ if (c->instance != instance) return;
- rbtree_delete(xlat_root, node);
+ rbtree_deletebydata(xlat_root, c);
}
/**
rlm_exec_t *inst = instance;
if (inst->xlat_name) {
- xlat_unregister(inst->xlat_name, exec_xlat);
+ xlat_unregister(inst->xlat_name, exec_xlat, instance);
free(inst->xlat_name);
}
{
rlm_expr_t *inst = instance;
- xlat_unregister(inst->xlat_name, expr_xlat);
+ xlat_unregister(inst->xlat_name, expr_xlat, instance);
pair_builtincompare_detach();
free(inst->xlat_name);
free(inst->atts);
paircompare_unregister(PW_LDAP_GROUP, ldap_groupcmp);
- xlat_unregister(inst->xlat_name,ldap_xlat);
+ xlat_unregister(inst->xlat_name,ldap_xlat, instance);
free(inst->xlat_name);
free(inst);
static int mschap_detach(void *instance){
#define inst ((rlm_mschap_t *)instance)
if (inst->xlat_name) {
- xlat_unregister(inst->xlat_name, mschap_xlat);
+ xlat_unregister(inst->xlat_name, mschap_xlat, instance);
free(inst->xlat_name);
}
free(instance);
}
}
- xlat_unregister(inst->xlat_name, perl_xlat);
+ xlat_unregister(inst->xlat_name, perl_xlat, instance);
free(inst->xlat_name);
#ifdef USE_ITHREADS
fr_connection_pool_delete(inst->pool);
if (inst->xlat_name) {
- xlat_unregister(inst->xlat_name, (RAD_XLAT_FUNC)redis_xlat);
+ xlat_unregister(inst->xlat_name, (RAD_XLAT_FUNC)redis_xlat, instance);
free(inst->xlat_name);
}
free(inst->xlat_name);
rlm_soh_t *inst = instance;
if (inst->xlat_name) {
- xlat_unregister(inst->xlat_name, soh_xlat);
+ xlat_unregister(inst->xlat_name, soh_xlat, instance);
free(inst->xlat_name);
}
free(instance);
if (inst->pool) sql_poolfree(inst);
if (inst->config->xlat_name) {
- xlat_unregister(inst->config->xlat_name,(RAD_XLAT_FUNC)sql_xlat);
+ xlat_unregister(inst->config->xlat_name,(RAD_XLAT_FUNC)sql_xlat, instance);
free(inst->config->xlat_name);
}