lvm storage backend: handle command_names=1 in lvm.conf

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.

Signed-off-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Serge E. Hallyn 2011-09-28 15:08:34 -05:00 committed by Eric Blake
parent a111b9e24f
commit 30f555c6a8
5 changed files with 18 additions and 11 deletions

View File

@ -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(&reg[i], line, nvars[i]+1, vars, 0) == 0) {
if (regexec(&reg[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;
}

View File

@ -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,

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}