summaryrefslogtreecommitdiffstats
path: root/src/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map.c')
-rw-r--r--src/map.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/map.c b/src/map.c
index 0caf00c..10be1be 100644
--- a/src/map.c
+++ b/src/map.c
@@ -33,6 +33,8 @@ struct {
char *value;
unsigned int value_len;
} *entries;
+ void *backend_data;
+ void (*free_backend_data)(void *backend_data);
} *maps;
int n_maps;
} *domains;
@@ -276,6 +278,9 @@ map_data_unset_map(struct plugin_state *state,
map = &domain->maps[i];
/* Free the contents. */
free(map->name);
+ if (map->free_backend_data != NULL) {
+ map->free_backend_data(map->backend_data);
+ }
map_data_clear_map_map(state, map);
/* Close the hole in the array. */
domain->n_maps--;
@@ -314,7 +319,9 @@ map_data_unset_map(struct plugin_state *state,
void
map_data_set_map(struct plugin_state *state,
const char *domain_name,
- const char *map_name)
+ const char *map_name,
+ void *backend_data,
+ void (*free_backend_data)(void *backend_data))
{
struct domain *domain, *domains;
struct map *map, *maps;
@@ -368,6 +375,8 @@ map_data_set_map(struct plugin_state *state,
map = &maps[domain->n_maps];
memset(map, 0, sizeof(*map));
map->name = strdup(map_name);
+ map->backend_data = backend_data;
+ map->free_backend_data = free_backend_data;
if (map->name != NULL) {
/* Copy in existing data. */
memcpy(maps, domain->maps,
@@ -382,6 +391,12 @@ map_data_set_map(struct plugin_state *state,
return;
}
}
+ } else {
+ if (map->free_backend_data != NULL) {
+ map->free_backend_data(map->backend_data);
+ }
+ map->backend_data = backend_data;
+ map->free_backend_data = free_backend_data;
}
}