summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2015-06-30 10:23:35 +0200
committerPeter Rajnoha <prajnoha@redhat.com>2015-06-30 10:47:51 +0200
commitd7b9349ce71f2747eb7d0a8992244bc3d34719be (patch)
treeed688bb55c9bd4a32b07808bb0aed5ee664eb183
parentd8996a17d1a0605cebfcf926a7a8d0e6b7fc1fcc (diff)
downloadlvm2-d7b9349ce71f2747eb7d0a8992244bc3d34719be.tar.gz
cleanup: report: use internal wrapper for various variables used for handling reserved values
Just a cleanup - wrap several variables we use to handle reserved values into a structure for easier manipulation in the code.
-rw-r--r--libdm/libdm-report.c93
1 files changed, 57 insertions, 36 deletions
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 401e87a0d..4348db1f8 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -188,6 +188,12 @@ struct selection_node {
} selection;
};
+struct reserved_value_wrapper {
+ const char *matched_name;
+ const struct dm_report_reserved_value *reserved;
+ const void *value;
+};
+
/*
* Report data field
*/
@@ -2080,14 +2086,14 @@ static const char *_reserved_name(const char **names, const char *s, size_t len)
static const char *_get_reserved(struct dm_report *rh, unsigned type,
uint32_t field_num, int implicit,
const char *s, const char **begin, const char **end,
- const struct dm_report_reserved_value **reserved)
+ struct reserved_value_wrapper *rvw)
{
const struct dm_report_reserved_value *iter = implicit ? NULL : rh->reserved_values;
const char *tmp_begin, *tmp_end, *tmp_s = s;
const char *name = NULL;
char c;
- *reserved = NULL;
+ rvw->reserved = NULL;
if (!iter)
return s;
@@ -2115,7 +2121,8 @@ static const char *_get_reserved(struct dm_report *rh, unsigned type,
*begin = tmp_begin;
*end = tmp_end;
s = tmp_s;
- *reserved = iter;
+ rvw->reserved = iter;
+ rvw->matched_name = name;
}
return s;
@@ -2213,10 +2220,10 @@ static const char *_tok_value_regex(struct dm_report *rh,
const struct dm_report_field_type *ft,
const char *s, const char **begin,
const char **end, uint32_t *flags,
- const struct dm_report_reserved_value **reserved)
+ struct reserved_value_wrapper *rvw)
{
char c;
- *reserved = NULL;
+ rvw->reserved = NULL;
s = _skip_space(s);
@@ -2439,7 +2446,7 @@ static const char *_tok_value(struct dm_report *rh,
const char *s,
const char **begin, const char **end,
uint32_t *flags,
- const struct dm_report_reserved_value **reserved,
+ struct reserved_value_wrapper *rvw,
struct dm_pool *mem, void *custom)
{
int expected_type = ft->flags & DM_REPORT_FIELD_TYPE_MASK;
@@ -2450,8 +2457,8 @@ static const char *_tok_value(struct dm_report *rh,
s = _skip_space(s);
- s = _get_reserved(rh, expected_type, field_num, implicit, s, begin, end, reserved);
- if (*reserved) {
+ s = _get_reserved(rh, expected_type, field_num, implicit, s, begin, end, rvw);
+ if (rvw->reserved) {
*flags |= expected_type;
return s;
}
@@ -2553,12 +2560,23 @@ static const char *_tok_field_name(const char *s,
return s;
}
-static const void *_get_reserved_value(const struct dm_report_reserved_value *reserved)
+static int _get_reserved_value(struct dm_report *rh, uint32_t field_num,
+ struct reserved_value_wrapper *rvw)
{
- if (reserved->type & DM_REPORT_FIELD_TYPE_MASK)
- return reserved->value;
+ const void *tmp_value;
+
+ if (!rvw->reserved) {
+ rvw->value = NULL;
+ return 1;
+ }
+
+ if (rvw->reserved->type & DM_REPORT_FIELD_TYPE_MASK)
+ tmp_value = rvw->reserved->value;
else
- return ((const struct dm_report_field_reserved_value *) reserved->value)->value;
+ tmp_value = ((const struct dm_report_field_reserved_value *) rvw->reserved->value)->value;
+
+ rvw->value = tmp_value;
+ return 1;
}
static struct field_selection *_create_field_selection(struct dm_report *rh,
@@ -2567,7 +2585,7 @@ static struct field_selection *_create_field_selection(struct dm_report *rh,
const char *v,
size_t len,
uint32_t flags,
- const struct dm_report_reserved_value *reserved,
+ struct reserved_value_wrapper *rvw,
void *custom)
{
static const char *_out_of_range_msg = "Field selection value %s out of supported range for field %s.";
@@ -2576,7 +2594,6 @@ static struct field_selection *_create_field_selection(struct dm_report *rh,
: rh->fields;
struct field_properties *fp, *found = NULL;
struct field_selection *fs;
- const void *reserved_value;
const char *field_id;
uint64_t factor;
char *s;
@@ -2615,7 +2632,7 @@ static struct field_selection *_create_field_selection(struct dm_report *rh,
goto error;
}
- if (reserved && (reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE) &&
+ if (rvw->reserved && (rvw->reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE) &&
!(fs->value->next = dm_pool_zalloc(rh->selection->mem, sizeof(struct field_selection_value)))) {
log_error(_field_selection_value_alloc_failed_msg, field_id);
goto error;
@@ -2624,7 +2641,11 @@ static struct field_selection *_create_field_selection(struct dm_report *rh,
fs->fp = found;
fs->flags = flags;
- reserved_value = reserved ? _get_reserved_value(reserved) : NULL;
+ if (!_get_reserved_value(rh, field_num, rvw)) {
+ log_error("dm_report: could not get reserved value "
+ "while processing selection field %s", field_id);
+ goto error;
+ }
/* store comparison operand */
if (flags & FLD_CMP_REGEX) {
@@ -2654,10 +2675,10 @@ static struct field_selection *_create_field_selection(struct dm_report *rh,
switch (flags & DM_REPORT_FIELD_TYPE_MASK) {
case DM_REPORT_FIELD_TYPE_STRING:
- if (reserved_value) {
- fs->value->v.s = (const char *) reserved_value;
- if (reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE)
- fs->value->next->v.s = (((const char **) reserved_value)[1]);
+ if (rvw->value) {
+ fs->value->v.s = (const char *) rvw->value;
+ if (rvw->reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE)
+ fs->value->next->v.s = (((const char **) rvw->value)[1]);
dm_pool_free(rh->selection->mem, s);
} else {
fs->value->v.s = s;
@@ -2668,10 +2689,10 @@ static struct field_selection *_create_field_selection(struct dm_report *rh,
}
break;
case DM_REPORT_FIELD_TYPE_NUMBER:
- if (reserved_value) {
- fs->value->v.i = *(uint64_t *) reserved_value;
- if (reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE)
- fs->value->next->v.i = (((uint64_t *) reserved_value)[1]);
+ if (rvw->value) {
+ fs->value->v.i = *(uint64_t *) rvw->value;
+ if (rvw->reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE)
+ fs->value->next->v.i = (((uint64_t *) rvw->value)[1]);
} else {
if (((fs->value->v.i = strtoull(s, NULL, 10)) == ULLONG_MAX) &&
(errno == ERANGE)) {
@@ -2686,10 +2707,10 @@ static struct field_selection *_create_field_selection(struct dm_report *rh,
dm_pool_free(rh->selection->mem, s);
break;
case DM_REPORT_FIELD_TYPE_SIZE:
- if (reserved_value) {
- fs->value->v.d = *(double *) reserved_value;
- if (reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE)
- fs->value->next->v.d = (((double *) reserved_value)[1]);
+ if (rvw->value) {
+ fs->value->v.d = *(double *) rvw->value;
+ if (rvw->reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE)
+ fs->value->next->v.d = (((double *) rvw->value)[1]);
} else {
fs->value->v.d = strtod(s, NULL);
if (errno == ERANGE) {
@@ -2707,10 +2728,10 @@ static struct field_selection *_create_field_selection(struct dm_report *rh,
dm_pool_free(rh->selection->mem, s);
break;
case DM_REPORT_FIELD_TYPE_PERCENT:
- if (reserved_value) {
- fs->value->v.i = *(uint64_t *) reserved_value;
- if (reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE)
- fs->value->next->v.i = (((uint64_t *) reserved_value)[1]);
+ if (rvw->value) {
+ fs->value->v.i = *(uint64_t *) rvw->value;
+ if (rvw->reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_RANGE)
+ fs->value->next->v.i = (((uint64_t *) rvw->value)[1]);
} else {
fs->value->v.d = strtod(s, NULL);
if ((errno == ERANGE) || (fs->value->v.d < 0) || (fs->value->v.d > 100)) {
@@ -2868,7 +2889,7 @@ static struct selection_node *_parse_selection(struct dm_report *rh,
int implicit;
const struct dm_report_field_type *ft;
struct selection_str_list *str_list;
- const struct dm_report_reserved_value *reserved;
+ struct reserved_value_wrapper rvw = {0};
uint64_t factor;
void *custom = NULL;
char *tmp;
@@ -2931,7 +2952,7 @@ static struct selection_node *_parse_selection(struct dm_report *rh,
/* comparison value */
if (flags & FLD_CMP_REGEX) {
- if (!(last = _tok_value_regex(rh, ft, last, &vs, &ve, &flags, &reserved)))
+ if (!(last = _tok_value_regex(rh, ft, last, &vs, &ve, &flags, &rvw)))
goto_bad;
} else {
if (ft->flags == DM_REPORT_FIELD_TYPE_SIZE ||
@@ -2944,14 +2965,14 @@ static struct selection_node *_parse_selection(struct dm_report *rh,
custom = NULL;
if (!(last = _tok_value(rh, ft, field_num, implicit,
last, &vs, &ve, &flags,
- &reserved, rh->selection->mem, custom)))
+ &rvw, rh->selection->mem, custom)))
goto_bad;
}
*next = _skip_space(last);
/* create selection */
- if (!(fs = _create_field_selection(rh, field_num, implicit, vs, (size_t) (ve - vs), flags, reserved, custom)))
+ if (!(fs = _create_field_selection(rh, field_num, implicit, vs, (size_t) (ve - vs), flags, &rvw, custom)))
return_NULL;
/* create selection node */