summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/format.c209
-rw-r--r--src/format.h14
2 files changed, 223 insertions, 0 deletions
diff --git a/src/format.c b/src/format.c
index b9a6399..8d4bb95 100644
--- a/src/format.c
+++ b/src/format.c
@@ -100,6 +100,215 @@ xmemdup(char *region, int size)
return ret;
}
+/* Maintain a DN list, which is list of distinguished names. */
+static void
+format_free_dn_list(struct slapi_dn **list)
+{
+ unsigned int i;
+ for (i = 0; (list != NULL) && (list[i] != NULL); i++) {
+ slapi_sdn_free(&(list[i]));
+ }
+ free(list);
+}
+
+static struct slapi_dn **
+format_dup_dn_list(struct slapi_dn **list)
+{
+ struct slapi_dn **ret;
+ unsigned int i;
+ for (i = 0; (list != NULL) && (list[i] != NULL); i++) {
+ continue;
+ }
+ ret = malloc((i + 1) * sizeof(struct slapi_dn*));
+ if (ret != NULL) {
+ for (i = 0; (list != NULL) && (list[i] != NULL); i++) {
+ ret[i] = slapi_sdn_dup(list[i]);
+ }
+ ret[i] = NULL;
+ }
+ return ret;
+}
+
+static struct slapi_dn **
+format_add_dn_list(struct slapi_dn ***list, const char *dn)
+{
+ struct slapi_dn **ret, *sdn;
+ unsigned int i;
+ sdn = slapi_sdn_new_dn_byval(dn);
+ for (i = 0;
+ (list != NULL) && (*list != NULL) && ((*list)[i] != NULL);
+ i++) {
+ if (slapi_sdn_compare(sdn, (*list)[i]) == 0) {
+ slapi_sdn_free(&sdn);
+ return *list;
+ }
+ continue;
+ }
+ ret = malloc((i + 2) * sizeof(struct slapi_dn*));
+ if (ret != NULL) {
+ for (i = 0;
+ (list != NULL) && (*list != NULL) && ((*list)[i] != NULL);
+ i++) {
+ ret[i] = slapi_sdn_dup((*list)[i]);
+ }
+ ret[i++] = sdn;
+ ret[i] = NULL;
+ }
+ *list = ret;
+ return ret;
+}
+
+/* Maintain a reference attribute list, which is group of lists of attribute
+ * names and search bases. */
+void
+format_free_ref_attr_list(struct format_ref_attr_list **list)
+{
+ unsigned int i;
+ int j;
+ for (i = 0; (list != NULL) && (list[i] != NULL); i++) {
+ for (j = 0; j < list[i]->n_links; j++) {
+ free(list[i]->links[j].attribute);
+ format_free_dn_list(list[i]->links[j].base_sdn_list);
+ }
+ free(list[i]->links);
+ free(list[i]->set);
+ free(list[i]->group);
+ free(list[i]);
+ }
+ free(list);
+}
+
+struct format_ref_attr_list **
+format_dup_ref_attr_list(struct format_ref_attr_list **list)
+{
+ struct format_ref_attr_list **ret;
+ struct slapi_dn **dn_list;
+ unsigned int i;
+ int j;
+ for (i = 0; (list != NULL) && (list[i] != NULL); i++) {
+ continue;
+ }
+ ret = malloc((i + 1) * sizeof(struct format_ref_attr_list*));
+ if (ret != NULL) {
+ memset(ret, 0, (i + 1) * sizeof(struct format_ref_attr_list*));
+ for (i = 0; (list != NULL) && (list[i] != NULL); i++) {
+ ret[i] = malloc(sizeof(list[i]));
+ if (ret[i] == NULL) {
+ format_free_ref_attr_list(ret);
+ return NULL;
+ }
+ ret[i]->links = malloc(sizeof(*ret[i]->links) *
+ list[i]->n_links);
+ if (ret[i]->links == NULL) {
+ format_free_ref_attr_list(ret);
+ return NULL;
+ }
+ for (j = 0; j < list[i]->n_links; j++) {
+ ret[i]->links[j].attribute =
+ strdup(list[i]->links[j].attribute);
+ if (ret[i]->links[j].attribute == NULL) {
+ format_free_ref_attr_list(ret);
+ return NULL;
+ }
+ dn_list = list[i]->links[j].base_sdn_list;
+ ret[i]->links[j].base_sdn_list =
+ format_dup_dn_list(dn_list);
+ ret[i]->n_links++;
+ }
+ ret[i]->group = strdup(list[i]->group);
+ ret[i]->set = strdup(list[i]->set);
+ }
+ ret[i] = NULL;
+ }
+ return ret;
+}
+
+static struct format_ref_attr_list **
+format_add_ref_attr_list(struct format_ref_attr_list ***list,
+ const char *group, const char *set,
+ const char **names)
+{
+ struct format_ref_attr_list **ret;
+ struct slapi_dn **dn_list;
+ unsigned int i;
+ int j;
+ for (i = 0; (list != NULL) && (list[i] != NULL); i++) {
+ for (j = 0; names[j] != NULL; j++) {
+ if ((j < (*list)[i]->n_links) &&
+ (strcmp(names[j],
+ (*list)[i]->links[j].attribute) == 0)){
+ break;
+ }
+ }
+ if (names[j] == NULL) {
+ return *list;
+ }
+ continue;
+ }
+ ret = malloc((i + 2) * sizeof(struct format_ref_attr_list*));
+ if (ret != NULL) {
+ memset(ret, 0, (i + 2) * sizeof(struct format_ref_attr_list*));
+ for (i = 0;
+ (list != NULL) && (*list != NULL) && ((*list)[i] != NULL);
+ i++) {
+ ret[i] = malloc(sizeof((*list)[i]));
+ if (ret[i] == NULL) {
+ format_free_ref_attr_list(ret);
+ return *list;
+ }
+ ret[i]->links = malloc(sizeof(*ret[i]->links) *
+ (*list)[i]->n_links);
+ if (ret[i]->links == NULL) {
+ format_free_ref_attr_list(ret);
+ return *list;
+ }
+ for (j = 0; j < (*list)[i]->n_links; j++) {
+ ret[i]->links[j].attribute =
+ strdup((*list)[i]->links[j].attribute);
+ if (ret[i]->links[j].attribute == NULL) {
+ format_free_ref_attr_list(ret);
+ return *list;
+ }
+ dn_list = (*list)[i]->links[j].base_sdn_list;
+ ret[i]->links[j].base_sdn_list =
+ format_dup_dn_list(dn_list);
+ ret[i]->n_links++;
+ }
+ ret[i]->group = strdup((*list)[i]->group);
+ ret[i]->set = strdup((*list)[i]->set);
+ }
+ ret[i] = malloc(sizeof(*ret));
+ if (ret[i] == NULL) {
+ format_free_ref_attr_list(ret);
+ return *list;
+ }
+ for (j = 0; names[j] != NULL; j++) {
+ continue;
+ }
+ ret[i]->links = malloc(sizeof(*ret[i]->links) * j);
+ if (ret[i]->links == NULL) {
+ format_free_ref_attr_list(ret);
+ return *list;
+ }
+ ret[i]->n_links = j;
+ for (j = 0; j < ret[i]->n_links; j++) {
+ ret[i]->links[j].attribute = strdup(names[j]);
+ if (ret[i]->links[j].attribute == NULL) {
+ format_free_ref_attr_list(ret);
+ return *list;
+ }
+ ret[i]->links[j].base_sdn_list = NULL;
+ }
+ ret[i]->group = strdup(group);
+ ret[i]->set = strdup(set);
+ i++;
+ ret[i] = NULL;
+ }
+ format_free_ref_attr_list(*list);
+ *list = ret;
+ return ret;
+}
+
/* Maintain an entry list. The list takes ownership of entries which are
* added to it. */
struct entry_list {
diff --git a/src/format.h b/src/format.h
index b3faba9..e9b1fcb 100644
--- a/src/format.h
+++ b/src/format.h
@@ -22,18 +22,32 @@
#ifndef format_h
#define format_h
struct slapi_entry;
+struct slapi_dn;
struct plugin_state;
struct format_inref_attr {
char *group, *set, *attribute;
};
+struct format_ref_attr_list {
+ char *group, *set;
+ struct format_ref_attr_list_link {
+ char *attribute;
+ struct slapi_dn **base_sdn_list;
+ } *links;
+ int n_links;
+};
+
void format_free_attr_list(char **attr_list);
char **format_dup_attr_list(char **attr_list);
void format_free_inref_attrs(struct format_inref_attr **);
struct format_inref_attr **format_dup_inref_attrs(struct format_inref_attr **);
+void format_free_ref_attr_list(struct format_ref_attr_list **);
+struct format_ref_attr_list **
+format_dup_ref_attr_list(struct format_ref_attr_list **);
+
void format_free_data(char *data);
char *format_get_data(struct plugin_state *state, struct slapi_entry *e,
const char *domain, const char *map,