From 8e14944cf1f6573756ee8e476ab366615a918b29 Mon Sep 17 00:00:00 2001 In-Reply-To: <1383928417-38009-1-git-send-email-sson@FreeBSD.org> References: <1383928417-38009-1-git-send-email-sson@FreeBSD.org> From: Stacey Son Date: Tue, 8 Oct 2013 11:26:03 -0500 Subject: [PATCH v3 16/19] bsd-user: add support for extattr and ACL related syscalls This change add support for extended attribute and Access Control List (ACL) related system calls including extattrctl(), extattr_set_file(2), extattr_delete_file(2), extattr_set_fd(2), extattr_get_fd(2), extattr_delete_fd(2), extattr_get_link(2), extattr_set_link(2), extattr_delete_link(2), extattr_list_fd(2), extattr_list_file(2), extattr_list_link(2), __acl_aclcheck_fd(), __acl_aclcheck_file(), __acl_aclcheck_link(), __acl_delete_fd(), __acl_delete_file(), __acl_delete_link(), __acl_get_fd(), __acl_get_file(), __acl_get_link(), __acl_get_fd(), __acl_set_file(), and __acl_set_link(). --- bsd-user/Makefile.objs | 2 +- bsd-user/freebsd/os-extattr.c | 118 ++++++++ bsd-user/freebsd/os-extattr.h | 654 +++++++++++++++++++++++++++++++++++++++++ bsd-user/freebsd/qemu-os.h | 6 + bsd-user/netbsd/os-extattr.h | 247 ++++++++++++++++ bsd-user/openbsd/os-extattr.h | 247 ++++++++++++++++ bsd-user/syscall.c | 104 +++++++ 7 files changed, 1377 insertions(+), 1 deletions(-) create mode 100644 bsd-user/freebsd/os-extattr.c create mode 100644 bsd-user/freebsd/os-extattr.h create mode 100644 bsd-user/netbsd/os-extattr.h create mode 100644 bsd-user/openbsd/os-extattr.h diff --git a/bsd-user/Makefile.objs b/bsd-user/Makefile.objs index a6dba89..d2e005b 100644 --- a/bsd-user/Makefile.objs +++ b/bsd-user/Makefile.objs @@ -1,6 +1,6 @@ obj-y = main.o bsdload.o elfload.o mmap.o signal.o strace.o syscall.o \ uaccess.o bsd-ioctl.o bsd-mem.o bsd-proc.o bsd-socket.o \ - $(HOST_VARIANT_DIR)/os-proc.o \ + $(HOST_VARIANT_DIR)/os-extattr.o $(HOST_VARIANT_DIR)/os-proc.o \ $(HOST_VARIANT_DIR)/os-socket.o $(HOST_VARIANT_DIR)/os-stat.o \ $(HOST_VARIANT_DIR)/os-sys.o $(HOST_VARIANT_DIR)/os-thread.o \ $(HOST_VARIANT_DIR)/os-time.o $(TARGET_ABI_DIR)/target_arch_cpu.o diff --git a/bsd-user/freebsd/os-extattr.c b/bsd-user/freebsd/os-extattr.c new file mode 100644 index 0000000..95e7b24 --- /dev/null +++ b/bsd-user/freebsd/os-extattr.c @@ -0,0 +1,118 @@ +/* + * FreeBSD extend attributes and ACL conversions + * + * Copyright (c) 2013 Stacey D. Son + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include +#ifndef _ACL_PRIVATE +#define _ACL_PRIVATE +#endif +#include + +#include "qemu.h" +#include "qemu-os.h" + +/* + * FreeBSD ACL conversion. + */ +abi_long t2h_freebsd_acl(struct acl *host_acl, abi_ulong target_addr) +{ + uint32_t i; + struct target_freebsd_acl *target_acl; + + if (!lock_user_struct(VERIFY_READ, target_acl, target_addr, 1)) { + return -TARGET_EFAULT; + } + __get_user(host_acl->acl_maxcnt, &target_acl->acl_maxcnt); + __get_user(host_acl->acl_cnt, &target_acl->acl_cnt); + + for (i = 0; i < host_acl->acl_maxcnt; i++) { + __get_user(host_acl->acl_entry[i].ae_tag, + &target_acl->acl_entry[i].ae_tag); + __get_user(host_acl->acl_entry[i].ae_id, + &target_acl->acl_entry[i].ae_id); + __get_user(host_acl->acl_entry[i].ae_perm, + &target_acl->acl_entry[i].ae_perm); + __get_user(host_acl->acl_entry[i].ae_entry_type, + &target_acl->acl_entry[i].ae_entry_type); + __get_user(host_acl->acl_entry[i].ae_flags, + &target_acl->acl_entry[i].ae_flags); + } + + unlock_user_struct(target_acl, target_addr, 0); + return 0; +} + +abi_long h2t_freebsd_acl(abi_ulong target_addr, struct acl *host_acl) +{ + uint32_t i; + struct target_freebsd_acl *target_acl; + + if (!lock_user_struct(VERIFY_WRITE, target_acl, target_addr, 0)) { + return -TARGET_EFAULT; + } + + __put_user(host_acl->acl_maxcnt, &target_acl->acl_maxcnt); + __put_user(host_acl->acl_cnt, &target_acl->acl_cnt); + + for (i = 0; i < host_acl->acl_maxcnt; i++) { + __put_user(host_acl->acl_entry[i].ae_tag, + &target_acl->acl_entry[i].ae_tag); + __put_user(host_acl->acl_entry[i].ae_id, + &target_acl->acl_entry[i].ae_id); + __put_user(host_acl->acl_entry[i].ae_perm, + &target_acl->acl_entry[i].ae_perm); + __put_user(host_acl->acl_entry[i].ae_entry_type, + &target_acl->acl_entry[i].ae_entry_type); + __put_user(host_acl->acl_entry[i].ae_flags, + &target_acl->acl_entry[i].ae_flags); + } + + unlock_user_struct(target_acl, target_addr, 1); + return 0; +} + +abi_long t2h_freebsd_acl_type(acl_type_t *host_type, abi_long target_type) +{ + + switch (target_type) { + case TARGET_FREEBSD_ACL_TYPE_ACCESS_OLD: + *host_type = ACL_TYPE_ACCESS_OLD; + break; + + case TARGET_FREEBSD_ACL_TYPE_DEFAULT_OLD: + *host_type = ACL_TYPE_DEFAULT_OLD; + break; + + case TARGET_FREEBSD_ACL_TYPE_ACCESS: + *host_type = ACL_TYPE_ACCESS; + break; + + case TARGET_FREEBSD_ACL_TYPE_DEFAULT: + *host_type = ACL_TYPE_ACCESS; + break; + + case TARGET_FREEBSD_ACL_TYPE_NFS4: + *host_type = ACL_TYPE_NFS4; + break; + + default: + return -TARGET_EINVAL; + } + return 0; +} + diff --git a/bsd-user/freebsd/os-extattr.h b/bsd-user/freebsd/os-extattr.h new file mode 100644 index 0000000..2e45f42 --- /dev/null +++ b/bsd-user/freebsd/os-extattr.h @@ -0,0 +1,654 @@ +/* + * FreeBSD extended attributes and ACL system call support + * + * Copyright (c) 2013 Stacey D. Son + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include +#ifndef _ACL_PRIVATE +#define _ACL_PRIVATE +#endif +#include + +#include "qemu-os.h" + +/* extattrctl() */ +static inline abi_long do_freebsd_extattrctl(abi_ulong arg1, abi_ulong arg2, + abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + abi_long ret; + void *p, *a, *f; + + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + f = lock_user_string(arg3); + if (f == NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + a = lock_user_string(arg5); + if (a == NULL) { + unlock_user(f, arg3, 0); + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret = get_errno(extattrctl(path(p), arg2, f, arg4, a)); + unlock_user(a, arg5, 0); + unlock_user(f, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_set_file(2) */ +static inline abi_long do_freebsd_extattr_set_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong 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_file(path(p), arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_get_file(2) */ +static inline abi_long do_freebsd_extattr_get_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong 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_file(path(p), arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + } else { + ret = get_errno(extattr_get_file(path(p), arg2, a, NULL, arg5)); + } + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_delete_file(2) */ +static inline abi_long do_freebsd_extattr_delete_file(abi_ulong arg1, + abi_long arg2, abi_ulong 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_file(path(p), arg2, a)); + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_set_fd(2) */ +static inline abi_long do_freebsd_extattr_set_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + abi_long ret; + void *a, *d; + + a = lock_user_string(arg3); + if (a == NULL) { + return -TARGET_EFAULT; + } + d = lock_user(VERIFY_READ, arg4, arg5, 1); + if (d == NULL) { + unlock_user(a, arg3, 0); + return -TARGET_EFAULT; + } + ret = get_errno(extattr_set_fd(arg1, arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + unlock_user(a, arg3, 0); + + return ret; +} + +/* extattr_get_fd(2) */ +static inline abi_long do_freebsd_extattr_get_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + abi_long ret; + void *a, *d; + + a = lock_user_string(arg3); + if (a == NULL) { + return -TARGET_EFAULT; + } + + if (arg4 && arg5 > 0) { + d = lock_user(VERIFY_WRITE, arg4, arg5, 0); + if (d == NULL) { + unlock_user(a, arg3, 0); + return -TARGET_EFAULT; + } + ret = get_errno(extattr_get_fd(arg1, arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + } else { + ret = get_errno(extattr_get_fd(arg1, arg2, a, NULL, arg5)); + } + unlock_user(a, arg3, 0); + + return ret; +} + +/* extattr_delete_fd(2) */ +static inline abi_long do_freebsd_extattr_delete_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3) +{ + abi_long ret; + void *a; + + a = lock_user_string(arg3); + if (a == NULL) { + return -TARGET_EFAULT; + } + ret = get_errno(extattr_delete_fd(arg1, arg2, a)); + unlock_user(a, arg3, 0); + + return ret; +} + +/* extattr_get_link(2) */ +static inline abi_long do_freebsd_extattr_get_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong 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) { + 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_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong 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_ulong arg1, + abi_long arg2, abi_ulong 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_ulong arg3, abi_ulong 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_ulong arg3, abi_ulong 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_ulong arg3, abi_ulong 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 + */ + +/* __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + abi_long ret; + struct acl host_acl; + acl_type_t type; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + ret = t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret = get_errno(__acl_aclcheck_fd(arg1, type, &host_acl)); + } + + return ret; +} + +/* __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + abi_long ret; + void *p; + struct acl host_acl; + acl_type_t type; + + ret = t2h_freebsd_acl_type(&type, arg2); + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + ret = t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret = get_errno(__acl_aclcheck_file(path(p) , arg2, &host_acl)); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + abi_long ret; + void *p; + struct acl host_acl; + acl_type_t type; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + ret = t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret = get_errno(__acl_aclcheck_link(path(p), type, &host_acl)); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_delete_fd(int filedes, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_fd(abi_long arg1, abi_long arg2) +{ + abi_long ret; + acl_type_t type; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + return get_errno(__acl_delete_fd(arg1, type)); +} + +/* int __acl_delete_file(const char *path, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_file(abi_ulong arg1, + abi_long arg2) +{ + abi_long ret; + void *p; + acl_type_t type; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + ret = get_errno(__acl_delete_file(path(p), type)); + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_delete_link(const char *path, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_link(abi_ulong arg1, + abi_long arg2) +{ + abi_long ret; + void *p; + acl_type_t type; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + ret = get_errno(__acl_delete_link(path(p), type)); + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + abi_long ret; + acl_type_t type; + struct acl host_acl; + + bzero(&host_acl, sizeof(struct acl)); + host_acl.acl_maxcnt = ACL_MAX_ENTRIES; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + ret = get_errno(__acl_get_fd(arg1, type, &host_acl)); + if (!is_error(ret)) { + ret = h2t_freebsd_acl(arg3, &host_acl); + } + + return ret; +} + +/* __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_file(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + abi_long ret; + void *p; + acl_type_t type; + struct acl host_acl; + + bzero(&host_acl, sizeof(struct acl)); + host_acl.acl_maxcnt = ACL_MAX_ENTRIES; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + ret = get_errno(__acl_get_file(path(p), type, &host_acl)); + if (!is_error(ret)) { + ret = h2t_freebsd_acl(arg3, &host_acl); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_link(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + abi_long ret; + void *p; + acl_type_t type; + struct acl host_acl; + + bzero(&host_acl, sizeof(struct acl)); + host_acl.acl_maxcnt = ACL_MAX_ENTRIES; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + ret = get_errno(__acl_get_link(path(p), type, &host_acl)); + if (!is_error(ret)) { + ret = h2t_freebsd_acl(arg3, &host_acl); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + abi_long ret; + acl_type_t type; + struct acl host_acl; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + ret = t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret = get_errno(__acl_set_fd(arg1, type, &host_acl)); + } + + return ret; +} + +/* int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_file(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + abi_long ret; + void *p; + acl_type_t type; + struct acl host_acl; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + ret = t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret = get_errno(__acl_set_file(path(p), type, &host_acl)); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_link(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + abi_long ret; + void *p; + acl_type_t type; + struct acl host_acl; + + ret = t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p = lock_user_string(arg1); + if (p == NULL) { + return -TARGET_EFAULT; + } + ret = t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret = get_errno(__acl_set_link(path(p), type, &host_acl)); + } + unlock_user(p, arg1, 0); + + return ret; +} + diff --git a/bsd-user/freebsd/qemu-os.h b/bsd-user/freebsd/qemu-os.h index b5510dc..7d79e52 100644 --- a/bsd-user/freebsd/qemu-os.h +++ b/bsd-user/freebsd/qemu-os.h @@ -70,4 +70,10 @@ abi_long h2t_freebsd_rtprio(abi_ulong target_addr, struct rtprio *host_rtp); abi_long do_freebsd_thr_new(CPUArchState *env, abi_ulong target_param_addr, int32_t param_size); +/* os-extattr.c */ +struct acl; +abi_long t2h_freebsd_acl(struct acl *host_acl, abi_ulong target_addr); +abi_long h2t_freebsd_acl(abi_ulong target_addr, struct acl *host_acl); +abi_long t2h_freebsd_acl_type(acl_type_t *host_type, abi_long target_type); + #endif /* !_QEMU_OS_H_ */ diff --git a/bsd-user/netbsd/os-extattr.h b/bsd-user/netbsd/os-extattr.h new file mode 100644 index 0000000..c2f42ac --- /dev/null +++ b/bsd-user/netbsd/os-extattr.h @@ -0,0 +1,247 @@ +/* + * NetBSD extended attributes and ACL system call support + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +/* XXX To support FreeBSD targets the following will need to be added. */ + +/* extattrctl() */ +static inline abi_long do_freebsd_extattrctl(abi_ulong arg1, abi_ulong arg2, + abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattrctl()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_set_file(2) */ +static inline abi_long do_freebsd_extattr_set_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_set_file()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_get_file(2) */ +static inline abi_long do_freebsd_extattr_get_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_get_file()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_delete_file(2) */ +static inline abi_long do_freebsd_extattr_delete_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall extattr_delete_file()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_set_fd(2) */ +static inline abi_long do_freebsd_extattr_set_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_set_fd()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_get_fd(2) */ +static inline abi_long do_freebsd_extattr_get_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_get_fd()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_delete_fd(2) */ +static inline abi_long do_freebsd_extattr_delete_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall extattr_delete_fd()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_get_link(2) */ +static inline abi_long do_freebsd_extattr_get_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_get_link()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_set_link(2) */ +static inline abi_long do_freebsd_extattr_set_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_set_link()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_delete_link(2) */ +static inline abi_long do_freebsd_extattr_delete_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall extattr_delete_link()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_list_fd(2) */ +static inline abi_long do_freebsd_extattr_list_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3, abi_ulong arg4) +{ + + qemu_log("qemu: Unsupported syscall exattr_list_fd()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_list_file(2) */ +static inline abi_long do_freebsd_extattr_list_file(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4) +{ + + qemu_log("qemu: Unsupported syscall extattr_list_file()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_list_link(2) */ +static inline abi_long do_freebsd_extattr_list_link(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4) +{ + + qemu_log("qemu: Unsupported syscall extattr_list_link()\n"); + return -TARGET_ENOSYS; +} + +/* + * Access Control Lists + */ + +/* __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_aclcheck_fd()\n"); + return -TARGET_ENOSYS; +} + +/* __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_aclcheck_file()\n"); + return -TARGET_ENOSYS; +} + +/* __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_aclcheck_link()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_delete_fd(int filedes, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_fd(abi_long arg1, abi_long arg2) +{ + + qemu_log("qemu: Unsupported syscall __acl_delete_fd()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_delete_file(const char *path, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_file(abi_ulong arg1, + abi_long arg2) +{ + + qemu_log("qemu: Unsupported syscall __acl_delete_fil()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_delete_link(const char *path, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_link(abi_ulong arg1, + abi_long arg2) +{ + + qemu_log("qemu: Unsupported syscall __acl_delete_link()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_get_fd()\n"); + return -TARGET_ENOSYS; +} + +/* __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_file(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_get_file()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_link(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall _acl_get_link()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_set_fd()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_file(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_set_file()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_link(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_set_link()\n"); + return -TARGET_ENOSYS; +} + diff --git a/bsd-user/openbsd/os-extattr.h b/bsd-user/openbsd/os-extattr.h new file mode 100644 index 0000000..5c23af3 --- /dev/null +++ b/bsd-user/openbsd/os-extattr.h @@ -0,0 +1,247 @@ +/* + * OpenBSD extended attributes and ACL system call support + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +/* XXX To support FreeBSD targets the following will need to be added. */ + +/* extattrctl() */ +static inline abi_long do_freebsd_extattrctl(abi_ulong arg1, abi_ulong arg2, + abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattrctl()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_set_file(2) */ +static inline abi_long do_freebsd_extattr_set_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_set_file()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_get_file(2) */ +static inline abi_long do_freebsd_extattr_get_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_get_file()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_delete_file(2) */ +static inline abi_long do_freebsd_extattr_delete_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall extattr_delete_file()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_set_fd(2) */ +static inline abi_long do_freebsd_extattr_set_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_set_fd()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_get_fd(2) */ +static inline abi_long do_freebsd_extattr_get_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_get_fd()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_delete_fd(2) */ +static inline abi_long do_freebsd_extattr_delete_fd(abi_long arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall extattr_delete_fd()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_get_link(2) */ +static inline abi_long do_freebsd_extattr_get_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_get_link()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_set_link(2) */ +static inline abi_long do_freebsd_extattr_set_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + + qemu_log("qemu: Unsupported syscall extattr_set_link()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_delete_link(2) */ +static inline abi_long do_freebsd_extattr_delete_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall extattr_delete_link()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_list_fd(2) */ +static inline abi_long do_freebsd_extattr_list_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3, abi_ulong arg4) +{ + + qemu_log("qemu: Unsupported syscall exattr_list_fd()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_list_file(2) */ +static inline abi_long do_freebsd_extattr_list_file(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4) +{ + + qemu_log("qemu: Unsupported syscall extattr_list_file()\n"); + return -TARGET_ENOSYS; +} + +/* extattr_list_link(2) */ +static inline abi_long do_freebsd_extattr_list_link(abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4) +{ + + qemu_log("qemu: Unsupported syscall extattr_list_link()\n"); + return -TARGET_ENOSYS; +} + +/* + * Access Control Lists + */ + +/* __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_aclcheck_fd()\n"); + return -TARGET_ENOSYS; +} + +/* __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_file(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_aclcheck_file()\n"); + return -TARGET_ENOSYS; +} + +/* __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_link(abi_ulong arg1, + abi_long arg2, abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_aclcheck_link()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_delete_fd(int filedes, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_fd(abi_long arg1, abi_long arg2) +{ + + qemu_log("qemu: Unsupported syscall __acl_delete_fd()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_delete_file(const char *path, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_file(abi_ulong arg1, + abi_long arg2) +{ + + qemu_log("qemu: Unsupported syscall __acl_delete_fil()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_delete_link(const char *path, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_link(abi_ulong arg1, + abi_long arg2) +{ + + qemu_log("qemu: Unsupported syscall __acl_delete_link()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_get_fd()\n"); + return -TARGET_ENOSYS; +} + +/* __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_file(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_get_file()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_link(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall _acl_get_link()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_fd(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_set_fd()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_file(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_set_file()\n"); + return -TARGET_ENOSYS; +} + +/* int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_link(abi_ulong arg1, abi_long arg2, + abi_ulong arg3) +{ + + qemu_log("qemu: Unsupported syscall __acl_set_link()\n"); + return -TARGET_ENOSYS; +} + diff --git a/bsd-user/syscall.c b/bsd-user/syscall.c index 6cd7dbd..ab17f3f 100644 --- a/bsd-user/syscall.c +++ b/bsd-user/syscall.c @@ -42,6 +42,7 @@ #include "bsd-socket.h" /* *BSD dependent syscall shims */ +#include "os-extattr.h" #include "os-time.h" #include "os-proc.h" #include "os-signal.h" @@ -1204,6 +1205,109 @@ abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1, arg5, arg6, arg7, arg8, 0); break; + /* + * extended attributes system calls + */ + case TARGET_FREEBSD_NR_extattrctl: /* extattrctl() */ + ret = do_freebsd_extattrctl(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_set_file: /* extattr_set_file(2) */ + ret = do_freebsd_extattr_set_file(arg1, arg2, arg3, arg4, arg4); + break; + + case TARGET_FREEBSD_NR_extattr_get_file: /* extattr_get_file(2) */ + ret = do_freebsd_extattr_get_file(arg1, arg2, arg3, arg4, arg4); + break; + + case TARGET_FREEBSD_NR_extattr_delete_file: /* extattr_delete_file(2) */ + ret = do_freebsd_extattr_delete_file(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_extattr_set_fd: /* extattr_set_fd(2) */ + ret = do_freebsd_extattr_set_fd(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_get_fd: /* extattr_get_fd(2) */ + ret = do_freebsd_extattr_get_fd(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_delete_fd: /* extattr_delete_fd(2) */ + ret = do_freebsd_extattr_delete_fd(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_extattr_get_link: /* extattr_get_link(2) */ + ret = do_freebsd_extattr_get_link(arg1, arg2, arg3, arg4, arg4); + break; + + case TARGET_FREEBSD_NR_extattr_set_link: /* extattr_set_link(2) */ + ret = do_freebsd_extattr_set_link(arg1, arg2, arg3, arg4, arg4); + break; + + case TARGET_FREEBSD_NR_extattr_delete_link: /* extattr_delete_link(2) */ + ret = do_freebsd_extattr_delete_link(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_extattr_list_fd: /* extattr_list_fd(2) */ + ret = do_freebsd_extattr_list_fd(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_extattr_list_file: /* extattr_list_file(2) */ + ret = do_freebsd_extattr_list_file(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_extattr_list_link: /* extattr_list_link(2) */ + ret = do_freebsd_extattr_list_link(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR___acl_aclcheck_fd: /* __acl_aclcheck_fd() */ + ret = do_freebsd__acl_aclcheck_fd(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_aclcheck_file: /* __acl_aclcheck_file() */ + ret = do_freebsd__acl_aclcheck_file(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_aclcheck_link: /* __acl_aclcheck_link() */ + ret = do_freebsd__acl_aclcheck_link(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_delete_fd: /* __acl_delete_fd() */ + ret = do_freebsd__acl_delete_fd(arg1, arg2); + break; + + case TARGET_FREEBSD_NR___acl_delete_file: /* __acl_delete_file() */ + ret = do_freebsd__acl_delete_file(arg1, arg2); + break; + + case TARGET_FREEBSD_NR___acl_delete_link: /* __acl_delete_link() */ + ret = do_freebsd__acl_delete_link(arg1, arg2); + break; + + case TARGET_FREEBSD_NR___acl_get_fd: /* __acl_get_fd() */ + ret = do_freebsd__acl_get_fd(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_get_file: /* __acl_get_file() */ + ret = do_freebsd__acl_get_file(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_get_link: /* __acl_get_link() */ + ret = do_freebsd__acl_get_link(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_set_fd: /* __acl_get_fd() */ + ret = do_freebsd__acl_set_fd(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_set_file: /* __acl_set_file() */ + ret = do_freebsd__acl_set_file(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_set_link: /* __acl_set_link() */ + ret = do_freebsd__acl_set_link(arg1, arg2, arg3); + break; + default: ret = get_errno(syscall(num, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)); -- 1.7.8