mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-26 02:50:32 +03:00
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:
parent
a111b9e24f
commit
30f555c6a8
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user