summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/format.c81
-rw-r--r--src/format.h2
2 files changed, 56 insertions, 27 deletions
diff --git a/src/format.c b/src/format.c
index 8d4bb95..eed14fa 100644
--- a/src/format.c
+++ b/src/format.c
@@ -62,7 +62,8 @@ static int format_expand(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_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list);
static char *
xstrndup(const char *start, size_t length)
@@ -768,7 +769,8 @@ format_first(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
const char *args, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list)
{
int ret, i, argc, first, common_length;
char **argv, **values;
@@ -790,7 +792,7 @@ 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_attrs, inref_attrs, ref_attr_list,
&lengths);
if (values == NULL) {
if (default_value == NULL) {
@@ -806,7 +808,8 @@ format_first(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
default_value, NULL,
outbuf, outbuf_len,
outbuf_choices,
- ref_attrs, inref_attrs);
+ ref_attrs, inref_attrs,
+ ref_attr_list);
ret = i;
}
} else {
@@ -844,7 +847,8 @@ format_deref(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
const char *args, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list)
{
int i, j, ret, argc;
Slapi_Entry *ref;
@@ -1021,7 +1025,8 @@ format_referred(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
const char *args, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list)
{
int i, ret, argc;
Slapi_PBlock *local_pb;
@@ -1155,7 +1160,8 @@ format_merge(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
const char *args, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list)
{
int ret, i, j, argc, slen, count;
unsigned int *lengths;
@@ -1185,7 +1191,7 @@ 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,
- &lengths);
+ ref_attr_list, &lengths);
if (values == NULL) {
slapi_log_error(SLAPI_LOG_PLUGIN,
state->plugin_desc->spd_id,
@@ -1244,6 +1250,7 @@ format_match_generic(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,
const char *fnname,
char * (*match_fn)(const char *pattern, const char *value,
char **argv))
@@ -1273,7 +1280,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, &lengths);
+ ref_attrs, inref_attrs, ref_attr_list,
+ &lengths);
if (values != NULL) {
for (i = 0; values[i] != NULL; i++) {
continue;
@@ -1304,6 +1312,7 @@ format_match_generic(struct plugin_state *state,
argv[default_arg],
disallowed,
ref_attrs, inref_attrs,
+ ref_attr_list,
&default_length);
}
if (default_value != NULL) {
@@ -1384,6 +1393,7 @@ format_match_generic(struct plugin_state *state,
disallowed,
ref_attrs,
inref_attrs,
+ ref_attr_list,
&default_length);
}
if (default_value != NULL) {
@@ -1447,12 +1457,13 @@ format_match(struct plugin_state *state,
const char *args, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_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_attrs, inref_attrs, ref_attr_list,
"format_match", format_match_cb);
}
@@ -1478,12 +1489,13 @@ format_regmatch(struct plugin_state *state,
const char *args, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_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_attrs, inref_attrs, ref_attr_list,
"format_regmatch", format_regmatch_cb);
}
@@ -1602,12 +1614,13 @@ format_regsub(struct plugin_state *state,
const char *args, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_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_attrs, inref_attrs, ref_attr_list,
"format_regsub", format_regsub_cb);
}
@@ -1625,7 +1638,8 @@ format_lookup_fn(const char *fnname)
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
char ***ref_attrs,
- struct format_inref_attr ***inref_attrs);
+ struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list);
} fns[] = {
{"first", format_first},
{"deref", format_deref},
@@ -1911,7 +1925,9 @@ format_expand_simple(struct plugin_state *state,
const char *fmt, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs,
+ struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list)
{
char *shortstart, *longstart, *shortend, *longend;
struct berval tmp, **values;
@@ -2017,7 +2033,8 @@ format_expand_simple(struct plugin_state *state,
default_value, NULL,
outbuf, outbuf_len,
outbuf_choices,
- ref_attrs, inref_attrs);
+ ref_attrs, inref_attrs,
+ ref_attr_list);
free(expr);
return i;
} else {
@@ -2033,7 +2050,8 @@ format_expand_simple(struct plugin_state *state,
alternate_value, NULL,
outbuf, outbuf_len,
outbuf_choices,
- ref_attrs, inref_attrs);
+ ref_attrs, inref_attrs,
+ ref_attr_list);
free(expr);
format_free_bv_list(values);
return i;
@@ -2059,7 +2077,8 @@ format_expand_simple(struct plugin_state *state,
i = format_expand(state, pb, e,
group, set, alternate_value, NULL,
outbuf, outbuf_len, outbuf_choices,
- ref_attrs, inref_attrs);
+ ref_attrs, inref_attrs,
+ ref_attr_list);
free(tmp.bv_val);
free(expr);
return i;
@@ -2097,7 +2116,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
const char *fmt, const char *disallowed,
char *outbuf, int outbuf_len,
struct format_choice **outbuf_choices,
- char ***ref_attrs, struct format_inref_attr ***inref_attrs)
+ char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list)
{
int i, j, used;
const char *fmtstart, *fmtend, *match, *pair;
@@ -2110,7 +2130,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_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list);
spd_id = state->plugin_desc->spd_id;
@@ -2168,7 +2189,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
outbuf_len - j,
outbuf_choices,
ref_attrs,
- inref_attrs);
+ inref_attrs,
+ ref_attr_list);
if (used < 0) {
/* Some failure, FAIL. */
slapi_log_error(SLAPI_LOG_PLUGIN,
@@ -2269,7 +2291,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
params, disallowed,
outbuf + j, outbuf_len - j,
outbuf_choices,
- ref_attrs, inref_attrs);
+ ref_attrs, inref_attrs,
+ ref_attr_list);
free(params);
params = NULL;
if (used < 0) {
@@ -2323,6 +2346,7 @@ format_format(struct plugin_state *state, Slapi_Entry *e,
const char *fmt, const char *disallowed,
struct format_choice **choices,
char ***ref_attrs, struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list,
unsigned int *data_length)
{
Slapi_PBlock *pb;
@@ -2348,7 +2372,7 @@ 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_attrs, inref_attrs, ref_attr_list);
if ((i >= 0) && (i < buflen)) {
buf[i] = '\0';
ret = xmemdup(buf, i);
@@ -2409,11 +2433,12 @@ format_get_data(struct plugin_state *state, Slapi_Entry *e,
const char *fmt, const char *disallowed,
char ***ref_attrs,
struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list,
unsigned int *data_length)
{
unsigned int ignored;
return format_format(state, e, group, set, fmt, disallowed,
- NULL, ref_attrs, inref_attrs,
+ NULL, ref_attrs, inref_attrs, ref_attr_list,
data_length ? data_length : &ignored);
}
@@ -2435,6 +2460,7 @@ format_get_data_set(struct plugin_state *state, Slapi_Entry *e,
const char *fmt, const char *disallowed,
char ***ref_attrs,
struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list,
unsigned int **data_lengths)
{
struct format_choice *choices, *this_choice;
@@ -2444,7 +2470,8 @@ format_get_data_set(struct plugin_state *state, Slapi_Entry *e,
unsigned int template_len;
choices = NULL;
template = format_format(state, e, group, set, fmt, disallowed,
- &choices, ref_attrs, inref_attrs,
+ &choices,
+ ref_attrs, inref_attrs, ref_attr_list,
&template_len);
if (template == NULL) {
format_free_choices(choices);
diff --git a/src/format.h b/src/format.h
index e9b1fcb..21763a4 100644
--- a/src/format.h
+++ b/src/format.h
@@ -55,6 +55,7 @@ char *format_get_data(struct plugin_state *state, struct slapi_entry *e,
const char *disallowed_chars,
char ***ref_attrs,
struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_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,
@@ -63,6 +64,7 @@ char **format_get_data_set(struct plugin_state *state, Slapi_Entry *e,
const char *disallowed,
char ***ref_attrs,
struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list **ref_attr_list,
unsigned int **data_lengths);
char *format_escape_for_filter(const char *unescaped);