Create a helper routine in order to parse the 'device' string contained
within the generated 'lvs' output string.
A future patch would then be able to avoid the code more cleanly
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/storage/storage_backend_logical.c | 186 +++++++++++++++++++---------------
1 file changed, 104 insertions(+), 82 deletions(-)
diff --git a/src/storage/storage_backend_logical.c
b/src/storage/storage_backend_logical.c
index 76ea00a..bf67faf 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -72,21 +72,115 @@ struct virStorageBackendLogicalPoolVolData {
};
static int
-virStorageBackendLogicalMakeVol(char **const groups,
- void *opaque)
+virStorageBackendLogicalParseVolDevice(virStorageVolDefPtr vol,
+ char **const groups,
+ int nextents,
+ unsigned long long size,
+ unsigned long long length)
{
- struct virStorageBackendLogicalPoolVolData *data = opaque;
- virStoragePoolObjPtr pool = data->pool;
- virStorageVolDefPtr vol = NULL;
- bool is_new_vol = false;
- unsigned long long offset, size, length;
+ int ret = -1;
const char *regex_unit = "(\\S+)\\((\\S+)\\)";
char *regex = NULL;
regex_t *reg = NULL;
regmatch_t *vars = NULL;
char *p = NULL;
size_t i;
- int err, nextents, nvars, ret = -1;
+ int err, nvars;
+ unsigned long long offset;
+
+ if (VIR_STRDUP(regex, regex_unit) < 0)
+ goto cleanup;
+
+ for (i = 1; i < nextents; i++) {
+ if (VIR_REALLOC_N(regex, strlen(regex) + strlen(regex_unit) + 2) < 0)
+ goto cleanup;
+ /* "," is the separator of "devices" field */
+ strcat(regex, ",");
+ strncat(regex, regex_unit, strlen(regex_unit));
+ }
+
+ if (VIR_ALLOC(reg) < 0)
+ goto cleanup;
+
+ /* Each extent has a "path:offset" pair, and vars[0] will
+ * be the whole matched string.
+ */
+ nvars = (nextents * 2) + 1;
+ if (VIR_ALLOC_N(vars, nvars) < 0)
+ goto cleanup;
+
+ err = regcomp(reg, regex, REG_EXTENDED);
+ if (err != 0) {
+ char error[100];
+ regerror(err, reg, error, sizeof(error));
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to compile regex %s"),
+ error);
+ goto cleanup;
+ }
+
+ err = regexec(reg, groups[3], nvars, vars, 0);
+ regfree(reg);
+ if (err != 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed volume extent devices value"));
+ goto cleanup;
+ }
+
+ p = groups[3];
+
+ /* vars[0] is skipped */
+ for (i = 0; i < nextents; i++) {
+ size_t j;
+ int len;
+ char *offset_str = NULL;
+
+ j = (i * 2) + 1;
+ len = vars[j].rm_eo - vars[j].rm_so;
+ p[vars[j].rm_eo] = '\0';
+
+ if (VIR_STRNDUP(vol->source.extents[vol->source.nextent].path,
+ p + vars[j].rm_so, len) < 0)
+ goto cleanup;
+
+ len = vars[j + 1].rm_eo - vars[j + 1].rm_so;
+ if (VIR_STRNDUP(offset_str, p + vars[j + 1].rm_so, len) < 0)
+ goto cleanup;
+
+ if (virStrToLong_ull(offset_str, NULL, 10, &offset) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed volume extent offset value"));
+ VIR_FREE(offset_str);
+ goto cleanup;
+ }
+
+ VIR_FREE(offset_str);
+
+ vol->source.extents[vol->source.nextent].start = offset * size;
+ vol->source.extents[vol->source.nextent].end = (offset * size) + length;
+ vol->source.nextent++;
+ }
+
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(regex);
+ VIR_FREE(reg);
+ VIR_FREE(vars);
+ return ret;
+}
+
+
+static int
+virStorageBackendLogicalMakeVol(char **const groups,
+ void *opaque)
+{
+ struct virStorageBackendLogicalPoolVolData *data = opaque;
+ virStoragePoolObjPtr pool = data->pool;
+ virStorageVolDefPtr vol = NULL;
+ bool is_new_vol = false;
+ unsigned long long size, length;
+ int nextents, ret = -1;
const char *attrs = groups[9];
/* Skip inactive volume */
@@ -196,78 +290,9 @@ virStorageBackendLogicalMakeVol(char **const groups,
}
/* Now parse the "devices" field separately */
- if (VIR_STRDUP(regex, regex_unit) < 0)
- goto cleanup;
-
- for (i = 1; i < nextents; i++) {
- if (VIR_REALLOC_N(regex, strlen(regex) + strlen(regex_unit) + 2) < 0)
- goto cleanup;
- /* "," is the separator of "devices" field */
- strcat(regex, ",");
- strncat(regex, regex_unit, strlen(regex_unit));
- }
-
- if (VIR_ALLOC(reg) < 0)
- goto cleanup;
-
- /* Each extent has a "path:offset" pair, and vars[0] will
- * be the whole matched string.
- */
- nvars = (nextents * 2) + 1;
- if (VIR_ALLOC_N(vars, nvars) < 0)
- goto cleanup;
-
- err = regcomp(reg, regex, REG_EXTENDED);
- if (err != 0) {
- char error[100];
- regerror(err, reg, error, sizeof(error));
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Failed to compile regex %s"),
- error);
- goto cleanup;
- }
-
- err = regexec(reg, groups[3], nvars, vars, 0);
- regfree(reg);
- if (err != 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("malformed volume extent devices value"));
+ if (virStorageBackendLogicalParseVolDevice(vol, groups, nextents,
+ size, length) < 0)
goto cleanup;
- }
-
- p = groups[3];
-
- /* vars[0] is skipped */
- for (i = 0; i < nextents; i++) {
- size_t j;
- int len;
- char *offset_str = NULL;
-
- j = (i * 2) + 1;
- len = vars[j].rm_eo - vars[j].rm_so;
- p[vars[j].rm_eo] = '\0';
-
- if (VIR_STRNDUP(vol->source.extents[vol->source.nextent].path,
- p + vars[j].rm_so, len) < 0)
- goto cleanup;
-
- len = vars[j + 1].rm_eo - vars[j + 1].rm_so;
- if (VIR_STRNDUP(offset_str, p + vars[j + 1].rm_so, len) < 0)
- goto cleanup;
-
- if (virStrToLong_ull(offset_str, NULL, 10, &offset) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("malformed volume extent offset value"));
- VIR_FREE(offset_str);
- goto cleanup;
- }
-
- VIR_FREE(offset_str);
-
- vol->source.extents[vol->source.nextent].start = offset * size;
- vol->source.extents[vol->source.nextent].end = (offset * size) + length;
- vol->source.nextent++;
- }
if (is_new_vol &&
VIR_APPEND_ELEMENT(pool->volumes.objs, pool->volumes.count, vol) < 0)
@@ -276,9 +301,6 @@ virStorageBackendLogicalMakeVol(char **const groups,
ret = 0;
cleanup:
- VIR_FREE(regex);
- VIR_FREE(reg);
- VIR_FREE(vars);
if (is_new_vol && (ret == -1))
virStorageVolDefFree(vol);
return ret;
--
2.5.0