summaryrefslogtreecommitdiffstats
path: root/src/format.c
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-06-25 17:40:08 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-06-25 17:40:08 -0400
commitfb478622e9e31721350fdfdec1f78cd544e6ff72 (patch)
treec59ef603f395ab25a9040ab836a9da857d7736fa /src/format.c
parent426d0e119a45f04baab4f007fe6526724a905edb (diff)
- make matching operators work correctly when choices can be used
Diffstat (limited to 'src/format.c')
-rw-r--r--src/format.c153
1 files changed, 90 insertions, 63 deletions
diff --git a/src/format.c b/src/format.c
index ccd3c9e..fe62cd4 100644
--- a/src/format.c
+++ b/src/format.c
@@ -956,58 +956,46 @@ format_match_generic(struct plugin_state *state,
Slapi_ValueSet *values;
Slapi_Value *value;
const char *cvalue;
- char *actual_attr, **argv, *tmp, *matched;
- int i, count, matched_index, argc, disposition, buffer_flags, ret, len;
+ char *actual_attr, **argv, *tmp, **matches, *plugin_id;
+ int i, j, count, argc, disposition, buffer_flags;
+ int ret, len;
+ plugin_id = state->plugin_desc->spd_id;
ret = format_parse_args(state, args, &argc, &argv);
if (ret != 0) {
- slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id,
+ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
"%s: error parsing arguments\n", fnname);
return -EINVAL;
}
if (argc < min_args) {
- slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id,
+ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
"%s: requires at least %d arguments\n",
fnname, min_args);
format_free_parsed_args(argv);
return -EINVAL;
}
/* Walk the list of values for the attribute. */
- matched = NULL;
+ matches = NULL;
count = 0;
values = NULL;
+ /* Find all of the matching values. */
if (slapi_vattr_values_get(e, argv[0], &values,
&disposition, &actual_attr,
0, &buffer_flags) == 0) {
- for (i = slapi_valueset_first_value(values, &value);
- i != -1;
- i = slapi_valueset_next_value(values, i, &value)) {
- cvalue = slapi_value_get_string(value);
- tmp = match_fn(argv[1], cvalue, argv + 2);
- if (tmp != NULL) {
- count++;
- if (count > 1) {
- break;
+ matches = malloc(sizeof(char *) *
+ (slapi_valueset_count(values) + 1));
+ if (matches != NULL) {
+ for (i = slapi_valueset_first_value(values, &value);
+ i != -1;
+ i = slapi_valueset_next_value(values, i, &value)) {
+ cvalue = slapi_value_get_string(value);
+ matches[count] = match_fn(argv[1], cvalue,
+ argv + 2);
+ if (matches[count] != NULL) {
+ count++;
}
- free(matched);
- matched = tmp;
}
- }
- } else {
- if (argv[default_arg] != NULL) {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
- "%s: no values found for "
- "\"%s\", using default value \"%s\"\n",
- fnname, argv[1], argv[default_arg]);
- count = 1;
- matched = strdup(argv[default_arg]);
- } else {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
- "%s: no values found for "
- "\"%s\", and no default value\n",
- fnname, argv[1]);
+ matches[count] = NULL;
}
}
/* Make sure matched is either the single match, the default, or NULL
@@ -1015,46 +1003,87 @@ format_match_generic(struct plugin_state *state,
switch (count) {
case 0:
/* No matches. */
- if (argv[default_arg] != NULL) {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
+ if ((default_arg >= 0) && (argv[default_arg] != NULL)) {
+ /* Try to store the default. */
+ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
"%s: no matching values for "
"\"%s\", using default value \"%s\"\n",
fnname, argv[1], argv[default_arg]);
- matched = strdup(argv[default_arg]);
+ len = strlen(argv[default_arg]);
+ if (len > outbuf_len) {
+ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
+ "%s: out of space\n", fnname);
+ if (values != NULL) {
+ slapi_vattr_values_free(&values,
+ &actual_attr,
+ buffer_flags);
+ }
+ free(matches);
+ format_free_parsed_args(argv);
+ return -ENOBUFS;
+ }
+ memcpy(outbuf, argv[default_arg], len);
} else {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
+ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
"%s: no matching values for "
"\"%s\", and no default value\n",
fnname, argv[1]);
if (values != NULL) {
- slapi_vattr_values_free(&values, &actual_attr,
+ slapi_vattr_values_free(&values,
+ &actual_attr,
buffer_flags);
}
+ free(matches);
format_free_parsed_args(argv);
return -ENOENT;
}
break;
case 1:
- /* No errors. */
+ /* Single result. */
+ len = strlen(matches[0]);
+ if (len > outbuf_len) {
+ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
+ "%s: out of space\n", fnname);
+ if (values != NULL) {
+ slapi_vattr_values_free(&values,
+ &actual_attr,
+ buffer_flags);
+ }
+ free(matches[0]);
+ free(matches);
+ format_free_parsed_args(argv);
+ return -ENOBUFS;
+ }
+ memcpy(outbuf, matches[0], len);
break;
default:
if (outbuf_choices == NULL) {
- /* Too many matches. */
+ /* Too many matches to store. */
if (argv[default_arg] != NULL) {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
+ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
"%s: too many matching values "
"for \"%s\", using default "
"value \"%s\"\n",
fnname, argv[1],
argv[default_arg]);
- free(matched);
- matched = strdup(argv[default_arg]);
+ len = strlen(argv[default_arg]);
+ if (len > outbuf_len) {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ plugin_id,
+ "%s: out of space\n",
+ fnname);
+ if (values != NULL) {
+ slapi_vattr_values_free(&values,
+ &actual_attr,
+ buffer_flags);
+ }
+ free(matches);
+ format_free_parsed_args(argv);
+ return -ENOBUFS;
+ }
+ memcpy(outbuf, argv[default_arg], len);
} else {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
+ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
"%s: too many matching values "
"for \"%s\", and no default "
"value\n", fnname, argv[1]);
@@ -1063,32 +1092,30 @@ format_match_generic(struct plugin_state *state,
&actual_attr,
buffer_flags);
}
- free(matched);
+ for (i = 0; i < count; i++) {
+ free(matches[i]);
+ }
+ free(matches);
format_free_parsed_args(argv);
return -ENOENT;
}
} else {
- /* XXX */
+ /* Record the set of matching values as choices at this
+ * location. */
+ format_add_choice(outbuf_choices, outbuf, matches);
+ len = 0;
}
break;
}
- len = strlen(matched);
- if (len > outbuf_len) {
- slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id,
- "%s: out of space\n", fnname);
- if (values != NULL) {
- slapi_vattr_values_free(&values, &actual_attr,
- buffer_flags);
- }
- free(matched);
- format_free_parsed_args(argv);
- return -ENOBUFS;
- }
- memcpy(outbuf, matched, len);
if (values != NULL) {
slapi_vattr_values_free(&values, &actual_attr, buffer_flags);
}
- free(matched);
+ if (matches != NULL) {
+ for (i = 0; i < count; i++) {
+ free(matches[i]);
+ }
+ free(matches);
+ }
format_free_parsed_args(argv);
return len;
}