On 09/28/2011 02:08 PM, Serge E. Hallyn wrote:
[ 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 ]
Glad that it passed testing (as I had not tested my suggestions).
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.
I'll tweak the commit a bit (information like this is useful to the
patch review, but less useful in 'git log' - so the best place to stick
it is after the --- divider, so that 'git am' will know that it is not
part of the official commit message).
@@ -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 */
I'll tweak this comment slightly to mention that we are skipping a
prefix, if it is present, and not ignoring the entire command line.
+++ 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) {
I'm not a big fan of in-function #define, especially if it's for a
one-shot string literal. I generally either float the #define up to the
top of the file (out of the function), or in this case, inline the
string constant into its lone usage point (we can refactor into a
#define later, if we need to use the string more than once).
ACK and pushed with this squashed in:
diff --git i/src/storage/storage_backend.c w/src/storage/storage_backend.c
index dd7e36b..64c35c2 100644
--- i/src/storage/storage_backend.c
+++ w/src/storage/storage_backend.c
@@ -1400,7 +1400,7 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr
pool,
const char **regex,
int *nvars,
virStorageBackendListVolRegexFunc func,
- void *data, const char *cmd_to_ignore)
+ void *data, const char *prefix)
{
int fd = -1, err, ret = -1;
FILE *list = NULL;
@@ -1466,9 +1466,9 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr
pool,
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);
+ /* ignore any command prefix */
+ if (prefix)
+ p = STRSKIP(line, prefix);
if (!p)
p = line;
diff --git i/src/storage/storage_backend_logical.c
w/src/storage/storage_backend_logical.c
index 7923b71..589f486 100644
--- i/src/storage/storage_backend_logical.c
+++ w/src/storage/storage_backend_logical.c
@@ -205,14 +205,13 @@
virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
pool->def->source.name, NULL
};
-#define LVS_BASE "lvs"
if (virStorageBackendRunProgRegex(pool,
prog,
1,
regexes,
vars,
virStorageBackendLogicalMakeVol,
- vol, LVS_BASE) < 0) {
+ vol, "lvs") < 0) {
return -1;
}
@@ -328,10 +327,9 @@
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, PVS_BASE) < 0)
+ &sourceList, "pvs") < 0)
return NULL;
retval = virStoragePoolSourceListFormat(&sourceList);
@@ -498,7 +496,6 @@ virStorageBackendLogicalRefreshPool(virConnectPtr
conn ATTRIBUTE_UNUSED,
return -1;
}
-#define VGS_BASE "vgs"
/* Now get basic volgrp metadata */
if (virStorageBackendRunProgRegex(pool,
prog,
@@ -506,7 +503,7 @@ virStorageBackendLogicalRefreshPool(virConnectPtr
conn ATTRIBUTE_UNUSED,
regexes,
vars,
virStorageBackendLogicalRefreshPoolFunc,
- NULL, VGS_BASE) < 0) {
+ NULL, "vgs") < 0) {
virStoragePoolObjClearVols(pool);
return -1;
}
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org