diff options
author | Alasdair Kergon <agk@redhat.com> | 2007-04-19 20:24:00 +0000 |
---|---|---|
committer | Alasdair Kergon <agk@redhat.com> | 2007-04-19 20:24:00 +0000 |
commit | 7b74504f40eeacaebdb6fbdea4962c3d560493c1 (patch) | |
tree | c486f27f5072c9f301f5ce446d503105b2e3cc89 /libdm/libdm-report.c | |
parent | 0329281b49d4f7208f4e6693e560add6c1154130 (diff) | |
download | lvm2-7b74504f40eeacaebdb6fbdea4962c3d560493c1.tar.gz lvm2-7b74504f40eeacaebdb6fbdea4962c3d560493c1.tar.xz lvm2-7b74504f40eeacaebdb6fbdea4962c3d560493c1.zip |
Introduce _add_field() and _is_same_field() to libdm-report.c.
Diffstat (limited to 'libdm/libdm-report.c')
-rw-r--r-- | libdm/libdm-report.c | 108 |
1 files changed, 60 insertions, 48 deletions
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c index 18c61921..1423872c 100644 --- a/libdm/libdm-report.c +++ b/libdm/libdm-report.c @@ -296,36 +296,67 @@ static int _copy_field(struct dm_report *rh, struct field_properties *dest, return 1; } -static int _field_match(struct dm_report *rh, const char *field, size_t flen) +static struct field_properties * _add_field(struct dm_report *rh, + uint32_t field_num, uint32_t flags) { - uint32_t f, l; struct field_properties *fp; - if (!flen) - return 0; + rh->report_types |= rh->fields[field_num].type; - for (f = 0; rh->fields[f].report_fn; f++) { - if ((!strncasecmp(rh->fields[f].id, field, flen) && - strlen(rh->fields[f].id) == flen) || - (l = strlen(rh->field_prefix), - !strncasecmp(rh->field_prefix, rh->fields[f].id, l) && - !strncasecmp(rh->fields[f].id + l, field, flen) && - strlen(rh->fields[f].id) == l + flen)) { - rh->report_types |= rh->fields[f].type; - if (!(fp = dm_pool_zalloc(rh->mem, sizeof(*fp)))) { - log_error("dm_report: " - "struct field_properties allocation " - "failed"); - return 0; - } - if (!_copy_field(rh, fp, f)) - return 0; + if (!(fp = dm_pool_zalloc(rh->mem, sizeof(struct field_properties)))) { + log_error("dm_report: struct field_properties allocation " + "failed"); + return NULL; + } - list_add(&rh->field_props, &fp->list); - return 1; - } + if (!_copy_field(rh, fp, field_num)) { + stack; + dm_pool_free(rh->mem, fp); + return NULL; } + fp->flags |= flags; + list_add(&rh->field_props, &fp->list); + + return fp; +} + +/* + * Compare name1 against name2 or prefix plus name2 + * name2 is not necessarily null-terminated. + * len2 is the length of name2. + */ +static int _is_same_field(const char *name1, const char *name2, + size_t len2, const char *prefix) +{ + size_t prefix_len; + + /* Exact match? */ + if (!strncasecmp(name1, name2, len2) && strlen(name1) == len2) + return 1; + + /* Match including prefix? */ + prefix_len = strlen(prefix); + if (!strncasecmp(prefix, name1, prefix_len) && + !strncasecmp(name1 + prefix_len, name2, len2) && + strlen(name1) == prefix_len + len2) + return 1; + + return 0; +} + +static int _field_match(struct dm_report *rh, const char *field, size_t flen) +{ + uint32_t f; + + if (!flen) + return 0; + + for (f = 0; rh->fields[f].report_fn; f++) + if (_is_same_field(rh->fields[f].id, field, flen, + rh->field_prefix)) + return _add_field(rh, f, 0) ? 1 : 0; + return 0; } @@ -341,21 +372,8 @@ static int _add_sort_key(struct dm_report *rh, uint32_t field_num, } } - if (!found) { - rh->report_types |= rh->fields[field_num].type; - if (!(found = dm_pool_zalloc(rh->mem, sizeof(*found)))) { - log_error("dm_report: " - "struct field_properties allocation failed"); - return 0; - } - if (!_copy_field(rh, found, field_num)) - return 0; - - /* Add as a non-display field */ - found->flags |= FLD_HIDDEN; - - list_add(&rh->field_props, &found->list); - } + if (!found && !(found = _add_field(rh, field_num, FLD_HIDDEN))) + return_0; if (found->flags & FLD_SORT_KEY) { log_error("dm_report: Ignoring duplicate sort field: %s", @@ -372,7 +390,7 @@ static int _add_sort_key(struct dm_report *rh, uint32_t field_num, static int _key_match(struct dm_report *rh, const char *key, size_t len) { - uint32_t f, l; + uint32_t f; uint32_t flags; if (!len) @@ -394,16 +412,10 @@ static int _key_match(struct dm_report *rh, const char *key, size_t len) return 0; } - for (f = 0; rh->fields[f].report_fn; f++) { - if ((!strncasecmp(rh->fields[f].id, key, len) && - strlen(rh->fields[f].id) == len) || - (l = strlen(rh->field_prefix), - !strncasecmp(rh->field_prefix, rh->fields[f].id, l) && - !strncasecmp(rh->fields[f].id + l, key, len) && - strlen(rh->fields[f].id) == l + len)) { + for (f = 0; rh->fields[f].report_fn; f++) + if (_is_same_field(rh->fields[f].id, key, len, + rh->field_prefix)) return _add_sort_key(rh, f, flags); - } - } return 0; } |