From 2b21b27866b4772b281fb13f54c6bb03eb8a64d0 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Wed, 10 Sep 2008 13:24:43 -0400 Subject: - add another list of attributes and parents, for use in chasing and tracking multi-hop backreferences --- src/back-nis.c | 12 ++++++-- src/back-sch.c | 10 +++++-- src/backend.h | 2 +- src/format.c | 88 +++++++++++++++++++++++++++++++++++++++------------------- src/format.h | 2 ++ 5 files changed, 80 insertions(+), 34 deletions(-) diff --git a/src/back-nis.c b/src/back-nis.c index fe2e488..b5298d5 100644 --- a/src/back-nis.c +++ b/src/back-nis.c @@ -89,6 +89,7 @@ backend_free_set_data_contents(void *data) format_free_attr_list(set_data->common.ref_attrs); format_free_inref_attrs(set_data->common.inref_attrs); format_free_ref_attr_list(set_data->common.ref_attr_list); + format_free_ref_attr_list(set_data->common.inref_attr_list); free(set_data->common.entry_filter); free(set_data->disallowed_chars); backend_shr_free_strlist(set_data->key_formats); @@ -126,6 +127,9 @@ backend_copy_set_data(const struct backend_set_data *data) ret->common.ref_attr_list = data->common.ref_attr_list ? format_dup_ref_attr_list(data->common.ref_attr_list) : NULL; + ret->common.inref_attr_list = data->common.inref_attr_list ? + format_dup_ref_attr_list(data->common.inref_attr_list) : + NULL; ret->disallowed_chars = data->disallowed_chars ? strdup(data->disallowed_chars) : NULL; ret->key_formats = backend_shr_dup_strlist(data->key_formats); @@ -183,6 +187,7 @@ backend_gather_data(struct plugin_state *state, Slapi_Entry *e, char ***ref_attrs, struct format_inref_attr ***inref_attrs, struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list, unsigned int **ret_lengths, unsigned int *ret_n_singles, char ***ret_singles, @@ -239,7 +244,7 @@ backend_gather_data(struct plugin_state *state, Slapi_Entry *e, single_formats[i], disallowed_chars, ref_attrs, inref_attrs, - ref_attr_list, + ref_attr_list, inref_attr_list, &single_lengths[i]); if (singles[i] != NULL) { n++; @@ -267,7 +272,7 @@ backend_gather_data(struct plugin_state *state, Slapi_Entry *e, group_formats[i], disallowed_chars, ref_attrs, inref_attrs, - ref_attr_list, + ref_attr_list, inref_attr_list, &group_lengths[j]); if (groups[j] != NULL) { for (k = 0; groups[j][k] != NULL; k++) { @@ -337,6 +342,7 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) &data->common.ref_attrs, &data->common.inref_attrs, &data->common.ref_attr_list, + &data->common.inref_attr_list, &all_key_lengths, &n_key_singles, &key_singles, @@ -352,6 +358,7 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) &data->common.ref_attrs, &data->common.inref_attrs, &data->common.ref_attr_list, + &data->common.inref_attr_list, &all_value_lengths, &n_value_singles, &value_singles, @@ -576,6 +583,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, ret.common.ref_attrs = NULL; ret.common.inref_attrs = NULL; ret.common.ref_attr_list = NULL; + ret.common.inref_attr_list = NULL; ret.disallowed_chars = use_disallowed_chars; ret.key_formats = use_key_formats; ret.n_key_formats = 0; diff --git a/src/back-sch.c b/src/back-sch.c index 2f90630..d9bf04d 100644 --- a/src/back-sch.c +++ b/src/back-sch.c @@ -93,6 +93,7 @@ backend_set_config_free_config_contents(void *data) format_free_attr_list(set_data->common.ref_attrs); format_free_inref_attrs(set_data->common.inref_attrs); format_free_ref_attr_list(set_data->common.ref_attr_list); + format_free_ref_attr_list(set_data->common.inref_attr_list); free(set_data->common.entry_filter); slapi_sdn_free(&set_data->container_sdn); free(set_data->rdn_format); @@ -124,9 +125,9 @@ backend_copy_set_config(const struct backend_set_data *data) ret->common.inref_attrs = data->common.inref_attrs ? format_dup_inref_attrs(data->common.inref_attrs) : NULL; - ret->common.ref_attr_list = data->common.inref_attrs ? - format_dup_ref_attr_list(data->common.ref_attr_list) : - NULL; + ret->common.inref_attr_list = data->common.inref_attrs ? + format_dup_ref_attr_list(data->common.inref_attr_list) : + NULL; ret->common.entry_filter = strdup(data->common.entry_filter); ret->container_sdn = slapi_sdn_dup(data->container_sdn); ret->rdn_format = strdup(data->rdn_format); @@ -175,6 +176,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, ret.common.ref_attrs = NULL; ret.common.inref_attrs = NULL; ret.common.ref_attr_list = NULL; + ret.common.inref_attr_list = NULL; dn = slapi_dn_plus_rdn(ret.common.group, ret.common.set); ret.container_sdn = slapi_sdn_new_dn_passin(dn); ret.rdn_format = rdn_format; @@ -273,6 +275,7 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) &data->common.ref_attrs, &data->common.inref_attrs, &data->common.ref_attr_list, + &data->common.inref_attr_list, &rdn_len); if (rdn == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, @@ -306,6 +309,7 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) &data->common.ref_attrs, &data->common.inref_attrs, &data->common.ref_attr_list, + &data->common.inref_attr_list, &ava_lens); if ((ava != NULL) && (ava_lens != NULL) && diff --git a/src/backend.h b/src/backend.h index 379296f..94bbca1 100644 --- a/src/backend.h +++ b/src/backend.h @@ -31,7 +31,7 @@ struct backend_shr_set_data { char *group, *set, **bases, *entry_filter; char **ref_attrs; struct format_inref_attr **inref_attrs; - struct format_ref_attr_list **ref_attr_list; + struct format_ref_attr_list **ref_attr_list, **inref_attr_list; struct backend_set_data *self; }; diff --git a/src/format.c b/src/format.c index 7a23d58..01590d9 100644 --- a/src/format.c +++ b/src/format.c @@ -63,7 +63,8 @@ static int format_expand(struct plugin_state *state, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list); + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list); static char * xstrndup(const char *start, size_t length) @@ -787,7 +788,8 @@ format_first(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { int ret, i, argc, first, common_length; char **argv, **values; @@ -809,7 +811,8 @@ format_first(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, ret = -ENOENT; values = format_get_data_set(state, e, group, set, value_format, disallowed, - ref_attrs, inref_attrs, ref_attr_list, + ref_attrs, inref_attrs, + ref_attr_list, inref_attr_list, &lengths); if (values == NULL) { if (default_value == NULL) { @@ -826,7 +829,7 @@ format_first(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, outbuf, outbuf_len, outbuf_choices, ref_attrs, inref_attrs, - ref_attr_list); + ref_attr_list, inref_attr_list); ret = i; } } else { @@ -865,7 +868,8 @@ format_deref(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { int i, j, ret, argc; Slapi_Entry *ref; @@ -993,7 +997,8 @@ format_derefx(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { int i, j, k, ret, argc; Slapi_Entry *entry; @@ -1209,7 +1214,8 @@ format_referred(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { int i, ret, argc; Slapi_PBlock *local_pb; @@ -1344,7 +1350,8 @@ format_merge(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { int ret, i, j, argc, slen, count; unsigned int *lengths; @@ -1374,7 +1381,8 @@ format_merge(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, values = format_get_data_set(state, e, group, set, argv[i], disallowed, ref_attrs, inref_attrs, - ref_attr_list, &lengths); + ref_attr_list, inref_attr_list, + &lengths); if (values == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id, @@ -1434,6 +1442,7 @@ format_match_generic(struct plugin_state *state, char ***ref_attrs, struct format_inref_attr ***inref_attrs, struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list, const char *fnname, char * (*match_fn)(const char *pattern, const char *value, char **argv)) @@ -1463,7 +1472,8 @@ format_match_generic(struct plugin_state *state, lengths = NULL; values = format_get_data_set(state, e, group, set, argv[0], disallowed, - ref_attrs, inref_attrs, ref_attr_list, + ref_attrs, inref_attrs, + ref_attr_list, inref_attr_list, &lengths); if (values != NULL) { for (i = 0; values[i] != NULL; i++) { @@ -1496,6 +1506,7 @@ format_match_generic(struct plugin_state *state, disallowed, ref_attrs, inref_attrs, ref_attr_list, + inref_attr_list, &default_length); } if (default_value != NULL) { @@ -1577,6 +1588,7 @@ format_match_generic(struct plugin_state *state, ref_attrs, inref_attrs, ref_attr_list, + inref_attr_list, &default_length); } if (default_value != NULL) { @@ -1641,12 +1653,14 @@ format_match(struct plugin_state *state, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { return format_match_generic(state, pb, e, group, set, args, 2, 2, disallowed, outbuf, outbuf_len, outbuf_choices, - ref_attrs, inref_attrs, ref_attr_list, + ref_attrs, inref_attrs, + ref_attr_list, inref_attr_list, "format_match", format_match_cb); } @@ -1673,12 +1687,14 @@ format_regmatch(struct plugin_state *state, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { return format_match_generic(state, pb, e, group, set, args, 2, 2, disallowed, outbuf, outbuf_len, outbuf_choices, - ref_attrs, inref_attrs, ref_attr_list, + ref_attrs, inref_attrs, + ref_attr_list, inref_attr_list, "format_regmatch", format_regmatch_cb); } @@ -1798,12 +1814,14 @@ format_regsub(struct plugin_state *state, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { return format_match_generic(state, pb, e, group, set, args, 3, 3, disallowed, outbuf, outbuf_len, outbuf_choices, - ref_attrs, inref_attrs, ref_attr_list, + ref_attrs, inref_attrs, + ref_attr_list, inref_attr_list, "format_regsub", format_regsub_cb); } @@ -1822,7 +1840,8 @@ format_lookup_fn(const char *fnname) struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list); + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list); } fns[] = { {"first", format_first}, {"deref", format_deref}, @@ -2111,7 +2130,8 @@ format_expand_simple(struct plugin_state *state, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { char *shortstart, *longstart, *shortend, *longend; struct berval tmp, **values; @@ -2218,7 +2238,8 @@ format_expand_simple(struct plugin_state *state, outbuf, outbuf_len, outbuf_choices, ref_attrs, inref_attrs, - ref_attr_list); + ref_attr_list, + inref_attr_list); free(expr); return i; } else { @@ -2235,7 +2256,8 @@ format_expand_simple(struct plugin_state *state, outbuf, outbuf_len, outbuf_choices, ref_attrs, inref_attrs, - ref_attr_list); + ref_attr_list, + inref_attr_list); free(expr); format_free_bv_list(values); return i; @@ -2262,7 +2284,7 @@ format_expand_simple(struct plugin_state *state, group, set, alternate_value, NULL, outbuf, outbuf_len, outbuf_choices, ref_attrs, inref_attrs, - ref_attr_list); + ref_attr_list, inref_attr_list); free(tmp.bv_val); free(expr); return i; @@ -2301,7 +2323,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, char *outbuf, int outbuf_len, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list) + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list) { int i, j, used; const char *fmtstart, *fmtend, *match, *pair; @@ -2315,7 +2338,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, struct format_choice **outbuf_choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, - struct format_ref_attr_list ***ref_attr_list); + struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list); spd_id = state->plugin_desc->spd_id; @@ -2374,7 +2398,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, outbuf_choices, ref_attrs, inref_attrs, - ref_attr_list); + ref_attr_list, + inref_attr_list); if (used < 0) { /* Some failure, FAIL. */ slapi_log_error(SLAPI_LOG_PLUGIN, @@ -2476,7 +2501,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, outbuf + j, outbuf_len - j, outbuf_choices, ref_attrs, inref_attrs, - ref_attr_list); + ref_attr_list, + inref_attr_list); free(params); params = NULL; if (used < 0) { @@ -2531,6 +2557,7 @@ format_format(struct plugin_state *state, Slapi_Entry *e, struct format_choice **choices, char ***ref_attrs, struct format_inref_attr ***inref_attrs, struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list, unsigned int *data_length) { Slapi_PBlock *pb; @@ -2556,7 +2583,8 @@ format_format(struct plugin_state *state, Slapi_Entry *e, i = format_expand(state, pb, e, group, set, fmt, disallowed, buf, buflen, choices, - ref_attrs, inref_attrs, ref_attr_list); + ref_attrs, inref_attrs, + ref_attr_list, inref_attr_list); if ((i >= 0) && (i < buflen)) { buf[i] = '\0'; ret = xmemdup(buf, i); @@ -2618,11 +2646,13 @@ format_get_data(struct plugin_state *state, Slapi_Entry *e, char ***ref_attrs, struct format_inref_attr ***inref_attrs, struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list, unsigned int *data_length) { unsigned int ignored; return format_format(state, e, group, set, fmt, disallowed, - NULL, ref_attrs, inref_attrs, ref_attr_list, + NULL, ref_attrs, inref_attrs, + ref_attr_list, inref_attr_list, data_length ? data_length : &ignored); } @@ -2645,6 +2675,7 @@ format_get_data_set(struct plugin_state *state, Slapi_Entry *e, char ***ref_attrs, struct format_inref_attr ***inref_attrs, struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list, unsigned int **data_lengths) { struct format_choice *choices, *this_choice; @@ -2655,7 +2686,8 @@ format_get_data_set(struct plugin_state *state, Slapi_Entry *e, choices = NULL; template = format_format(state, e, group, set, fmt, disallowed, &choices, - ref_attrs, inref_attrs, ref_attr_list, + ref_attrs, inref_attrs, + ref_attr_list, inref_attr_list, &template_len); if (template == NULL) { format_free_choices(choices); diff --git a/src/format.h b/src/format.h index 7f33133..d9e8302 100644 --- a/src/format.h +++ b/src/format.h @@ -61,6 +61,7 @@ char *format_get_data(struct plugin_state *state, struct slapi_entry *e, char ***ref_attrs, struct format_inref_attr ***inref_attrs, struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list, unsigned int *data_length); void format_free_data_set(char **data_set, unsigned int *data_lengths); char **format_get_data_set(struct plugin_state *state, Slapi_Entry *e, @@ -70,6 +71,7 @@ char **format_get_data_set(struct plugin_state *state, Slapi_Entry *e, char ***ref_attrs, struct format_inref_attr ***inref_attrs, struct format_ref_attr_list ***ref_attr_list, + struct format_ref_attr_list ***inref_attr_list, unsigned int **data_lengths); char *format_escape_for_filter(const char *unescaped); -- cgit