changeset 247:aba404338d73

objstore/mem: implement read object operation Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Thu, 14 Apr 2016 22:35:34 -0400
parents a3bdecfe2560
children 55ed695b32c4
files src/objstore/mem/obj.c
diffstat 1 files changed, 39 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/objstore/mem/obj.c	Thu Apr 14 22:35:26 2016 -0400
+++ b/src/objstore/mem/obj.c	Thu Apr 14 22:35:34 2016 -0400
@@ -335,6 +335,44 @@
 	return 0;
 }
 
+static ssize_t mem_obj_read(struct objstore_vol *vol, void *cookie,
+			    void *buf, size_t len, uint64_t offset)
+{
+	struct memver *ver = cookie;
+	ssize_t ret;
+
+	if (!vol || !cookie || !buf)
+		return -EINVAL;
+
+	/* nothing to do */
+	if (!len)
+		return 0;
+
+	mxlock(&ver->obj->lock);
+
+	if (NATTR_ISDIR(ver->attrs.mode)) {
+		ret = -EISDIR;
+		goto err_unlock;
+	}
+
+	/* TODO: do we need to check for other types? */
+
+	if (offset >= ver->attrs.size)
+		ret = 0;
+	else if ((offset + len) > ver->attrs.size)
+		ret = ver->attrs.size - offset;
+	else
+		ret = len;
+
+	if (ret)
+		memcpy(buf, ver->blob + offset, ret);
+
+err_unlock:
+	mxunlock(&ver->obj->lock);
+
+	return ret;
+}
+
 static int mem_obj_lookup(struct objstore_vol *vol, void *dircookie,
 			  const char *name, struct noid *child)
 {
@@ -544,6 +582,7 @@
 	.open    = mem_obj_open,
 	.close   = mem_obj_close,
 	.getattr = mem_obj_getattr,
+	.read    = mem_obj_read,
 	.lookup  = mem_obj_lookup,
 	.create  = mem_obj_create,
 	.remove  = mem_obj_remove,