From 41e822448b5b67e41d972c57a2fae30ee54ff539 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Mon, 16 Mar 2015 09:52:38 +0000 Subject: [PATCH] libxlu: introduce new APIs These APIs can be used to manipulate XLU_ConfigValue and XLU_ConfigList. APIs introduced: 1. xlu_cfg_value_type 2. xlu_cfg_value_get_string 3. xlu_cfg_value_get_list 4. xlu_cfg_get_listitem2 Move some definitions from private header to public header as needed. Signed-off-by: Wei Liu Cc: Ian Jackson Cc: Ian Campbell Acked-by: Ian Jackson --- tools/libxl/libxlu_cfg.c | 47 +++++++++++++++++++++++++++++++++++ tools/libxl/libxlu_internal.h | 7 ------ tools/libxl/libxlutil.h | 13 ++++++++++ 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/tools/libxl/libxlu_cfg.c b/tools/libxl/libxlu_cfg.c index 938ea9611b..abf6b06dfa 100644 --- a/tools/libxl/libxlu_cfg.c +++ b/tools/libxl/libxlu_cfg.c @@ -199,6 +199,53 @@ static int find_atom(const XLU_Config *cfg, const char *n, return 0; } + +enum XLU_ConfigValueType xlu_cfg_value_type(const XLU_ConfigValue *value) +{ + return value->type; +} + +int xlu_cfg_value_get_string(const XLU_Config *cfg, XLU_ConfigValue *value, + char **value_r, int dont_warn) +{ + if (value->type != XLU_STRING) { + if (!dont_warn) + fprintf(cfg->report, + "%s:%d:%d: warning: value is not a string\n", + cfg->config_source, value->loc.first_line, + value->loc.first_column); + *value_r = NULL; + return EINVAL; + } + + *value_r = value->u.string; + return 0; +} + +int xlu_cfg_value_get_list(const XLU_Config *cfg, XLU_ConfigValue *value, + XLU_ConfigList **value_r, int dont_warn) +{ + if (value->type != XLU_LIST) { + if (!dont_warn) + fprintf(cfg->report, + "%s:%d:%d: warning: value is not a list\n", + cfg->config_source, value->loc.first_line, + value->loc.first_column); + *value_r = NULL; + return EINVAL; + } + + *value_r = &value->u.list; + return 0; +} + +XLU_ConfigValue *xlu_cfg_get_listitem2(const XLU_ConfigList *list, + int entry) +{ + if (entry < 0 || entry >= list->nvalues) return NULL; + return list->values[entry]; +} + int xlu_cfg_get_string(const XLU_Config *cfg, const char *n, const char **value_r, int dont_warn) { XLU_ConfigSetting *set; diff --git a/tools/libxl/libxlu_internal.h b/tools/libxl/libxlu_internal.h index 600ff68e94..3451cfe645 100644 --- a/tools/libxl/libxlu_internal.h +++ b/tools/libxl/libxlu_internal.h @@ -25,13 +25,6 @@ #include "libxlutil.h" -enum XLU_ConfigValueType { - XLU_STRING, - XLU_LIST, -}; - -typedef struct XLU_ConfigValue XLU_ConfigValue; - typedef struct XLU_ConfigList { int avalues; /* available slots */ int nvalues; /* actual occupied slots */ diff --git a/tools/libxl/libxlutil.h b/tools/libxl/libxlutil.h index 0333e55ba7..989605a540 100644 --- a/tools/libxl/libxlutil.h +++ b/tools/libxl/libxlutil.h @@ -20,9 +20,15 @@ #include "libxl.h" +enum XLU_ConfigValueType { + XLU_STRING, + XLU_LIST, +}; + /* Unless otherwise stated, all functions return an errno value. */ typedef struct XLU_Config XLU_Config; typedef struct XLU_ConfigList XLU_ConfigList; +typedef struct XLU_ConfigValue XLU_ConfigValue; XLU_Config *xlu_cfg_init(FILE *report, const char *report_filename); /* 0 means we got ENOMEM. */ @@ -66,6 +72,13 @@ const char *xlu_cfg_get_listitem(const XLU_ConfigList*, int entry); /* xlu_cfg_get_listitem cannot fail, except that if entry is * out of range it returns 0 (not setting errno) */ +enum XLU_ConfigValueType xlu_cfg_value_type(const XLU_ConfigValue *value); +int xlu_cfg_value_get_string(const XLU_Config *cfg, XLU_ConfigValue *value, + char **value_r, int dont_warn); +int xlu_cfg_value_get_list(const XLU_Config *cfg, XLU_ConfigValue *value, + XLU_ConfigList **value_r, int dont_warn); +XLU_ConfigValue *xlu_cfg_get_listitem2(const XLU_ConfigList *list, + int entry); /* * Disk specification parsing. -- 2.30.2