diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index d125504b44..64c35c2bf3 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -1400,7 +1400,7 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool, const char **regex, int *nvars, virStorageBackendListVolRegexFunc func, - void *data) + void *data, const char *prefix) { int fd = -1, err, ret = -1; FILE *list = NULL; @@ -1460,13 +1460,20 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool, } while (fgets(line, sizeof(line), list) != NULL) { + char *p = NULL; /* Strip trailing newline */ int len = strlen(line); if (len && line[len-1] == '\n') line[len-1] = '\0'; + /* ignore any command prefix */ + if (prefix) + p = STRSKIP(line, prefix); + if (!p) + p = line; + for (i = 0 ; i <= maxReg && i < nregex ; i++) { - if (regexec(®[i], line, nvars[i]+1, vars, 0) == 0) { + if (regexec(®[i], p, nvars[i]+1, vars, 0) == 0) { maxReg++; if (i == 0) @@ -1475,9 +1482,9 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool, /* NULL terminate each captured group in the line */ for (j = 0 ; j < nvars[i] ; j++) { /* NB vars[0] is the full pattern, so we offset j by 1 */ - line[vars[j+1].rm_eo] = '\0'; + p[vars[j+1].rm_eo] = '\0'; if ((groups[ngroup++] = - strdup(line + vars[j+1].rm_so)) == NULL) { + strdup(p + vars[j+1].rm_so)) == NULL) { virReportOOMError(); goto cleanup; } diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h index 67ac32c7ae..75ed676f83 100644 --- a/src/storage/storage_backend.h +++ b/src/storage/storage_backend.h @@ -140,7 +140,7 @@ int virStorageBackendRunProgRegex(virStoragePoolObjPtr pool, const char **regex, int *nvars, virStorageBackendListVolRegexFunc func, - void *data); + void *data, const char *cmd_to_ignore); int virStorageBackendRunProgNul(virStoragePoolObjPtr pool, const char **prog, diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index da98f87b51..d6786259bb 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -266,7 +266,7 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSE if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars, virStorageBackendFileSystemNetFindPoolSourcesFunc, - &state) < 0) + &state, NULL) < 0) goto cleanup; retval = virStoragePoolSourceListFormat(&state.list); diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c index 346e698050..99e69c9a63 100644 --- a/src/storage/storage_backend_iscsi.c +++ b/src/storage/storage_backend_iscsi.c @@ -160,7 +160,7 @@ virStorageBackendISCSISession(virStoragePoolObjPtr pool, regexes, vars, virStorageBackendISCSIExtractSession, - &session) < 0) + &session, NULL) < 0) return NULL; if (session == NULL && @@ -517,7 +517,7 @@ virStorageBackendISCSIScanTargets(const char *portal, regexes, vars, virStorageBackendISCSIGetTargets, - &list) < 0) { + &list, NULL) < 0) { return -1; } diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c index 23d80cbe6d..589f486fe7 100644 --- a/src/storage/storage_backend_logical.c +++ b/src/storage/storage_backend_logical.c @@ -211,7 +211,7 @@ virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool, regexes, vars, virStorageBackendLogicalMakeVol, - vol) < 0) { + vol, "lvs") < 0) { return -1; } @@ -329,7 +329,7 @@ virStorageBackendLogicalFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED, if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars, virStorageBackendLogicalFindPoolSourcesFunc, - &sourceList) < 0) + &sourceList, "pvs") < 0) return NULL; retval = virStoragePoolSourceListFormat(&sourceList); @@ -503,7 +503,7 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED, regexes, vars, virStorageBackendLogicalRefreshPoolFunc, - NULL) < 0) { + NULL, "vgs") < 0) { virStoragePoolObjClearVols(pool); return -1; }