[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 26/33] Implement freebsd11 stat related syscalls
From: |
Karim Taha |
Subject: |
[PATCH 26/33] Implement freebsd11 stat related syscalls |
Date: |
Tue, 8 Aug 2023 08:08:08 +0200 |
From: Michal Meloun <mmel@FreeBSD.org>
Implement the freebsd11 variant of the following syscalls:
getdirecentries(2)
Co-authored-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Michal Meloun <mmel@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
bsd-user/freebsd/os-stat.h | 44 ++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/bsd-user/freebsd/os-stat.h b/bsd-user/freebsd/os-stat.h
index 04a61fabd1..26909af455 100644
--- a/bsd-user/freebsd/os-stat.h
+++ b/bsd-user/freebsd/os-stat.h
@@ -41,6 +41,11 @@ __sym_compat(statfs, freebsd11_statfs, FBSD_1.0);
int freebsd11_fstatfs(int fd, struct freebsd11_statfs *buf);
__sym_compat(fstatfs, freebsd11_fstatfs, FBSD_1.0);
+ssize_t freebsd11_getdirentries(int fd, char *buf, size_t nbytes, off_t
*basep);
+__sym_compat(getdirentries, freebsd11_getdirentries, FBSD_1.0);
+ssize_t freebsd11_getdents(int fd, char *buf, size_t nbytes);
+__sym_compat(getdents, freebsd11_getdents, FBSD_1.0);
+
/* stat(2) */
static inline abi_long do_freebsd11_stat(abi_long arg1, abi_long arg2)
@@ -468,6 +473,45 @@ static inline abi_long do_freebsd11_getdents(abi_long arg1,
return ret;
}
+/* getdirecentries(2) */
+static inline abi_long do_freebsd11_getdirentries(abi_long arg1,
+ abi_ulong arg2, abi_long nbytes, abi_ulong arg4)
+{
+ abi_long ret;
+ struct freebsd11_dirent *dirp;
+ long basep;
+
+ dirp = lock_user(VERIFY_WRITE, arg2, nbytes, 0);
+ if (dirp == NULL) {
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(freebsd11_getdirentries(arg1, (char *)dirp, nbytes,
&basep));
+ if (!is_error(ret)) {
+ struct freebsd11_dirent *de;
+ int len = ret;
+ int reclen;
+
+ de = dirp;
+ while (len > 0) {
+ reclen = de->d_reclen;
+ if (reclen > len) {
+ return -TARGET_EFAULT;
+ }
+ de->d_reclen = tswap16(reclen);
+ de->d_fileno = tswap32(de->d_fileno);
+ len -= reclen;
+ de = (struct freebsd11_dirent *)((void *)de + reclen);
+ }
+ }
+ unlock_user(dirp, arg2, ret);
+ if (arg4) {
+ if (put_user(basep, arg4, abi_ulong)) {
+ return -TARGET_EFAULT;
+ }
+ }
+ return ret;
+}
+
/* getdirecentries(2) */
static inline abi_long do_freebsd_getdirentries(abi_long arg1,
abi_ulong arg2, abi_long nbytes, abi_ulong arg4)
--
2.40.0
- Re: [PATCH 18/33] Implement stat related syscalls, (continued)
[PATCH 19/33] Implement stat related syscalls, Karim Taha, 2023/08/08
[PATCH 20/33] Implement stat related syscalls, Karim Taha, 2023/08/08
[PATCH 21/33] Implement stat related syscalls, Karim Taha, 2023/08/08
[PATCH 22/33] Implement stat related syscalls, Karim Taha, 2023/08/08
[PATCH 23/33] Implement freebsd11 stat related syscalls, Karim Taha, 2023/08/08
[PATCH 24/33] Implement freebsd11 stat related syscalls, Karim Taha, 2023/08/08
[PATCH 25/33] Implement freebsd11 stat related syscalls, Karim Taha, 2023/08/08
[PATCH 26/33] Implement freebsd11 stat related syscalls,
Karim Taha <=
[PATCH 27/33] Implement freebsd11 stat related syscalls, Karim Taha, 2023/08/08
[PATCH 28/33] Implement do_freebsd_realpathat syscall, Karim Taha, 2023/08/08
[PATCH 29/33] Add os-stat.c to the build, Karim Taha, 2023/08/08
[PATCH 30/33] Add glue to call the following syscalls to the freebsd_syscall function:, Karim Taha, 2023/08/08
[PATCH 31/33] Add glue to call the following syscalls to the freebsd_syscall function:, Karim Taha, 2023/08/08
[PATCH 32/33] Add glue to call the following syscalls to the freebsd_syscall function:, Karim Taha, 2023/08/08
[PATCH 33/33] Add glue to call the following syscalls to the freebsd_syscall function:, Karim Taha, 2023/08/08