From 3b1422c45c6c782f5134e74439ccdd6766085d4c Mon Sep 17 00:00:00 2001 From: Peter Rajnoha Date: Wed, 20 May 2015 18:47:54 +0200 Subject: [PATCH] report: call appropriate handler to evaluate fuzzy reserved names and dynamic reserved values Wire the dm_report_reserved_handler instance call in reporting/selection infrastructure to handle reserved value actions (currently only DM_REPORT_RESERVED_PARSE_FUZZY_NAME and DM_REPORT_RESERVED_GET_DYNAMIC_VALUE actions). --- lib/report/report.c | 8 +++++ libdm/libdm-report.c | 69 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/lib/report/report.c b/lib/report/report.c index 2e9a5d392..4d1b8eb57 100644 --- a/lib/report/report.c +++ b/lib/report/report.c @@ -96,6 +96,8 @@ static const int32_t _reserved_num_undef_32 = INT32_C(-1); * - 'reserved_value_id_n' (for 0) */ #define NUM uint64_t +#define NUM_HND dm_report_reserved_handler +#define HND (dm_report_reserved_handler) #define NOFLAG 0 #define NAMED DM_REPORT_FIELD_RESERVED_VALUE_NAMED #define RANGE DM_REPORT_FIELD_RESERVED_VALUE_RANGE @@ -117,6 +119,8 @@ static const int32_t _reserved_num_undef_32 = INT32_C(-1); #include "values.h" #undef NUM +#undef NUM_HND +#undef HND #undef NOFLAG #undef NAMED #undef RANGE @@ -134,6 +138,8 @@ static const int32_t _reserved_num_undef_32 = INT32_C(-1); */ #define NUM DM_REPORT_FIELD_TYPE_NUMBER +#define NUM_HND DM_REPORT_FIELD_TYPE_NUMBER +#define HND 0 #define NOFLAG 0 #define NAMED DM_REPORT_FIELD_RESERVED_VALUE_NAMED #define RANGE DM_REPORT_FIELD_RESERVED_VALUE_RANGE @@ -154,6 +160,8 @@ static const struct dm_report_reserved_value _report_reserved_values[] = { }; #undef NUM +#undef NUM_HND +#undef HND #undef NOFLAG #undef NAMED #undef RANGE diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c index 559d46307..2ec98d697 100644 --- a/libdm/libdm-report.c +++ b/libdm/libdm-report.c @@ -2123,14 +2123,48 @@ static const char *_tok_value_string(const char *s, return s; } -static const char *_reserved_name(const char **names, const char *s, size_t len) +static const char *_reserved_name(struct dm_report *rh, + const struct dm_report_reserved_value *reserved, + const struct dm_report_field_reserved_value *frv, + uint32_t field_num, const char *s, size_t len) { - const char **name = names; + dm_report_reserved_handler handler; + const char *canonical_name; + const char **name; + char *tmp_s; + char c; + int r; + + name = reserved->names; while (*name) { if ((strlen(*name) == len) && !strncmp(*name, s, len)) return *name; name++; } + + if (reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_FUZZY_NAMES) { + handler = (dm_report_reserved_handler) frv ? frv->value : reserved->value; + c = s[len]; + tmp_s = (char *) s; + tmp_s[len] = '\0'; + if ((r = handler(rh, rh->selection->mem, field_num, + DM_REPORT_RESERVED_PARSE_FUZZY_NAME, + tmp_s, (const void **) &canonical_name)) <= 0) { + if (r == -1) + log_error(INTERNAL_ERROR "%s reserved value handler for field %s has missing " + "implementation of DM_REPORT_RESERVED_PARSE_FUZZY_NAME action", + (reserved->type & DM_REPORT_FIELD_TYPE_MASK) ? "type-specific" : "field-specific", + rh->fields[field_num].id); + else + log_error("Error occured while processing %s reserved value handler for field %s", + (reserved->type & DM_REPORT_FIELD_TYPE_MASK) ? "type-specific" : "field-specific", + rh->fields[field_num].id); + } + tmp_s[len] = c; + if (r && canonical_name) + return canonical_name; + } + return NULL; } @@ -2144,6 +2178,7 @@ static const char *_get_reserved(struct dm_report *rh, unsigned type, struct reserved_value_wrapper *rvw) { const struct dm_report_reserved_value *iter = implicit ? NULL : rh->reserved_values; + const struct dm_report_field_reserved_value *frv; const char *tmp_begin, *tmp_end, *tmp_s = s; const char *name = NULL; char c; @@ -2160,12 +2195,14 @@ static const char *_get_reserved(struct dm_report *rh, unsigned type, while (iter->value) { if (!(iter->type & DM_REPORT_FIELD_TYPE_MASK)) { /* DM_REPORT_FIELD_TYPE_NONE - per-field reserved value */ - if (((((const struct dm_report_field_reserved_value *) iter->value)->field_num) == field_num) && - (name = _reserved_name(iter->names, tmp_begin, tmp_end - tmp_begin))) + frv = (const struct dm_report_field_reserved_value *) iter->value; + if ((frv->field_num == field_num) && (name = _reserved_name(rh, iter, frv, field_num, + tmp_begin, tmp_end - tmp_begin))) break; } else if (iter->type & type) { /* DM_REPORT_FIELD_TYPE_* - per-type reserved value */ - if ((name = _reserved_name(iter->names, tmp_begin, tmp_end - tmp_begin))) + if ((name = _reserved_name(rh, iter, NULL, field_num, + tmp_begin, tmp_end - tmp_begin))) break; } iter++; @@ -3115,6 +3152,8 @@ static int _get_reserved_value(struct dm_report *rh, uint32_t field_num, struct reserved_value_wrapper *rvw) { const void *tmp_value; + dm_report_reserved_handler handler; + int r; if (!rvw->reserved) { rvw->value = NULL; @@ -3122,10 +3161,30 @@ static int _get_reserved_value(struct dm_report *rh, uint32_t field_num, } if (rvw->reserved->type & DM_REPORT_FIELD_TYPE_MASK) + /* type reserved value */ tmp_value = rvw->reserved->value; else + /* per-field reserved value */ tmp_value = ((const struct dm_report_field_reserved_value *) rvw->reserved->value)->value; + if (rvw->reserved->type & (DM_REPORT_FIELD_RESERVED_VALUE_DYNAMIC_VALUE | DM_REPORT_FIELD_RESERVED_VALUE_FUZZY_NAMES)) { + handler = (dm_report_reserved_handler) tmp_value; + if ((r = handler(rh, rh->selection->mem, field_num, + DM_REPORT_RESERVED_GET_DYNAMIC_VALUE, + rvw->matched_name, &tmp_value) <= 0)) { + if (r == -1) + log_error(INTERNAL_ERROR "%s reserved value handler for field %s has missing" + "implementation of DM_REPORT_RESERVED_GET_DYNAMIC_VALUE action", + (rvw->reserved->type) & DM_REPORT_FIELD_TYPE_MASK ? "type-specific" : "field-specific", + rh->fields[field_num].id); + else + log_error("Error occured while processing %s reserved value handler for field %s", + (rvw->reserved->type) & DM_REPORT_FIELD_TYPE_MASK ? "type-specific" : "field-specific", + rh->fields[field_num].id); + return 0; + } + } + rvw->value = tmp_value; return 1; } -- 2.43.5