Mercurial > nomad > experimental
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,