[ Thanks for the feedback, Eric. Hopefully I correctly incorporated it
in this version. This version still tests fine with and without
lvm.conf command_names=1 ]
If the regexes supported (?:pvs)?, then we could handle this by
optionally matching but not returning the initial command name. But it
doesn't. So add a new char* argument to
virStorageBackendRunProgRegex(). If that argument is NULL then we act
as usual. Otherwise, if the string at that argument is found at the
start of a returned line, we drop that before running the regex.
With this patch, virt-manager shows me lvs with command_names 1 or 0.
The definitions of PVS_BASE etc may want to be moved into the configure
scripts (though given how PVS is found, IIUC that could only happen if
pvs was a link to pvs_real), but in any case no sense dealing with that
until we're sure this is an ok way to handle it.
Changelog:
Sep 28: Use STRSKIP and make cmd_to_ignore arg const, as per Eric's
feedback.
Signed-off-by: Serge Hallyn <serge.hallyn(a)canonical.com>
---
src/storage/storage_backend.c | 15 +++++++++++----
src/storage/storage_backend.h | 2 +-
src/storage/storage_backend_fs.c | 2 +-
src/storage/storage_backend_iscsi.c | 4 ++--
src/storage/storage_backend_logical.c | 9 ++++++---
5 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index d125504..dd7e36b 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 *cmd_to_ignore)
{
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';
+ /* if cmd_to_ignore is specified, then ignore it */
+ if (cmd_to_ignore)
+ p = STRSKIP(line, cmd_to_ignore);
+ 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 67ac32c..75ed676 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 da98f87..d678625 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 346e698..99e69c9 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 23d80cb..7923b71 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -205,13 +205,14 @@ virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
pool->def->source.name, NULL
};
+#define LVS_BASE "lvs"
if (virStorageBackendRunProgRegex(pool,
prog,
1,
regexes,
vars,
virStorageBackendLogicalMakeVol,
- vol) < 0) {
+ vol, LVS_BASE) < 0) {
return -1;
}
@@ -327,9 +328,10 @@ virStorageBackendLogicalFindPoolSources(virConnectPtr conn
ATTRIBUTE_UNUSED,
memset(&sourceList, 0, sizeof(sourceList));
sourceList.type = VIR_STORAGE_POOL_LOGICAL;
+#define PVS_BASE "pvs"
if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars,
virStorageBackendLogicalFindPoolSourcesFunc,
- &sourceList) < 0)
+ &sourceList, PVS_BASE) < 0)
return NULL;
retval = virStoragePoolSourceListFormat(&sourceList);
@@ -496,6 +498,7 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn
ATTRIBUTE_UNUSED,
return -1;
}
+#define VGS_BASE "vgs"
/* Now get basic volgrp metadata */
if (virStorageBackendRunProgRegex(pool,
prog,
@@ -503,7 +506,7 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn
ATTRIBUTE_UNUSED,
regexes,
vars,
virStorageBackendLogicalRefreshPoolFunc,
- NULL) < 0) {
+ NULL, VGS_BASE) < 0) {
virStoragePoolObjClearVols(pool);
return -1;
}
--
1.7.5.4