diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c index 57a86e4e2..dc0c92a25 100644 --- a/daemons/lvmetad/lvmetad-core.c +++ b/daemons/lvmetad/lvmetad-core.c @@ -26,9 +26,6 @@ #include #include -#include /* fabs() */ -#include /* DBL_EPSILON */ - #define LVMETAD_SOCKET DEFAULT_RUN_DIR "/lvmetad.socket" typedef struct { @@ -569,60 +566,6 @@ bad: return reply_fail("out of memory"); } -/* Test if the doubles are close enough to be considered equal */ -static int close_enough(double d1, double d2) -{ - return fabs(d1 - d2) < DBL_EPSILON; -} - -static int compare_value(struct dm_config_value *a, struct dm_config_value *b) -{ - int r = 0; - - if (a->type > b->type) - return 1; - if (a->type < b->type) - return -1; - - switch (a->type) { - case DM_CFG_STRING: r = strcmp(a->v.str, b->v.str); break; - case DM_CFG_FLOAT: r = close_enough(a->v.f, b->v.f) ? 0 : (a->v.f > b->v.f) ? 1 : -1; break; - case DM_CFG_INT: r = (a->v.i == b->v.i) ? 0 : (a->v.i > b->v.i) ? 1 : -1; break; - case DM_CFG_EMPTY_ARRAY: return 0; - } - - if (r == 0 && a->next && b->next) - r = compare_value(a->next, b->next); - return r; -} - -static int compare_config(struct dm_config_node *a, struct dm_config_node *b) -{ - int result = 0; - if (a->v && b->v) - result = compare_value(a->v, b->v); - if (a->v && !b->v) - result = 1; - if (!a->v && b->v) - result = -1; - if (a->child && b->child) - result = compare_config(a->child, b->child); - - if (result) { - // DEBUGLOG("config inequality at %s / %s", a->key, b->key); - return result; - } - - if (a->sib && b->sib) - result = compare_config(a->sib, b->sib); - if (a->sib && !b->sib) - result = 1; - if (!a->sib && b->sib) - result = -1; - - return result; -} - static int vg_remove_if_missing(lvmetad_state *s, const char *vgid, int update_pvids); enum update_pvid_mode { UPDATE_ONLY, REMOVE_EMPTY, MARK_OUTDATED }; diff --git a/libdaemon/client/config-util.c b/libdaemon/client/config-util.c index 4ebbe1bc2..067c9126a 100644 --- a/libdaemon/client/config-util.c +++ b/libdaemon/client/config-util.c @@ -20,6 +20,9 @@ #include #include +#include /* fabs() */ +#include /* DBL_EPSILON */ + int buffer_append_vf(struct buffer *buf, va_list ap) { char *append; @@ -277,6 +280,60 @@ struct dm_config_node *config_make_nodes(struct dm_config_tree *cft, return res; } +/* Test if the doubles are close enough to be considered equal */ +static int close_enough(double d1, double d2) +{ + return fabs(d1 - d2) < DBL_EPSILON; +} + +static int compare_value(struct dm_config_value *a, struct dm_config_value *b) +{ + int r = 0; + + if (a->type > b->type) + return 1; + if (a->type < b->type) + return -1; + + switch (a->type) { + case DM_CFG_STRING: r = strcmp(a->v.str, b->v.str); break; + case DM_CFG_FLOAT: r = close_enough(a->v.f, b->v.f) ? 0 : (a->v.f > b->v.f) ? 1 : -1; break; + case DM_CFG_INT: r = (a->v.i == b->v.i) ? 0 : (a->v.i > b->v.i) ? 1 : -1; break; + case DM_CFG_EMPTY_ARRAY: return 0; + } + + if (r == 0 && a->next && b->next) + r = compare_value(a->next, b->next); + return r; +} + +int compare_config(struct dm_config_node *a, struct dm_config_node *b) +{ + int result = 0; + if (a->v && b->v) + result = compare_value(a->v, b->v); + if (a->v && !b->v) + result = 1; + if (!a->v && b->v) + result = -1; + if (a->child && b->child) + result = compare_config(a->child, b->child); + + if (result) { + // DEBUGLOG("config inequality at %s / %s", a->key, b->key); + return result; + } + + if (a->sib && b->sib) + result = compare_config(a->sib, b->sib); + if (a->sib && !b->sib) + result = 1; + if (!a->sib && b->sib) + result = -1; + + return result; +} + int buffer_realloc(struct buffer *buf, int needed) { char *new; diff --git a/libdaemon/client/config-util.h b/libdaemon/client/config-util.h index 58468ef54..3e0a23f17 100644 --- a/libdaemon/client/config-util.h +++ b/libdaemon/client/config-util.h @@ -46,6 +46,8 @@ struct dm_config_node *make_config_node(struct dm_config_tree *cft, struct dm_config_node *parent, struct dm_config_node *pre_sib); +int compare_config(struct dm_config_node *a, struct dm_config_node *b); + struct dm_config_node *make_text_node(struct dm_config_tree *cft, const char *key, const char *value,