1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-02-01 09:47:48 +03:00

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).
This commit is contained in:
Peter Rajnoha 2015-05-20 18:47:54 +02:00
parent 335707b0e2
commit 3b1422c45c
2 changed files with 72 additions and 5 deletions

View File

@ -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

View File

@ -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;
}