Commit 0619470257 for qemu.org
commit 0619470257869dada67c216826acb6bc357e6dc8
Author: Warner Losh <imp@bsdimp.com>
Date: Tue May 5 00:35:27 2026 -0600
bsd-user: Add link and list extattr functions to os-extattr.h
Add extattr_get_link, extattr_set_link, extattr_delete_link,
extattr_list_fd, extattr_list_file, and extattr_list_link.
Signed-off-by: Stacey Son <sson@FreeBSD.org>
Assisted-by: Claude Opus 4.6 (1M context)
Acked-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
diff --git a/bsd-user/freebsd/os-extattr.h b/bsd-user/freebsd/os-extattr.h
index fb3ef27346..90f0c64c93 100644
--- a/bsd-user/freebsd/os-extattr.h
+++ b/bsd-user/freebsd/os-extattr.h
@@ -204,5 +204,177 @@ static inline abi_long do_freebsd_extattr_delete_fd(abi_long arg1,
return ret;
}
+/* extattr_get_link(2) */
+static inline abi_long do_freebsd_extattr_get_link(abi_long arg1,
+ abi_long arg2,
+ abi_long arg3,
+ abi_long arg4,
+ abi_long arg5)
+{
+ abi_long ret;
+ void *p, *a, *d;
+
+ p = lock_user_string(arg1);
+ if (p == NULL) {
+ return -TARGET_EFAULT;
+ }
+ a = lock_user_string(arg3);
+ if (a == NULL) {
+ unlock_user(p, arg1, 0);
+ return -TARGET_EFAULT;
+ }
+ if (arg4 && arg5 > 0) {
+ d = lock_user(VERIFY_WRITE, arg4, arg5, 0);
+ if (d == NULL) {
+ unlock_user(a, arg3, 0);
+ unlock_user(p, arg1, 0);
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(extattr_get_link(path(p), arg2, a, d, arg5));
+ unlock_user(d, arg4, arg5);
+ } else {
+ ret = get_errno(extattr_get_link(path(p), arg2, a, NULL, arg5));
+ }
+ unlock_user(a, arg3, 0);
+ unlock_user(p, arg1, 0);
+
+ return ret;
+}
+
+/* extattr_set_link(2) */
+static inline abi_long do_freebsd_extattr_set_link(abi_long arg1,
+ abi_long arg2,
+ abi_long arg3,
+ abi_long arg4,
+ abi_long arg5)
+{
+ abi_long ret;
+ void *p, *a, *d;
+
+ p = lock_user_string(arg1);
+ if (p == NULL) {
+ return -TARGET_EFAULT;
+ }
+ a = lock_user_string(arg3);
+ if (a == NULL) {
+ unlock_user(p, arg1, 0);
+ return -TARGET_EFAULT;
+ }
+ d = lock_user(VERIFY_READ, arg4, arg5, 1);
+ if (d == NULL) {
+ unlock_user(a, arg3, 0);
+ unlock_user(p, arg1, 0);
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(extattr_set_link(path(p), arg2, a, d, arg5));
+ unlock_user(d, arg4, arg5);
+ unlock_user(a, arg3, 0);
+ unlock_user(p, arg1, 0);
+
+ return ret;
+}
+
+/* extattr_delete_link(2) */
+static inline abi_long do_freebsd_extattr_delete_link(abi_long arg1,
+ abi_long arg2,
+ abi_long arg3)
+{
+ abi_long ret;
+ void *p, *a;
+
+ p = lock_user_string(arg1);
+ if (p == NULL) {
+ return -TARGET_EFAULT;
+ }
+ a = lock_user_string(arg3);
+ if (a == NULL) {
+ unlock_user(p, arg1, 0);
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(extattr_delete_link(path(p), arg2, a));
+ unlock_user(a, arg3, 0);
+ unlock_user(p, arg1, 0);
+
+ return ret;
+}
+
+/* extattr_list_fd(2) */
+static inline abi_long do_freebsd_extattr_list_fd(
+ abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4)
+{
+ abi_long ret;
+ void *d;
+
+ if (arg3 && arg4 > 0) {
+ d = lock_user(VERIFY_WRITE, arg3, arg4, 0);
+ if (d == NULL) {
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(extattr_list_fd(arg1, arg2, d, arg4));
+ unlock_user(d, arg3, arg4);
+ } else {
+ ret = get_errno(extattr_list_fd(arg1, arg2, NULL, arg4));
+ }
+ return ret;
+}
+
+/* extattr_list_file(2) */
+static inline abi_long do_freebsd_extattr_list_file(
+ abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4)
+{
+ abi_long ret;
+ void *p, *d;
+
+ p = lock_user_string(arg1);
+ if (p == NULL) {
+ return -TARGET_EFAULT;
+ }
+ if (arg3 && arg4 > 0) {
+ d = lock_user(VERIFY_WRITE, arg3, arg4, 0);
+ if (d == NULL) {
+ unlock_user(p, arg1, 0);
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(extattr_list_file(path(p), arg2, d, arg4));
+ unlock_user(d, arg3, arg4);
+ } else {
+ ret = get_errno(extattr_list_file(path(p), arg2, NULL, arg4));
+ }
+ unlock_user(p, arg1, 0);
+
+ return ret;
+}
+
+/* extattr_list_link(2) */
+static inline abi_long do_freebsd_extattr_list_link(
+ abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4)
+{
+ abi_long ret;
+ void *p, *d;
+
+ p = lock_user_string(arg1);
+ if (p == NULL) {
+ return -TARGET_EFAULT;
+ }
+ if (arg3 && arg4 > 0) {
+ d = lock_user(VERIFY_WRITE, arg3, arg4, 0);
+ if (d == NULL) {
+ unlock_user(p, arg1, 0);
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(extattr_list_link(path(p), arg2, d, arg4));
+ unlock_user(d, arg3, arg4);
+ } else {
+ ret = get_errno(extattr_list_link(path(p), arg2, NULL, arg4));
+ }
+ unlock_user(p, arg1, 0);
+
+ return ret;
+}
+
+/*
+ * Access Control Lists
+ */
+
#endif /* FREEBSD_OS_EXTATTR_H */