static int virStorageBackendLogicalFindPoolSourcesFunc(char **const groups, void *data) { virStoragePoolSourceListPtr sourceList = data; char *pvname = NULL; char *vgname = NULL; size_t i; virStoragePoolSourceDevicePtr dev; virStoragePoolSource *thisSource; if (VIR_STRDUP(pvname, groups[0]) < 0 || VIR_STRDUP(vgname, groups[1]) < 0) goto error; thisSource = NULL; for (i = 0; i < sourceList->nsources; i++) { if (STREQ(sourceList->sources[i].name, vgname)) { thisSource = &sourceList->sources[i]; break; } } if (thisSource == NULL) { if (!(thisSource = virStoragePoolSourceListNewSource(sourceList))) goto error; thisSource->name = vgname; } else VIR_FREE(vgname); if (VIR_REALLOC_N(thisSource->devices, thisSource->ndevice + 1) != 0) goto error; dev = &thisSource->devices[thisSource->ndevice]; thisSource->ndevice++; thisSource->format = VIR_STORAGE_POOL_LOGICAL_LVM2; memset(dev, 0, sizeof(*dev)); dev->path = pvname; return 0; error: VIR_FREE(pvname); VIR_FREE(vgname); return -1; }
static int virStorageBackendFileSystemNetFindPoolSourcesFunc(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED, char **const groups, void *data) { virNetfsDiscoverState *state = data; const char *name, *path; virStoragePoolSource *src = NULL; int ret = -1; path = groups[0]; name = strrchr(path, '/'); if (name == NULL) { virStorageReportError(VIR_ERR_INTERNAL_ERROR, _("invalid netfs path (no /): %s"), path); goto cleanup; } name += 1; if (*name == '\0') { virStorageReportError(VIR_ERR_INTERNAL_ERROR, _("invalid netfs path (ends in /): %s"), path); goto cleanup; } if (!(src = virStoragePoolSourceListNewSource(&state->list))) goto cleanup; if (src->nhost != 1) { virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Expected exactly 1 host for the storage pool")); goto cleanup; } if (!(src->hosts[0].name = strdup(state->host)) || !(src->dir = strdup(path))) { virReportOOMError(); goto cleanup; } src->format = VIR_STORAGE_POOL_NETFS_NFS; src = NULL; ret = 0; cleanup: virStoragePoolSourceFree(src); return ret; }
static int virStorageBackendFileSystemNetFindPoolSourcesFunc(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED, char **const groups, void *data) { virNetfsDiscoverState *state = data; const char *name, *path; virStoragePoolSource *src = NULL; int ret = -1; path = groups[0]; if (!(name = strrchr(path, '/'))) { virReportError(VIR_ERR_INTERNAL_ERROR, _("invalid netfs path (no /): %s"), path); goto cleanup; } name += 1; if (*name == '\0') { virReportError(VIR_ERR_INTERNAL_ERROR, _("invalid netfs path (ends in /): %s"), path); goto cleanup; } if (!(src = virStoragePoolSourceListNewSource(&state->list))) goto cleanup; if (VIR_ALLOC_N(src->hosts, 1) < 0) { virReportOOMError(); goto cleanup; } src->nhost = 1; if (!(src->hosts[0].name = strdup(state->host)) || !(src->dir = strdup(path))) { virReportOOMError(); goto cleanup; } src->format = VIR_STORAGE_POOL_NETFS_NFS; ret = 0; cleanup: return ret; }