Changeset View
Changeset View
Standalone View
Standalone View
head/sys/fs/fuse/fuse_vnops.c
Show First 20 Lines • Show All 2,240 Lines • ▼ Show 20 Lines | fuse_vnop_listextattr(struct vop_listextattr_args *ap) | ||||
struct vnode *vp = ap->a_vp; | struct vnode *vp = ap->a_vp; | ||||
struct uio *uio = ap->a_uio; | struct uio *uio = ap->a_uio; | ||||
struct fuse_dispatcher fdi; | struct fuse_dispatcher fdi; | ||||
struct fuse_listxattr_in *list_xattr_in; | struct fuse_listxattr_in *list_xattr_in; | ||||
struct fuse_listxattr_out *list_xattr_out; | struct fuse_listxattr_out *list_xattr_out; | ||||
struct mount *mp = vnode_mount(vp); | struct mount *mp = vnode_mount(vp); | ||||
struct thread *td = ap->a_td; | struct thread *td = ap->a_td; | ||||
struct ucred *cred = ap->a_cred; | struct ucred *cred = ap->a_cred; | ||||
size_t len; | |||||
char *prefix; | char *prefix; | ||||
char *attr_str; | |||||
char *bsd_list = NULL; | char *bsd_list = NULL; | ||||
char *linux_list; | char *linux_list; | ||||
int bsd_list_len; | int bsd_list_len; | ||||
int linux_list_len; | int linux_list_len; | ||||
int err; | int err; | ||||
if (fuse_isdeadfs(vp)) | if (fuse_isdeadfs(vp)) | ||||
return (ENXIO); | return (ENXIO); | ||||
Show All 9 Lines | fuse_vnop_listextattr(struct vop_listextattr_args *ap) | ||||
* Add space for a NUL and the period separator if enabled. | * Add space for a NUL and the period separator if enabled. | ||||
* Default to looking for user attributes. | * Default to looking for user attributes. | ||||
*/ | */ | ||||
if (ap->a_attrnamespace == EXTATTR_NAMESPACE_SYSTEM) | if (ap->a_attrnamespace == EXTATTR_NAMESPACE_SYSTEM) | ||||
prefix = EXTATTR_NAMESPACE_SYSTEM_STRING; | prefix = EXTATTR_NAMESPACE_SYSTEM_STRING; | ||||
else | else | ||||
prefix = EXTATTR_NAMESPACE_USER_STRING; | prefix = EXTATTR_NAMESPACE_USER_STRING; | ||||
len = strlen(prefix) + sizeof(extattr_namespace_separator) + 1; | fdisp_init(&fdi, sizeof(*list_xattr_in)); | ||||
fdisp_init(&fdi, sizeof(*list_xattr_in) + len); | |||||
fdisp_make_vp(&fdi, FUSE_LISTXATTR, vp, td, cred); | fdisp_make_vp(&fdi, FUSE_LISTXATTR, vp, td, cred); | ||||
/* | /* | ||||
* Retrieve Linux / FUSE compatible list size. | * Retrieve Linux / FUSE compatible list size. | ||||
*/ | */ | ||||
list_xattr_in = fdi.indata; | list_xattr_in = fdi.indata; | ||||
list_xattr_in->size = 0; | list_xattr_in->size = 0; | ||||
attr_str = (char *)fdi.indata + sizeof(*list_xattr_in); | |||||
snprintf(attr_str, len, "%s%c", prefix, extattr_namespace_separator); | |||||
err = fdisp_wait_answ(&fdi); | err = fdisp_wait_answ(&fdi); | ||||
if (err != 0) { | if (err != 0) { | ||||
if (err == ENOSYS) { | if (err == ENOSYS) { | ||||
fsess_set_notimpl(mp, FUSE_LISTXATTR); | fsess_set_notimpl(mp, FUSE_LISTXATTR); | ||||
err = EOPNOTSUPP; | err = EOPNOTSUPP; | ||||
} | } | ||||
goto out; | goto out; | ||||
} | } | ||||
list_xattr_out = fdi.answ; | list_xattr_out = fdi.answ; | ||||
linux_list_len = list_xattr_out->size; | linux_list_len = list_xattr_out->size; | ||||
if (linux_list_len == 0) { | if (linux_list_len == 0) { | ||||
if (ap->a_size != NULL) | if (ap->a_size != NULL) | ||||
*ap->a_size = linux_list_len; | *ap->a_size = linux_list_len; | ||||
goto out; | goto out; | ||||
} | } | ||||
/* | /* | ||||
* Retrieve Linux / FUSE compatible list values. | * Retrieve Linux / FUSE compatible list values. | ||||
*/ | */ | ||||
fdisp_refresh_vp(&fdi, FUSE_LISTXATTR, vp, td, cred); | fdisp_refresh_vp(&fdi, FUSE_LISTXATTR, vp, td, cred); | ||||
list_xattr_in = fdi.indata; | list_xattr_in = fdi.indata; | ||||
list_xattr_in->size = linux_list_len + sizeof(*list_xattr_out); | list_xattr_in->size = linux_list_len + sizeof(*list_xattr_out); | ||||
attr_str = (char *)fdi.indata + sizeof(*list_xattr_in); | |||||
snprintf(attr_str, len, "%s%c", prefix, extattr_namespace_separator); | |||||
err = fdisp_wait_answ(&fdi); | err = fdisp_wait_answ(&fdi); | ||||
if (err != 0) | if (err != 0) | ||||
goto out; | goto out; | ||||
linux_list = fdi.answ; | linux_list = fdi.answ; | ||||
linux_list_len = fdi.iosize; | linux_list_len = fdi.iosize; | ||||
▲ Show 20 Lines • Show All 149 Lines • Show Last 20 Lines |