summaryrefslogtreecommitdiffstats
path: root/libdm/libdm-report.c
diff options
context:
space:
mode:
authorAlasdair Kergon <agk@redhat.com>2007-04-19 20:24:00 +0000
committerAlasdair Kergon <agk@redhat.com>2007-04-19 20:24:00 +0000
commit7b74504f40eeacaebdb6fbdea4962c3d560493c1 (patch)
treec486f27f5072c9f301f5ce446d503105b2e3cc89 /libdm/libdm-report.c
parent0329281b49d4f7208f4e6693e560add6c1154130 (diff)
downloadlvm2-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.c108
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;
}