/* * Copyright (c) 2021-2022, Andreas Kling * Copyright (c) 2021-2022, Kenneth Myhra * Copyright (c) 2021-2022, Sam Atkins * Copyright (c) 2022, Matthias Zimmerman * Copyright (c) 2023, Cameron Youell * Copyright (c) 2024, stasoid * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include namespace Core::System { ErrorOr open(StringView path, int options, mode_t mode) { ByteString string_path = path; int rc = _open(string_path.characters(), options, mode); if (rc < 0) return Error::from_syscall("open"sv, -errno); return rc; } ErrorOr close(int fd) { if (_close(fd) < 0) return Error::from_syscall("close"sv, -errno); return {}; } ErrorOr read(int fd, Bytes buffer) { int rc = _read(fd, buffer.data(), buffer.size()); if (rc < 0) return Error::from_syscall("read"sv, -errno); return rc; } ErrorOr write(int fd, ReadonlyBytes buffer) { int rc = _write(fd, buffer.data(), buffer.size()); if (rc < 0) return Error::from_syscall("write"sv, -errno); return rc; } ErrorOr lseek(int fd, off_t offset, int whence) { long rc = _lseek(fd, offset, whence); if (rc < 0) return Error::from_syscall("lseek"sv, -errno); return rc; } ErrorOr ftruncate(int fd, off_t length) { long position = _tell(fd); if (position == -1) return Error::from_errno(errno); ScopeGuard restore_position { [&] { _lseek(fd, position, SEEK_SET); } }; auto result = lseek(fd, length, SEEK_SET); if (result.is_error()) return result.release_error(); if (SetEndOfFile((HANDLE)_get_osfhandle(fd)) == 0) return Error::from_windows_error(GetLastError()); return {}; } ErrorOr fstat(int fd) { struct stat st = {}; if (::fstat(fd, &st) < 0) return Error::from_syscall("fstat"sv, -errno); return st; } ErrorOr ioctl(int, unsigned, ...) { dbgln("Core::System::ioctl() is not implemented"); VERIFY_NOT_REACHED(); } }