summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Makefile2
-rw-r--r--src/backend.c109
-rw-r--r--src/format.c71
-rw-r--r--src/format.h5
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);