From b45b7e960294138e76bb52cf0c3c0ad4f197a312 Mon Sep 17 00:00:00 2001 From: Dennis Bonke Date: Tue, 24 Dec 2024 00:06:57 +0100 Subject: [PATCH] sysdeps/managarm: Add sys_fstatfs --- sysdeps/managarm/generic/file.cpp | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/sysdeps/managarm/generic/file.cpp b/sysdeps/managarm/generic/file.cpp index ce2bee856..a62a489c8 100644 --- a/sysdeps/managarm/generic/file.cpp +++ b/sysdeps/managarm/generic/file.cpp @@ -2734,4 +2734,37 @@ int sys_sysinfo(struct sysinfo *info) { return 0; } +int sys_fstatfs(int fd, struct statfs *buf) { + SignalGuard sguard; + + managarm::posix::FstatfsRequest req(getSysdepsAllocator()); + req.set_fd(fd); + + auto [offer, send_req, recv_resp] = exchangeMsgsSync( + getPosixLane(), + helix_ng::offer( + helix_ng::sendBragiHeadOnly(req, getSysdepsAllocator()), helix_ng::recvInline() + ) + ); + + HEL_CHECK(offer.error()); + HEL_CHECK(send_req.error()); + HEL_CHECK(recv_resp.error()); + + managarm::posix::FstatfsResponse resp(getSysdepsAllocator()); + resp.ParseFromArray(recv_resp.data(), recv_resp.length()); + + if (resp.error() == managarm::posix::Errors::BAD_FD) { + return EBADF; + } else if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { + // Check? + return ENOENT; + } else { + __ensure(resp.error() == managarm::posix::Errors::SUCCESS); + memset(buf, NULL, sizeof(struct statfs)); + buf->f_type = resp.fstype(); + return 0; + } +} + } // namespace mlibc