Add a storage driver API equivalent of the access() function.
Implementations for the filesystem and gluster backends are provided.
typedef const char *
(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
+typedef int
+(*virStorageFileBackendAccess)(virStorageSourcePtr src,
+ int mode);
+
virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
virStorageFileBackendCreate storageFileCreate;
virStorageFileBackendUnlink storageFileUnlink;
virStorageFileBackendStat storageFileStat;
+ virStorageFileBackendAccess storageFileAccess;
};
#endif /* __VIR_STORAGE_BACKEND_H__ */
}
+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,
.storageFileUnlink = virStorageFileBackendFileUnlink,
.storageFileStat = virStorageFileBackendFileStat,
.storageFileReadHeader = virStorageFileBackendFileReadHeader,
+ .storageFileAccess = virStorageFileBackendFileAccess,
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
};
.storageFileStat = virStorageFileBackendFileStat,
.storageFileReadHeader = virStorageFileBackendFileReadHeader,
+ .storageFileAccess = virStorageFileBackendFileAccess,
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
};
.backendInit = virStorageFileBackendFileInit,
.backendDeinit = virStorageFileBackendFileDeinit,
+ .storageFileAccess = virStorageFileBackendFileAccess,
+
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
};
}
+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,
.storageFileUnlink = virStorageFileBackendGlusterUnlink,
.storageFileStat = virStorageFileBackendGlusterStat,
.storageFileReadHeader = virStorageFileBackendGlusterReadHeader,
+ .storageFileAccess = virStorageFileBackendGlusterAccess,
};
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);
+}
ssize_t max_len,
char **buf);
const char *virStorageFileGetUniqueIdentifier(virStorageSourcePtr src);
+int virStorageFileAccess(virStorageSourcePtr src, int mode);
int storageRegister(void);