diff options
| author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-06-25 17:40:08 -0400 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-06-25 17:40:08 -0400 |
| commit | fb478622e9e31721350fdfdec1f78cd544e6ff72 (patch) | |
| tree | c59ef603f395ab25a9040ab836a9da857d7736fa /src/format.c | |
| parent | 426d0e119a45f04baab4f007fe6526724a905edb (diff) | |
- make matching operators work correctly when choices can be used
Diffstat (limited to 'src/format.c')
| -rw-r--r-- | src/format.c | 153 |
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; } |
