From 803280ea07e9c07007e0acd3864a18d40b86de2a Mon Sep 17 00:00:00 2001 From: Dmitry Chagin Date: Fri, 1 Sep 2023 11:09:49 +0300 Subject: [PATCH] linux(4): Merge getxattr for future error recode Tested by: zirias MFC after: 1 week (cherry picked from commit 6b46ec66129d9490c91876f72d98e514121996a6) --- sys/compat/linux/linux_xattr.c | 96 ++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 34 deletions(-) diff --git a/sys/compat/linux/linux_xattr.c b/sys/compat/linux/linux_xattr.c index b54a0d2f89a..90112368415 100644 --- a/sys/compat/linux/linux_xattr.c +++ b/sys/compat/linux/linux_xattr.c @@ -68,6 +68,15 @@ struct setxattr_args { int follow; }; +struct getxattr_args { + int fd; + const char *path; + const char *name; + void *value; + l_size_t size; + int follow; +}; + static char *extattr_namespace_names[] = EXTATTR_NAMESPACE_NAMES; @@ -262,38 +271,7 @@ linux_fremovexattr(struct thread *td, struct linux_fremovexattr_args *args) } static int -linux_path_getxattr(struct thread *td, const char *upath, const char *uname, - void *value, l_size_t size, int follow) -{ - char attrname[LINUX_XATTR_NAME_MAX + 1]; - int attrnamespace, error; - - error = xatrr_to_extattr(uname, &attrnamespace, attrname); - if (error != 0) - return (error); - - return (kern_extattr_get_path(td, upath, attrnamespace, - attrname, value, size, follow, UIO_USERSPACE)); -} - -int -linux_getxattr(struct thread *td, struct linux_getxattr_args *args) -{ - - return (linux_path_getxattr(td, args->path, args->name, - args->value, args->size, FOLLOW)); -} - -int -linux_lgetxattr(struct thread *td, struct linux_lgetxattr_args *args) -{ - - return (linux_path_getxattr(td, args->path, args->name, - args->value, args->size, NOFOLLOW)); -} - -int -linux_fgetxattr(struct thread *td, struct linux_fgetxattr_args *args) +getxattr(struct thread *td, struct getxattr_args *args) { char attrname[LINUX_XATTR_NAME_MAX + 1]; int attrnamespace, error; @@ -301,8 +279,58 @@ linux_fgetxattr(struct thread *td, struct linux_fgetxattr_args *args) error = xatrr_to_extattr(args->name, &attrnamespace, attrname); if (error != 0) return (error); - return (kern_extattr_get_fd(td, args->fd, attrnamespace, - attrname, args->value, args->size)); + if (args->path != NULL) + error = kern_extattr_get_path(td, args->path, attrnamespace, + attrname, args->value, args->size, args->follow, UIO_USERSPACE); + else + error = kern_extattr_get_fd(td, args->fd, attrnamespace, + attrname, args->value, args->size); + return (error); +} + +int +linux_getxattr(struct thread *td, struct linux_getxattr_args *args) +{ + struct getxattr_args eargs = { + .fd = -1, + .path = args->path, + .name = args->name, + .value = args->value, + .size = args->size, + .follow = FOLLOW, + }; + + return (getxattr(td, &eargs)); +} + +int +linux_lgetxattr(struct thread *td, struct linux_lgetxattr_args *args) +{ + struct getxattr_args eargs = { + .fd = -1, + .path = args->path, + .name = args->name, + .value = args->value, + .size = args->size, + .follow = NOFOLLOW, + }; + + return (getxattr(td, &eargs)); +} + +int +linux_fgetxattr(struct thread *td, struct linux_fgetxattr_args *args) +{ + struct getxattr_args eargs = { + .fd = args->fd, + .path = NULL, + .name = args->name, + .value = args->value, + .size = args->size, + .follow = 0, + }; + + return (getxattr(td, &eargs)); } static int