diff options
-rw-r--r-- | src/Makefile | 2 | ||||
-rw-r--r-- | src/backend.c | 109 | ||||
-rw-r--r-- | src/format.c | 71 | ||||
-rw-r--r-- | src/format.h | 5 |
4 files changed, 130 insertions, 57 deletions
diff --git a/src/Makefile b/src/Makefile index 37a5805..6d2f1f3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,7 +3,7 @@ LDFLAGS = -lnsl -lpthread all:: plugin.so dummyplugin.so portmap -plugin.so: backend.c dispatch.c map.c nis.c plugin.c portmap.c defaults.h +plugin.so: backend.c dispatch.c map.c nis.c plugin.c portmap.c defaults.h format.c $(CC) $(CFLAGS) -shared -o $@ $^ $(LDFLAGS) dummyplugin.so: dispatch.c dummymap.c nis.c plugin.c plugin.h portmap.c $(CC) $(CFLAGS) -shared -o $@ $^ $(LDFLAGS) diff --git a/src/backend.c b/src/backend.c index 9195750..4fda175 100644 --- a/src/backend.c +++ b/src/backend.c @@ -15,6 +15,7 @@ #include "backend.h" #include "plugin.h" #include "map.h" +#include "format.h" #include "defaults.h" /* The data we ask the map cache to keep, for us, for each map. */ @@ -108,16 +109,15 @@ static int backend_map_entry_cb(Slapi_Entry *e, void *callback_data) { struct backend_map_data *data; - char *key, *value, *dn, **visited_dn; + char *key, *value, *dn, **visited_dn_list; int i, j; data = callback_data; - /* Pull out the name of the attribute which holds the key. */ - key = slapi_entry_attr_get_charptr(e, data->key_attr); - /* Pull out the value format string and generate the value. XXX */ - value = slapi_entry_attr_get_charptr(e, data->value_fmt); - /* Pull together the DN of this entry and the others we peeked at. */ + /* Pull out the key and value for the entry. */ + visited_dn_list = NULL; + key = format_get_data(NULL, e, data->key_attr, &visited_dn_list); + value = format_get_data(NULL, e, data->value_fmt, &visited_dn_list); + /* Pull out the NDN of this entry. */ dn = slapi_entry_get_ndn(e); - visited_dn = NULL; /* If we actually generated a value, then set it for all keys. */ if ((key != NULL) && (value != NULL)) { /* For each key, set the value. */ @@ -128,7 +128,7 @@ backend_map_entry_cb(Slapi_Entry *e, void *callback_data) data->domain, data->map, key, dn, value); map_data_set_entry(data->state, data->domain, data->map, - dn, (const char **) visited_dn, + dn, (const char **) visited_dn_list, -1, key, -1, value); } else { @@ -144,8 +144,9 @@ backend_map_entry_cb(Slapi_Entry *e, void *callback_data) data->domain, data->map, dn); } - slapi_ch_free_string(&value); - slapi_ch_free_string(&key); + format_free_ndn_list(visited_dn_list); + format_free_data(value); + format_free_data(key); return 0; } @@ -428,7 +429,7 @@ backend_add_entry_cb(const char *domain, const char *map, void *backend_data, { Slapi_DN *base_sdn, *entry_sdn; Slapi_Filter *filter; - char **visited_dn, *key, *value; + char **visited_dn_list, *key, *value; struct backend_map_data *map_data; struct backend_add_entry_cbdata *cbdata; @@ -448,12 +449,12 @@ backend_add_entry_cb(const char *domain, const char *map, void *backend_data, return PR_TRUE; } - /* Pull out the name of the attribute which holds the key. */ - key = slapi_entry_attr_get_charptr(cbdata->e, map_data->key_attr); - /* Pull out the value format string and generate the value. XXX */ - value = slapi_entry_attr_get_charptr(cbdata->e, map_data->value_fmt); - /* Pull together the DN of this entry and the others we peeked at. */ - visited_dn = NULL; + /* Pull out the key and value. */ + visited_dn_list = NULL; + key = format_get_data(cbdata->pb, cbdata->e, map_data->key_attr, + &visited_dn_list); + value = format_get_data(cbdata->pb, cbdata->e, map_data->value_fmt, + &visited_dn_list); /* If we actually generated a value, then set it for all keys. */ if ((key != NULL) && (value != NULL)) { @@ -465,7 +466,7 @@ backend_add_entry_cb(const char *domain, const char *map, void *backend_data, domain, map, key, cbdata->dn, value); map_data_set_entry(map_data->state, domain, map, - cbdata->dn, (const char **) visited_dn, + cbdata->dn, (const char **) visited_dn_list, -1, key, -1, value); } else { @@ -481,8 +482,9 @@ backend_add_entry_cb(const char *domain, const char *map, void *backend_data, map_data->domain, map_data->map, cbdata->dn); } - slapi_ch_free_string(&value); - slapi_ch_free_string(&key); + format_free_ndn_list(visited_dn_list); + format_free_data(value); + format_free_data(key); return PR_TRUE; } @@ -522,7 +524,7 @@ backend_modify_entry_cb(const char *domain, const char *map, void *backend_data, { Slapi_DN *base_sdn, *entry_sdn; Slapi_Filter *filter; - char **visited_dn, *key, *value; + char **visited_dn_list, *key, *value; struct backend_map_data *map_data; struct backend_modify_entry_cbdata *cbdata; @@ -540,16 +542,12 @@ backend_modify_entry_cb(const char *domain, const char *map, void *backend_data, map_data->domain, map_data->map, cbdata->dn); } else { - /* Pull out the name of the attribute which holds the key. */ - key = slapi_entry_attr_get_charptr(cbdata->e, - map_data->key_attr); - /* Pull out the value format string and generate the value. XXX - * */ - value = slapi_entry_attr_get_charptr(cbdata->e, - map_data->value_fmt); - /* Pull together the DN of this entry and the others we peeked - * at. */ - visited_dn = NULL; + /* Pull out the key and value. */ + visited_dn_list = NULL; + key = format_get_data(cbdata->pb, cbdata->e, + map_data->key_attr, &visited_dn_list); + value = format_get_data(cbdata->pb, cbdata->e, + map_data->value_fmt, &visited_dn_list); /* If we actually generated a value, then set it for all keys. * */ if ((key != NULL) && (value != NULL)) { @@ -562,7 +560,7 @@ backend_modify_entry_cb(const char *domain, const char *map, void *backend_data, key, cbdata->dn, value); map_data_set_entry(map_data->state, domain, map, cbdata->dn, - (const char **) visited_dn, + (const char **) visited_dn_list, -1, key, -1, value); } else { @@ -588,8 +586,9 @@ backend_modify_entry_cb(const char *domain, const char *map, void *backend_data, map_data->domain, map_data->map, cbdata->dn); } - slapi_ch_free_string(&value); - slapi_ch_free_string(&key); + format_free_ndn_list(visited_dn_list); + format_free_data(value); + format_free_data(key); } return PR_TRUE; } @@ -631,7 +630,7 @@ backend_modrdn_entry_cb(const char *domain, const char *map, void *backend_data, { Slapi_DN *base_sdn, *entry_sdn; Slapi_Filter *filter; - char **visited_dn, *key_pre, *value_pre, *key_post, *value_post; + char **visited_dn_list, *key_pre, *value_pre, *key_post, *value_post; struct backend_map_data *map_data; struct backend_modrdn_entry_cbdata *cbdata; PRBool matched_pre, matched_post; @@ -642,21 +641,18 @@ backend_modrdn_entry_cb(const char *domain, const char *map, void *backend_data, matched_pre = backend_entry_matches_map(map_data, cbdata->e_pre); matched_post = backend_entry_matches_map(map_data, cbdata->e_post); - /* Pull out the name of the attribute which holds the key. */ - key_pre = slapi_entry_attr_get_charptr(cbdata->e_pre, - map_data->key_attr); - key_post = slapi_entry_attr_get_charptr(cbdata->e_post, - map_data->key_attr); - /* Pull out the value format string and generate the value. XXX - * */ - value_pre = slapi_entry_attr_get_charptr(cbdata->e_pre, - map_data->value_fmt); - value_post = slapi_entry_attr_get_charptr(cbdata->e_post, - map_data->value_fmt); - - /* Pull together the DN of this entry and the others we peeked - * at. */ - visited_dn = NULL; + /* Pull out the key and value for the old entry. */ + key_pre = format_get_data(cbdata->pb, cbdata->e_pre, + map_data->key_attr, NULL); + value_pre = format_get_data(cbdata->pb, cbdata->e_pre, + map_data->value_fmt, NULL); + + /* Pull out the key and value for the new entry. */ + visited_dn_list = NULL; + key_post = format_get_data(cbdata->pb, cbdata->e_post, + map_data->key_attr, &visited_dn_list); + value_post = format_get_data(cbdata->pb, cbdata->e_post, + map_data->value_fmt, &visited_dn_list); /* Now decide what to set, or unset, in this map. */ if (!matched_post || (key_post == NULL) || (value_post == NULL)) { @@ -685,7 +681,7 @@ backend_modrdn_entry_cb(const char *domain, const char *map, void *backend_data, value_post); map_data_set_entry(map_data->state, domain, map, cbdata->dn_post, - (const char **) visited_dn, + (const char **) visited_dn_list, -1, key_post, -1, value_post); } else { @@ -733,16 +729,17 @@ backend_modrdn_entry_cb(const char *domain, const char *map, void *backend_data, value_post); map_data_set_entry(map_data->state, domain, map, cbdata->dn_post, - (const char **) visited_dn, + (const char **) visited_dn_list, -1, key_post, -1, value_post); } } - slapi_ch_free_string(&value_pre); - slapi_ch_free_string(&key_pre); - slapi_ch_free_string(&value_post); - slapi_ch_free_string(&key_post); + format_free_ndn_list(visited_dn_list); + format_free_data(value_pre); + format_free_data(key_pre); + format_free_data(value_post); + format_free_data(key_post); return PR_TRUE; } diff --git a/src/format.c b/src/format.c new file mode 100644 index 0000000..87ae640 --- /dev/null +++ b/src/format.c @@ -0,0 +1,71 @@ +#include <sys/types.h> +#include <stdlib.h> +#include "format.h" + +void +format_free_data(char *data) +{ + if (data != NULL) { + free(data); + } +} + +void +format_free_ndn_list(char **ndn_list) +{ + if (ndn_list != NULL) { + free(ndn_list); + } +} + +static char * +format_format(Slapi_PBlock *pb, Slapi_Entry *e, const char *fmt, + char ***visited_ndns) +{ + char **values, *ret; + int count; + values = slapi_entry_attr_get_charray(e, fmt); + for (count = 0; (values != NULL) && (values[count] != NULL); count++) { + continue; + } + if (count == 1) { + ret = strdup(values[0]); + } else { + ret = NULL; + } + slapi_ch_array_free(values); + return ret; +} + +char * +format_get_data(Slapi_PBlock *pb, Slapi_Entry *e, const char *fmt, + char ***visited_ndns) +{ + Slapi_PBlock *local_pb; + char ***ndn_list, **local_ndn_list, *ret; + + if (visited_ndns != NULL) { + ndn_list = visited_ndns; + } else { + ndn_list = &local_ndn_list; + local_ndn_list = NULL; + } + + if (pb == NULL) { + local_pb = slapi_pblock_new(); + pb = local_pb; + } else { + local_pb = NULL; + } + + ret = format_format(pb, e, fmt, ndn_list); + + if (pb == local_pb) { + slapi_pblock_destroy(local_pb); + } + if (ndn_list == &local_ndn_list) { + format_free_ndn_list(local_ndn_list); + } + + return ret; +} diff --git a/src/format.h b/src/format.h new file mode 100644 index 0000000..1269d0b --- /dev/null +++ b/src/format.h @@ -0,0 +1,5 @@ +#include <dirsrv/slapi-plugin.h> +void format_free_data(char *data); +void format_free_ndn_list(char **ndn_list); +char *format_get_data(Slapi_PBlock *pb, Slapi_Entry *e, const char *fmt, + char ***visited_ndn_list); |