diff options
-rw-r--r-- | src/format.c | 209 | ||||
-rw-r--r-- | src/format.h | 14 |
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, |