static int parallelsFindVmVolumes(virStoragePoolObjPtr pool, virDomainObjPtr dom) { parallelsDomObjPtr pdom = dom->privateData; DIR *dir; struct dirent *ent; char *diskPath = NULL, *diskDescPath = NULL; struct stat sb; int ret = -1; int direrr; if (!(dir = opendir(pdom->home))) { virReportSystemError(errno, _("cannot open path '%s'"), pdom->home); goto cleanup; } while ((direrr = virDirRead(dir, &ent, pdom->home)) > 0) { VIR_FREE(diskPath); VIR_FREE(diskDescPath); if (!(diskPath = virFileBuildPath(pdom->home, ent->d_name, NULL))) goto cleanup; if (lstat(diskPath, &sb) < 0) { virReportSystemError(errno, _("cannot stat path '%s'"), ent->d_name); goto cleanup; } if (!S_ISDIR(sb.st_mode)) continue; if (!(diskDescPath = virFileBuildPath(diskPath, "DiskDescriptor", ".xml"))) goto cleanup; if (!virFileExists(diskDescPath)) continue; /* here we know, that ent->d_name is a disk image directory */ if (parallelsAddDiskVolume(pool, dom, ent->d_name, diskPath, diskDescPath)) goto cleanup; } if (direrr < 0) goto cleanup; ret = 0; cleanup: VIR_FREE(diskPath); VIR_FREE(diskDescPath); closedir(dir); return ret; }
static int parallelsFindVolumes(virStoragePoolObjPtr pool) { DIR *dir; struct dirent *ent; char *path = NULL; int ret = -1; if (!(dir = opendir(pool->def->target.path))) { virReportSystemError(errno, _("cannot open path '%s'"), pool->def->target.path); return -1; } while ((ent = readdir(dir)) != NULL) { if (!virFileHasSuffix(ent->d_name, ".xml")) continue; if (!(path = virFileBuildPath(pool->def->target.path, ent->d_name, NULL))) goto cleanup; if (!parallelsStorageVolDefineXML(pool, NULL, path, false)) goto cleanup; VIR_FREE(path); } ret = 0; cleanup: VIR_FREE(path); closedir(dir); return ret; }
static virNWFilterObjPtr virNWFilterObjListLoadConfig(virNWFilterObjListPtr nwfilters, const char *configDir, const char *name) { virNWFilterDefPtr def = NULL; virNWFilterObjPtr obj; char *configFile = NULL; if (!(configFile = virFileBuildPath(configDir, name, ".xml"))) goto error; if (!(def = virNWFilterDefParseFile(configFile))) goto error; if (STRNEQ(name, def->name)) { virReportError(VIR_ERR_XML_ERROR, _("network filter config filename '%s' " "does not match name '%s'"), configFile, def->name); goto error; } /* We generated a UUID, make it permanent by saving the config to disk */ if (!def->uuid_specified && virNWFilterSaveConfig(configDir, def) < 0) goto error; if (!(obj = virNWFilterObjListAssignDef(nwfilters, def))) goto error; VIR_FREE(configFile); return obj; error: VIR_FREE(configFile); virNWFilterDefFree(def); return NULL; }
/** * xenInotifyOpen: * @conn: pointer to the connection block * @name: URL for the target, NULL for local * @flags: combination of virDrvOpenFlag(s) * * Connects and starts listening for inotify events * * Returns 0 or -1 in case of error. */ int xenInotifyOpen(virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED, unsigned int flags) { DIR *dh; struct dirent *ent; char *path; xenUnifiedPrivatePtr priv = conn->privateData; virCheckFlags(VIR_CONNECT_RO, -1); if (priv->configDir) { priv->useXenConfigCache = 1; } else { /* /var/lib/xend/domains/<uuid>/config.sxp */ priv->configDir = XEND_DOMAINS_DIR; priv->useXenConfigCache = 0; if (VIR_ALLOC(priv->configInfoList) < 0) return -1; /* populate initial list */ if (!(dh = opendir(priv->configDir))) { virReportSystemError(errno, _("cannot open directory: %s"), priv->configDir); return -1; } while ((ent = readdir(dh))) { if (STRPREFIX(ent->d_name, ".")) continue; /* Build the full file path */ if (!(path = virFileBuildPath(priv->configDir, ent->d_name, NULL))) { closedir(dh); return -1; } if (xenInotifyAddDomainConfigInfo(conn, path) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Error adding file to config list")); closedir(dh); VIR_FREE(path); return -1; } VIR_FREE(path); } closedir(dh); } if ((priv->inotifyFD = inotify_init()) < 0) { virReportSystemError(errno, "%s", _("initializing inotify")); return -1; } VIR_DEBUG("Adding a watch on %s", priv->configDir); if (inotify_add_watch(priv->inotifyFD, priv->configDir, IN_CREATE | IN_CLOSE_WRITE | IN_DELETE | IN_MOVED_TO | IN_MOVED_FROM) < 0) { virReportSystemError(errno, _("adding watch on %s"), priv->configDir); return -1; } VIR_DEBUG("Building initial config cache"); if (priv->useXenConfigCache && xenXMConfigCacheRefresh(conn) < 0) { VIR_DEBUG("Failed to enable XM config cache %s", conn->err.message); return -1; } VIR_DEBUG("Registering with event loop"); /* Add the handle for monitoring */ if ((priv->inotifyWatch = virEventAddHandle(priv->inotifyFD, VIR_EVENT_HANDLE_READABLE, xenInotifyEvent, conn, NULL)) < 0) { VIR_DEBUG("Failed to add inotify handle, disabling events"); } return 0; }