#include "fdstream.h"
#include "configmake.h"
#include "virstring.h"
+#include "viraccessapicheck.h"
#define VIR_FROM_THIS VIR_FROM_STORAGE
goto cleanup;
}
+ if (virStoragePoolLookupByUUIDEnsureACL(conn, pool->def) < 0)
+ goto cleanup;
+
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
NULL, NULL);
goto cleanup;
}
+ if (virStoragePoolLookupByNameEnsureACL(conn, pool->def) < 0)
+ goto cleanup;
+
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
NULL, NULL);
static virStoragePoolPtr
storagePoolLookupByVolume(virStorageVolPtr vol) {
- return storagePoolLookupByName(vol->conn, vol->pool);
+ virStorageDriverStatePtr driver = vol->conn->storagePrivateData;
+ virStoragePoolObjPtr pool;
+ virStoragePoolPtr ret = NULL;
+
+ storageDriverLock(driver);
+ pool = virStoragePoolObjFindByName(&driver->pools, vol->pool);
+ storageDriverUnlock(driver);
+
+ if (!pool) {
+ virReportError(VIR_ERR_NO_STORAGE_POOL,
+ _("no storage pool with matching name '%s'"), vol->pool);
+ goto cleanup;
+ }
+
+ if (virStoragePoolLookupByVolumeEnsureACL(vol->conn, pool->def) < 0)
+ goto cleanup;
+
+ ret = virGetStoragePool(vol->conn, pool->def->name, pool->def->uuid,
+ NULL, NULL);
+
+cleanup:
+ if (pool)
+ virStoragePoolObjUnlock(pool);
+ return ret;
}
static virDrvOpenStatus
virStorageDriverStatePtr driver = conn->storagePrivateData;
unsigned int i, nactive = 0;
+ if (virConnectNumOfStoragePoolsEnsureACL(conn) < 0)
+ return -1;
+
storageDriverLock(driver);
for (i = 0; i < driver->pools.count; i++) {
virStoragePoolObjLock(driver->pools.objs[i]);
virStorageDriverStatePtr driver = conn->storagePrivateData;
int got = 0, i;
+ if (virConnectListStoragePoolsEnsureACL(conn) < 0)
+ return -1;
+
storageDriverLock(driver);
for (i = 0; i < driver->pools.count && got < nnames; i++) {
virStoragePoolObjLock(driver->pools.objs[i]);
virStorageDriverStatePtr driver = conn->storagePrivateData;
unsigned int i, nactive = 0;
+ if (virConnectNumOfDefinedStoragePoolsEnsureACL(conn) < 0)
+ return -1;
+
storageDriverLock(driver);
for (i = 0; i < driver->pools.count; i++) {
virStoragePoolObjLock(driver->pools.objs[i]);
virStorageDriverStatePtr driver = conn->storagePrivateData;
int got = 0, i;
+ if (virConnectListDefinedStoragePoolsEnsureACL(conn) < 0)
+ return -1;
+
storageDriverLock(driver);
for (i = 0; i < driver->pools.count && got < nnames; i++) {
virStoragePoolObjLock(driver->pools.objs[i]);
virStorageBackendPtr backend;
char *ret = NULL;
+ if (virConnectFindStoragePoolSourcesEnsureACL(conn) < 0)
+ return NULL;
+
backend_type = virStoragePoolTypeFromString(type);
if (backend_type < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
virReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
goto cleanup;
}
+
+ if (virStoragePoolIsActiveEnsureACL(pool->conn, obj->def) < 0)
+ goto cleanup;
+
ret = virStoragePoolObjIsActive(obj);
cleanup:
virReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
goto cleanup;
}
+
+ if (virStoragePoolIsPersistentEnsureACL(pool->conn, obj->def) < 0)
+ goto cleanup;
+
ret = obj->configFile ? 1 : 0;
cleanup:
if (!(def = virStoragePoolDefParseString(xml)))
goto cleanup;
+ if (virStoragePoolCreateXMLEnsureACL(conn, def) < 0)
+ goto cleanup;
+
if (virStoragePoolObjIsDuplicate(&driver->pools, def, 1) < 0)
goto cleanup;
if (!(def = virStoragePoolDefParseString(xml)))
goto cleanup;
+ if (virStoragePoolDefineXMLEnsureACL(conn, def) < 0)
+ goto cleanup;
+
if (virStoragePoolObjIsDuplicate(&driver->pools, def, 0) < 0)
goto cleanup;
goto cleanup;
}
+ if (virStoragePoolUndefineEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if (virStoragePoolObjIsActive(pool)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("storage pool '%s' is still active"),
goto cleanup;
}
+ if (virStoragePoolCreateEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
goto cleanup;
}
+ if (virStoragePoolBuildEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
goto cleanup;
}
+ if (virStoragePoolDestroyEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
goto cleanup;
}
+ if (virStoragePoolDeleteEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
goto cleanup;
}
+ if (virStoragePoolRefreshEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
goto cleanup;
}
+ if (virStoragePoolGetInfoEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if (virStorageBackendForType(pool->def->type) == NULL)
goto cleanup;
goto cleanup;
}
+ if (virStoragePoolGetXMLDescEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if ((flags & VIR_STORAGE_XML_INACTIVE) && pool->newDef)
def = pool->newDef;
else
goto cleanup;
}
+ if (virStoragePoolGetAutostartEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if (!pool->configFile) {
*autostart = 0;
} else {
goto cleanup;
}
+ if (virStoragePoolSetAutostartEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if (!pool->configFile) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("pool has no config file"));
goto cleanup;
}
+ if (virStoragePoolNumOfVolumesEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if (!virStoragePoolObjIsActive(pool)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("storage pool '%s' is not active"), pool->def->name);
goto cleanup;
}
+ if (virStoragePoolListVolumesEnsureACL(obj->conn, pool->def) < 0)
+ goto cleanup;
+
if (!virStoragePoolObjIsActive(pool)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("storage pool '%s' is not active"), pool->def->name);
goto cleanup;
}
+ if (virStoragePoolListAllVolumesEnsureACL(pool->conn, obj->def) < 0)
+ goto cleanup;
+
if (!virStoragePoolObjIsActive(obj)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("storage pool '%s' is not active"), obj->def->name);
goto cleanup;
}
+ if (virStorageVolLookupByNameEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto cleanup;
+
ret = virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key,
NULL, NULL);
virStorageVolDefPtr vol =
virStorageVolDefFindByKey(driver->pools.objs[i], key);
- if (vol)
+ if (vol) {
+ if (virStorageVolLookupByKeyEnsureACL(conn, driver->pools.objs[i]->def, vol) < 0)
+ goto cleanup;
+
ret = virGetStorageVol(conn,
driver->pools.objs[i]->def->name,
vol->name,
vol->key,
NULL, NULL);
+ goto cleanup;
+ }
}
virStoragePoolObjUnlock(driver->pools.objs[i]);
}
- storageDriverUnlock(driver);
if (!ret)
virReportError(VIR_ERR_NO_STORAGE_VOL,
_("no storage vol with matching key %s"), key);
+cleanup:
+ storageDriverUnlock(driver);
return ret;
}
stable_path);
VIR_FREE(stable_path);
- if (vol)
+ if (vol) {
+ if (virStorageVolLookupByPathEnsureACL(conn, driver->pools.objs[i]->def, vol) < 0)
+ goto cleanup;
+
ret = virGetStorageVol(conn,
driver->pools.objs[i]->def->name,
vol->name,
vol->key,
NULL, NULL);
+ goto cleanup;
+ }
}
virStoragePoolObjUnlock(driver->pools.objs[i]);
}
virReportError(VIR_ERR_NO_STORAGE_VOL,
_("no storage vol with matching path %s"), path);
+cleanup:
VIR_FREE(cleanpath);
storageDriverUnlock(driver);
return ret;
if (voldef == NULL)
goto cleanup;
+ if (virStorageVolCreateXMLEnsureACL(obj->conn, pool->def, voldef) < 0)
+ goto cleanup;
+
if (virStorageVolDefFindByName(pool, voldef->name)) {
virReportError(VIR_ERR_NO_STORAGE_VOL,
_("storage vol '%s' already exists"), voldef->name);
if (newvol == NULL)
goto cleanup;
+ if (virStorageVolCreateXMLFromEnsureACL(obj->conn, pool->def, newvol) < 0)
+ goto cleanup;
+
if (virStorageVolDefFindByName(pool, newvol->name)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("storage volume name '%s' already in use."),
goto out;
}
+ if (virStorageVolDownloadEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto out;
+
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
goto out;
}
+ if (virStorageVolUploadEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto out;
+
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
goto out;
}
+ if (virStorageVolResizeEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto out;
+
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
goto out;
}
+ if (virStorageVolWipePatternEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto out;
+
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
goto cleanup;
}
+ if (virStorageVolDeleteEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto cleanup;
+
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
goto cleanup;
}
+ if (virStorageVolGetInfoEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto cleanup;
+
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
goto cleanup;
}
+ if (virStorageVolGetXMLDescEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto cleanup;
+
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
goto cleanup;
}
+ if (virStorageVolGetPathEnsureACL(obj->conn, pool->def, vol) < 0)
+ goto cleanup;
+
ignore_value(VIR_STRDUP(ret, vol->target.path));
cleanup:
virCheckFlags(VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ALL, -1);
+ if (virConnectListAllStoragePoolsEnsureACL(conn) < 0)
+ goto cleanup;
+
storageDriverLock(driver);
ret = virStoragePoolList(conn, driver->pools, pools, flags);
storageDriverUnlock(driver);
+cleanup:
return ret;
}