static int sqfs_hl_op_getxattr(const char *path, const char *name, char *value, size_t size #ifdef FUSE_XATTR_POSITION , uint32_t position #endif ) { sqfs *fs; sqfs_inode inode; size_t real = size; #ifdef FUSE_XATTR_POSITION if (position != 0) /* We don't support resource forks */ return -EINVAL; #endif if (sqfs_hl_lookup(&fs, &inode, path)) return -ENOENT; if ((sqfs_xattr_lookup(fs, &inode, name, value, &real))) return -EIO; if (real == 0) return -sqfs_enoattr(); if (size != 0 && size < real) return -ERANGE; return real; }
static void sqfs_ll_op_getxattr(fuse_req_t req, fuse_ino_t ino, const char *name, size_t size #ifdef FUSE_XATTR_POSITION , uint32_t position #endif ) { sqfs_ll_i lli; char *buf = NULL; size_t real = size; #ifdef FUSE_XATTR_POSITION if (position != 0) { /* We don't support resource forks */ fuse_reply_err(req, EINVAL); return; } #endif if (sqfs_ll_iget(req, &lli, ino)) return; if (!(buf = malloc(size))) fuse_reply_err(req, ENOMEM); else if (sqfs_xattr_lookup(&lli.ll->fs, &lli.inode, name, buf, &real)) fuse_reply_err(req, EIO); else if (real == 0) fuse_reply_err(req, sqfs_enoattr()); else if (size == 0) fuse_reply_xattr(req, real); else if (size < real) fuse_reply_err(req, ERANGE); else fuse_reply_buf(req, buf, real); free(buf); }