]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Add API to check accessibility of storage volumes
authorPeter Krempa <pkrempa@redhat.com>
Sat, 26 Apr 2014 16:15:41 +0000 (18:15 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 3 Jun 2014 07:27:23 +0000 (09:27 +0200)
Add a storage driver API equivalent of the access() function.
Implementations for the filesystem and gluster backends are provided.

src/storage/storage_backend.h
src/storage/storage_backend_fs.c
src/storage/storage_backend_gluster.c
src/storage/storage_driver.c
src/storage/storage_driver.h

index 5d71cde33ab7e285d330a9aa62c50d235466a40b..56643fbb2d38ac9926cf50187e9d2edcbe73a0ae 100644 (file)
@@ -198,6 +198,10 @@ typedef ssize_t
 typedef const char *
 (*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
 
+typedef int
+(*virStorageFileBackendAccess)(virStorageSourcePtr src,
+                               int mode);
+
 virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
 
 
@@ -220,6 +224,7 @@ struct _virStorageFileBackend {
     virStorageFileBackendCreate storageFileCreate;
     virStorageFileBackendUnlink storageFileUnlink;
     virStorageFileBackendStat   storageFileStat;
+    virStorageFileBackendAccess storageFileAccess;
 };
 
 #endif /* __VIR_STORAGE_BACKEND_H__ */
index aed07a688e3f790d8b10136f0b32c5a369eb9873..414f2c76fef8dd0b6419471112a2d3cc1dfd2dbe 100644 (file)
@@ -1433,6 +1433,15 @@ virStorageFileBackendFileGetUniqueIdentifier(virStorageSourcePtr src)
 }
 
 
+static int
+virStorageFileBackendFileAccess(virStorageSourcePtr src,
+                                int mode)
+{
+    return virFileAccessibleAs(src->path, mode,
+                               src->drv->uid, src->drv->gid);
+}
+
+
 virStorageFileBackend virStorageFileBackendFile = {
     .type = VIR_STORAGE_TYPE_FILE,
 
@@ -1442,6 +1451,7 @@ virStorageFileBackend virStorageFileBackendFile = {
     .storageFileUnlink = virStorageFileBackendFileUnlink,
     .storageFileStat = virStorageFileBackendFileStat,
     .storageFileReadHeader = virStorageFileBackendFileReadHeader,
+    .storageFileAccess = virStorageFileBackendFileAccess,
 
     .storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
 };
@@ -1455,6 +1465,7 @@ virStorageFileBackend virStorageFileBackendBlock = {
 
     .storageFileStat = virStorageFileBackendFileStat,
     .storageFileReadHeader = virStorageFileBackendFileReadHeader,
+    .storageFileAccess = virStorageFileBackendFileAccess,
 
     .storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
 };
@@ -1466,6 +1477,8 @@ virStorageFileBackend virStorageFileBackendDir = {
     .backendInit = virStorageFileBackendFileInit,
     .backendDeinit = virStorageFileBackendFileDeinit,
 
+    .storageFileAccess = virStorageFileBackendFileAccess,
+
     .storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
 };
 
index af6792fb1465505b55a47bdef1c73fbfa817ff1c..3db4e66729003521b6c6c6d8b64d7a1d038ae3af 100644 (file)
@@ -703,6 +703,16 @@ virStorageFileBackendGlusterReadHeader(virStorageSourcePtr src,
 }
 
 
+static int
+virStorageFileBackendGlusterAccess(virStorageSourcePtr src,
+                                   int mode)
+{
+    virStorageFileBackendGlusterPrivPtr priv = src->drv->priv;
+
+    return glfs_access(priv->vol, src->path, mode);
+}
+
+
 virStorageFileBackend virStorageFileBackendGluster = {
     .type = VIR_STORAGE_TYPE_NETWORK,
     .protocol = VIR_STORAGE_NET_PROTOCOL_GLUSTER,
@@ -713,4 +723,5 @@ virStorageFileBackend virStorageFileBackendGluster = {
     .storageFileUnlink = virStorageFileBackendGlusterUnlink,
     .storageFileStat = virStorageFileBackendGlusterStat,
     .storageFileReadHeader = virStorageFileBackendGlusterReadHeader,
+    .storageFileAccess = virStorageFileBackendGlusterAccess,
 };
index 0c779c520198f445a24924db34a6ba1201a248cf..f66c25946bf2032f0585881ada6bd936441a16a0 100644 (file)
@@ -3017,3 +3017,27 @@ virStorageFileGetUniqueIdentifier(virStorageSourcePtr src)
 
     return src->drv->backend->storageFileGetUniqueIdentifier(src);
 }
+
+
+/**
+ * virStorageFileAccess: Check accessibility of a storage file
+ *
+ * @src: storage file to check access permissions
+ * @mode: accessibility check options (see man 2 access)
+ *
+ * Returns 0 on success, -1 on error and sets errno. No libvirt
+ * error is reported. Returns -2 if the operation isn't supported
+ * by libvirt storage backend.
+ */
+int
+virStorageFileAccess(virStorageSourcePtr src,
+                     int mode)
+{
+    if (!virStorageFileIsInitialized(src) ||
+        !src->drv->backend->storageFileAccess) {
+        errno = ENOSYS;
+        return -2;
+    }
+
+    return src->drv->backend->storageFileAccess(src, mode);
+}
index 9280ef0e22b2cf4228aa6b5e923c10e46cf51e65..5452df21a4cf190c7a0d39d0841a5905a5b0cb0e 100644 (file)
@@ -42,6 +42,7 @@ ssize_t virStorageFileReadHeader(virStorageSourcePtr src,
                                  ssize_t max_len,
                                  char **buf);
 const char *virStorageFileGetUniqueIdentifier(virStorageSourcePtr src);
+int virStorageFileAccess(virStorageSourcePtr src, int mode);
 
 int storageRegister(void);