diff --git a/CMakeLists.txt b/CMakeLists.txt index ad24c08c2..e5fc87eb0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -666,9 +666,9 @@ set(DEV_TOOLS src/core/devtools/layer.cpp set(QUASIFS src/core/file_sys/quasifs/src/quasifs.cpp src/core/file_sys/quasifs/src/quasifs_vdriver.cpp - src/core/file_sys/quasifs/src/quasifs_inode_device.cpp - src/core/file_sys/quasifs/src/quasifs_inode_directory.cpp - src/core/file_sys/quasifs/src/quasifs_inode_regularfile.cpp + src/core/file_sys/quasifs/src/quasifs_inode_quasi_device.cpp + src/core/file_sys/quasifs/src/quasifs_inode_quasi_directory.cpp + src/core/file_sys/quasifs/src/quasifs_inode_quasi_file.cpp src/core/file_sys/quasifs/src/quasifs_inode_virtualfile.cpp src/core/file_sys/quasifs/src/quasifs_inode_symlink.cpp src/core/file_sys/quasifs/src/quasifs_partition.cpp diff --git a/src/core/file_sys/devices/console_device.h b/src/core/file_sys/devices/console_device.h index 2f56124f9..e1e49bfb6 100644 --- a/src/core/file_sys/devices/console_device.h +++ b/src/core/file_sys/devices/console_device.h @@ -3,7 +3,15 @@ #pragma once -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "common/logging/log.h" + +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" + +#define DEVICE_STUB() \ + { \ + LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ + return -QUASI_ENOSYS; \ + } namespace Core::Devices { diff --git a/src/core/file_sys/devices/deci_tty6_device.h b/src/core/file_sys/devices/deci_tty6_device.h index 591e12e07..4efe558bf 100644 --- a/src/core/file_sys/devices/deci_tty6_device.h +++ b/src/core/file_sys/devices/deci_tty6_device.h @@ -4,7 +4,15 @@ #pragma once #include -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "common/logging/log.h" + +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" + +#define DEVICE_STUB() \ + { \ + LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ + return -QUASI_ENOSYS; \ + } namespace Core::Devices { diff --git a/src/core/file_sys/devices/logger.h b/src/core/file_sys/devices/logger.h index 0d80492a0..a573d60e3 100644 --- a/src/core/file_sys/devices/logger.h +++ b/src/core/file_sys/devices/logger.h @@ -7,7 +7,15 @@ #include #include -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "common/logging/log.h" + +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" + +#define DEVICE_STUB() \ + { \ + LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ + return -QUASI_ENOSYS; \ + } namespace Core::Devices { diff --git a/src/core/file_sys/devices/nop_device.h b/src/core/file_sys/devices/nop_device.h index bb3e945b2..14aa0f47f 100644 --- a/src/core/file_sys/devices/nop_device.h +++ b/src/core/file_sys/devices/nop_device.h @@ -3,7 +3,15 @@ #pragma once -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "common/logging/log.h" + +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" + +#define DEVICE_STUB() \ + { \ + LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ + return -QUASI_ENOSYS; \ + } namespace Core::Devices { diff --git a/src/core/file_sys/devices/null_device.h b/src/core/file_sys/devices/null_device.h index ed015f64f..c3d4da129 100644 --- a/src/core/file_sys/devices/null_device.h +++ b/src/core/file_sys/devices/null_device.h @@ -5,7 +5,15 @@ #include -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "common/logging/log.h" + +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" + +#define DEVICE_STUB() \ + { \ + LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ + return -QUASI_ENOSYS; \ + } namespace Core::Devices { diff --git a/src/core/file_sys/devices/random_device.cpp b/src/core/file_sys/devices/random_device.cpp index fdb3bcfc2..d583c1ab3 100644 --- a/src/core/file_sys/devices/random_device.cpp +++ b/src/core/file_sys/devices/random_device.cpp @@ -27,15 +27,11 @@ s64 RandomDevice::write(const void* buf, u64 count) { } s64 RandomDevice::pread(void* buf, u64 count, u64 offset) { - auto rbuf = static_cast(buf); - for (size_t i = 0; i < count; i++) { - rbuf[i] = std::rand() & 0xFF; - } - return count; + return read(buf, count); } s64 RandomDevice::pwrite(const void* buf, u64 count, u64 offset) { - return count; + return write(buf, count); } } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/file_sys/devices/random_device.h b/src/core/file_sys/devices/random_device.h index d0284ccdf..18449f3f4 100644 --- a/src/core/file_sys/devices/random_device.h +++ b/src/core/file_sys/devices/random_device.h @@ -5,7 +5,15 @@ #include -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "common/logging/log.h" + +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" + +#define DEVICE_STUB() \ + { \ + LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ + return -QUASI_ENOSYS; \ + } namespace Core::Devices { @@ -15,9 +23,9 @@ public: ~RandomDevice(); s64 read(void* buf, u64 count) override; - s64 write(const void* buf, u64 count) override ; + s64 write(const void* buf, u64 count) override; s64 pread(void* buf, size_t count, u64 offset) override; - s64 pwrite(const void* buf, size_t count, u64 offset) override ; + s64 pwrite(const void* buf, size_t count, u64 offset) override; // clang-format off s32 ioctl(u64 cmd, Common::VaCtx* args) override { DEVICE_STUB(); } diff --git a/src/core/file_sys/devices/srandom_device.h b/src/core/file_sys/devices/srandom_device.h index 231d9295c..08130575e 100644 --- a/src/core/file_sys/devices/srandom_device.h +++ b/src/core/file_sys/devices/srandom_device.h @@ -5,7 +5,15 @@ #include -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "common/logging/log.h" + +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" + +#define DEVICE_STUB() \ + { \ + LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ + return -QUASI_ENOSYS; \ + } namespace Core::Devices { diff --git a/src/core/file_sys/devices/zero_device.cpp b/src/core/file_sys/devices/zero_device.cpp index d3263c532..439ea879b 100644 --- a/src/core/file_sys/devices/zero_device.cpp +++ b/src/core/file_sys/devices/zero_device.cpp @@ -20,12 +20,11 @@ s64 ZeroDevice::write(const void* buf, u64 count) { } s64 ZeroDevice::pread(void* buf, size_t count, u64 offset) { - memset(buf, 0, count); - return count; + return read(buf, count); } s64 ZeroDevice::pwrite(const void* buf, size_t count, u64 offset) { - return count; + return write(buf, count); } } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/file_sys/devices/zero_device.h b/src/core/file_sys/devices/zero_device.h index 2993964a2..50e58c180 100644 --- a/src/core/file_sys/devices/zero_device.h +++ b/src/core/file_sys/devices/zero_device.h @@ -3,9 +3,15 @@ #pragma once -#include +#include "common/logging/log.h" -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" + +#define DEVICE_STUB() \ + { \ + LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ + return -QUASI_ENOSYS; \ + } namespace Core::Devices { diff --git a/src/core/file_sys/hostio/src/host_io_posix.cpp b/src/core/file_sys/hostio/src/host_io_posix.cpp index 2bfafe6ea..56bde6c5e 100644 --- a/src/core/file_sys/hostio/src/host_io_posix.cpp +++ b/src/core/file_sys/hostio/src/host_io_posix.cpp @@ -10,9 +10,9 @@ #include "../../quasifs/quasi_types.h" -#include "../../quasifs/quasifs_inode_device.h" -#include "../../quasifs/quasifs_inode_directory.h" -#include "../../quasifs/quasifs_inode_regularfile.h" +#include "../../quasifs/quasifs_inode_quasi_device.h" +#include "../../quasifs/quasifs_inode_quasi_directory.h" +#include "../../quasifs/quasifs_inode_quasi_file.h" #include "../../quasifs/quasifs_inode_symlink.h" #include "../../quasifs/quasifs_partition.h" diff --git a/src/core/file_sys/hostio/src/host_io_virtual.cpp b/src/core/file_sys/hostio/src/host_io_virtual.cpp index 1d81b1909..0f1380d32 100644 --- a/src/core/file_sys/hostio/src/host_io_virtual.cpp +++ b/src/core/file_sys/hostio/src/host_io_virtual.cpp @@ -8,9 +8,9 @@ #include "../../quasifs/quasi_errno.h" #include "../../quasifs/quasi_types.h" -#include "../../quasifs/quasifs_inode_device.h" -#include "../../quasifs/quasifs_inode_directory.h" -#include "../../quasifs/quasifs_inode_regularfile.h" +#include "../../quasifs/quasifs_inode_quasi_device.h" +#include "../../quasifs/quasifs_inode_quasi_directory.h" +#include "../../quasifs/quasifs_inode_quasi_file.h" #include "../../quasifs/quasifs_inode_symlink.h" #include "../../quasifs/quasifs_inode_virtualfile.h" #include "../../quasifs/quasifs_partition.h" @@ -169,7 +169,7 @@ int HostIO_Virtual::Truncate(const fs::path& path, u64 size) { if (!node->is_file()) return -QUASI_EINVAL; - return handle->node->ftruncate(size); + return node->ftruncate(size); } int HostIO_Virtual::FTruncate(const int fd, u64 size) { @@ -201,9 +201,9 @@ u64 HostIO_Virtual::LSeek(const int fd, u64 offset, QuasiFS::SeekOrigin origin) auto ptr = &handle->pos; - u64 new_ptr = (SeekOrigin::ORIGIN == origin) * offset + - (SeekOrigin::CURRENT == origin) * (*(ptr) + offset) + - (SeekOrigin::END == origin) * (node->st.st_size + offset); + u64 new_ptr = ((SeekOrigin::ORIGIN == origin) * offset) + + ((SeekOrigin::CURRENT == origin) * (*(ptr) + offset)) + + ((SeekOrigin::END == origin) * (node->st.st_size + offset)); if (new_ptr < 0) return -QUASI_EINVAL; diff --git a/src/core/file_sys/quasifs/README.md b/src/core/file_sys/quasifs/README.md new file mode 100644 index 000000000..431961155 --- /dev/null +++ b/src/core/file_sys/quasifs/README.md @@ -0,0 +1,8 @@ +### Quick rundown +quasifs_inode_quasi_* - standalones/prototypes for more complex objects, i.e. turning regular directory into PFS directory or Partition into patchable partition +quasifs_inode_* - complex types, inode based + +quasi_* - not interacting with FS directly + +quasifs_vdriver - virtual driver for QFS, interfacing with HostIO + diff --git a/src/core/file_sys/quasifs/quasi_types.h b/src/core/file_sys/quasifs/quasi_types.h index 45fcc420b..0a51d30af 100644 --- a/src/core/file_sys/quasifs/quasi_types.h +++ b/src/core/file_sys/quasifs/quasi_types.h @@ -31,10 +31,12 @@ using inode_ptr = std::shared_ptr; class Partition; using partition_ptr = std::shared_ptr; class QuasiFile; -using file_ptr = std::shared_ptr; +using RegularFile = QuasiFile; +using file_ptr = std::shared_ptr; class Symlink; using symlink_ptr = std::shared_ptr; -class Directory; +class QuasiDirectory; +using Directory = QuasiDirectory; using dir_ptr = std::shared_ptr; class Device; using dev_ptr = std::shared_ptr; diff --git a/src/core/file_sys/quasifs/quasifs.h b/src/core/file_sys/quasifs/quasifs.h index b2f461131..aa18ef0c1 100644 --- a/src/core/file_sys/quasifs/quasifs.h +++ b/src/core/file_sys/quasifs/quasifs.h @@ -9,7 +9,7 @@ #include "quasi_errno.h" #include "quasi_types.h" #include "quasifs_inode.h" -#include "quasifs_inode_directory.h" +#include "quasifs_inode_quasi_directory.h" #include "quasifs_inode_symlink.h" #include "../hostio/host_io.h" diff --git a/src/core/file_sys/quasifs/quasifs_inode_device.h b/src/core/file_sys/quasifs/quasifs_inode_quasi_device.h similarity index 51% rename from src/core/file_sys/quasifs/quasifs_inode_device.h rename to src/core/file_sys/quasifs/quasifs_inode_quasi_device.h index 68729702c..c286a2e9f 100644 --- a/src/core/file_sys/quasifs/quasifs_inode_device.h +++ b/src/core/file_sys/quasifs/quasifs_inode_quasi_device.h @@ -3,17 +3,10 @@ #pragma once #include "common/assert.h" -#include "common/logging/log.h" #include "quasi_types.h" #include "quasifs_inode.h" -#define DEVICE_STUB() \ - { \ - LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \ - return -QUASI_ENOSYS; \ - } - namespace QuasiFS { class Device : public Inode { diff --git a/src/core/file_sys/quasifs/quasifs_inode_directory.h b/src/core/file_sys/quasifs/quasifs_inode_quasi_directory.h similarity index 72% rename from src/core/file_sys/quasifs/quasifs_inode_directory.h rename to src/core/file_sys/quasifs/quasifs_inode_quasi_directory.h index e9325baad..9b9a44561 100644 --- a/src/core/file_sys/quasifs/quasifs_inode_directory.h +++ b/src/core/file_sys/quasifs/quasifs_inode_quasi_directory.h @@ -5,22 +5,31 @@ #include #include +#include "common/assert.h" + #include "quasi_types.h" #include "quasifs_inode.h" namespace QuasiFS { // Directory -class Directory : public Inode { +class QuasiDirectory : public Inode { public: std::map entries{}; dir_ptr mounted_root = nullptr; - Directory(); - ~Directory() = default; + QuasiDirectory(); + ~QuasiDirectory() = default; static dir_ptr Create(void) { - return std::make_shared(); + return std::make_shared(); + } + + template + static file_ptr Create(Args&&... args) { + if constexpr (std::is_base_of_v) + return std::make_shared(std::forward(args)...); + UNREACHABLE(); } // diff --git a/src/core/file_sys/quasifs/quasifs_inode_file.h b/src/core/file_sys/quasifs/quasifs_inode_quasi_file.h similarity index 68% rename from src/core/file_sys/quasifs/quasifs_inode_file.h rename to src/core/file_sys/quasifs/quasifs_inode_quasi_file.h index 235d524a8..36fe9cafb 100644 --- a/src/core/file_sys/quasifs/quasifs_inode_file.h +++ b/src/core/file_sys/quasifs/quasifs_inode_quasi_file.h @@ -24,6 +24,12 @@ public: return std::make_shared(std::forward(args)...); UNREACHABLE(); } + + s64 read(void* buf, size_t count) override; + s64 write(const void* buf, size_t count) override; + s64 pread(void* buf, size_t count, u64 offset) override; + s64 pwrite(const void* buf, size_t count, u64 offset) override; + s32 ftruncate(s64 length) override; }; } // namespace QuasiFS \ No newline at end of file diff --git a/src/core/file_sys/quasifs/quasifs_inode_regularfile.h b/src/core/file_sys/quasifs/quasifs_inode_regularfile.h deleted file mode 100644 index fe21963b3..000000000 --- a/src/core/file_sys/quasifs/quasifs_inode_regularfile.h +++ /dev/null @@ -1,26 +0,0 @@ -// INAA License @marecl 2025 - -#pragma once - -#include "quasi_types.h" -#include "quasifs_inode_file.h" - -namespace QuasiFS { - -class RegularFile final : public QuasiFile { - -public: - RegularFile() = default; - ~RegularFile() = default; - - // - // Working functions - // - s64 read(void* buf, size_t count) override; - s64 write(const void* buf, size_t count) override; - s64 pread(void* buf, size_t count, u64 offset) override; - s64 pwrite(const void* buf, size_t count, u64 offset) override; - s32 ftruncate(s64 length) override; -}; - -} // namespace QuasiFS \ No newline at end of file diff --git a/src/core/file_sys/quasifs/quasifs_inode_virtualfile.h b/src/core/file_sys/quasifs/quasifs_inode_virtualfile.h index c1ee9c0f8..b4aeea5bd 100644 --- a/src/core/file_sys/quasifs/quasifs_inode_virtualfile.h +++ b/src/core/file_sys/quasifs/quasifs_inode_virtualfile.h @@ -5,7 +5,7 @@ #include "common/assert.h" #include "quasi_types.h" -#include "quasifs_inode_file.h" +#include "quasifs_inode_quasi_file.h" namespace QuasiFS { diff --git a/src/core/file_sys/quasifs/src/quasifs.cpp b/src/core/file_sys/quasifs/src/quasifs.cpp index facfd3707..7ee54d9a3 100644 --- a/src/core/file_sys/quasifs/src/quasifs.cpp +++ b/src/core/file_sys/quasifs/src/quasifs.cpp @@ -5,8 +5,8 @@ #include "core/file_sys/quasifs/quasifs.h" -#include "core/file_sys/quasifs/quasifs_inode_directory.h" -#include "core/file_sys/quasifs/quasifs_inode_regularfile.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_directory.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_file.h" #include "core/file_sys/quasifs/quasifs_inode_symlink.h" #include "core/file_sys/quasifs/quasifs_inode_virtualfile.h" #include "core/file_sys/quasifs/quasifs_partition.h" @@ -233,7 +233,7 @@ int QFS::Resolve(const fs::path& path, Resolved& res) { if (path.empty()) return -QUASI_EINVAL; if (path.is_relative()) - return -QUASI_EBADF; + return -QUASI_EINVAL; // on return: // node - last element of the path (if exists) diff --git a/src/core/file_sys/quasifs/src/quasifs_inode_device.cpp b/src/core/file_sys/quasifs/src/quasifs_inode_quasi_device.cpp similarity index 82% rename from src/core/file_sys/quasifs/src/quasifs_inode_device.cpp rename to src/core/file_sys/quasifs/src/quasifs_inode_quasi_device.cpp index 08cca3283..6ae33c19a 100644 --- a/src/core/file_sys/quasifs/src/quasifs_inode_device.cpp +++ b/src/core/file_sys/quasifs/src/quasifs_inode_quasi_device.cpp @@ -1,6 +1,6 @@ // INAA License @marecl 2025 -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" namespace QuasiFS { diff --git a/src/core/file_sys/quasifs/src/quasifs_inode_directory.cpp b/src/core/file_sys/quasifs/src/quasifs_inode_quasi_directory.cpp similarity index 77% rename from src/core/file_sys/quasifs/src/quasifs_inode_directory.cpp rename to src/core/file_sys/quasifs/src/quasifs_inode_quasi_directory.cpp index e756359cf..a7e473cd0 100644 --- a/src/core/file_sys/quasifs/src/quasifs_inode_directory.cpp +++ b/src/core/file_sys/quasifs/src/quasifs_inode_quasi_directory.cpp @@ -4,22 +4,22 @@ #include #include "../quasi_errno.h" -#include "core/file_sys/quasifs/quasifs_inode_directory.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_directory.h" namespace QuasiFS { -Directory::Directory() { +QuasiDirectory::QuasiDirectory() { st.st_mode |= QUASI_S_IFDIR; } -inode_ptr Directory::lookup(const std::string& name) { +inode_ptr QuasiDirectory::lookup(const std::string& name) { auto it = entries.find(name); if (it == entries.end()) return nullptr; return it->second; } -int Directory::link(const std::string& name, inode_ptr child) { +int QuasiDirectory::link(const std::string& name, inode_ptr child) { if (name.empty()) return -QUASI_ENOENT; if (entries.count(name)) @@ -30,7 +30,7 @@ int Directory::link(const std::string& name, inode_ptr child) { return 0; } -int Directory::unlink(const std::string& name) { +int QuasiDirectory::unlink(const std::string& name) { auto it = entries.find(name); if (it == entries.end()) return -QUASI_ENOENT; @@ -38,7 +38,7 @@ int Directory::unlink(const std::string& name) { inode_ptr target = it->second; // if directory and not empty -> EBUSY or ENOTEMPTY if (target->is_dir()) { - dir_ptr dir = std::static_pointer_cast(target); + dir_ptr dir = std::static_pointer_cast(target); auto children = dir->list(); children.erase(std::remove(children.begin(), children.end(), "."), children.end()); children.erase(std::remove(children.begin(), children.end(), ".."), children.end()); @@ -57,7 +57,7 @@ int Directory::unlink(const std::string& name) { return 0; } -std::vector Directory::list() { +std::vector QuasiDirectory::list() { std::vector r; for (auto& p : entries) r.push_back(p.first); diff --git a/src/core/file_sys/quasifs/src/quasifs_inode_regularfile.cpp b/src/core/file_sys/quasifs/src/quasifs_inode_quasi_file.cpp similarity index 62% rename from src/core/file_sys/quasifs/src/quasifs_inode_regularfile.cpp rename to src/core/file_sys/quasifs/src/quasifs_inode_quasi_file.cpp index df7c2ba34..be2fa8d40 100644 --- a/src/core/file_sys/quasifs/src/quasifs_inode_regularfile.cpp +++ b/src/core/file_sys/quasifs/src/quasifs_inode_quasi_file.cpp @@ -3,26 +3,26 @@ #include #include "../quasi_errno.h" -#include "core/file_sys/quasifs/quasifs_inode_regularfile.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_file.h" namespace QuasiFS { -s64 RegularFile::read(void* buf, size_t count) { +s64 QuasiFile::read(void* buf, size_t count) { return pread(buf, count, 0); } -s64 RegularFile::write(const void* buf, size_t count) { +s64 QuasiFile::write(const void* buf, size_t count) { return pwrite(buf, count, 0); } -s64 RegularFile::pread(void* buf, size_t count, u64 offset) { +s64 QuasiFile::pread(void* buf, size_t count, u64 offset) { auto size = &this->st.st_size; auto end_pos = offset + count; return end_pos > *size ? *size - offset : count; } -s64 RegularFile::pwrite(const void* buf, size_t count, u64 offset) { +s64 QuasiFile::pwrite(const void* buf, size_t count, u64 offset) { auto size = &this->st.st_size; auto end_pos = offset + count; @@ -31,7 +31,7 @@ s64 RegularFile::pwrite(const void* buf, size_t count, u64 offset) { return count; } -s32 RegularFile::ftruncate(s64 length) { +s32 QuasiFile::ftruncate(s64 length) { if (length < 0) return -QUASI_EINVAL; this->st.st_size = length; diff --git a/src/core/file_sys/quasifs/src/quasifs_partition.cpp b/src/core/file_sys/quasifs/src/quasifs_partition.cpp index ab667ee36..b7fc4a333 100644 --- a/src/core/file_sys/quasifs/src/quasifs_partition.cpp +++ b/src/core/file_sys/quasifs/src/quasifs_partition.cpp @@ -3,8 +3,8 @@ #include "../quasi_errno.h" #include "../quasi_types.h" -#include "core/file_sys/quasifs/quasifs_inode_directory.h" -#include "core/file_sys/quasifs/quasifs_inode_regularfile.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_directory.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_file.h" #include "core/file_sys/quasifs/quasifs_inode_symlink.h" #include "core/file_sys/quasifs/quasifs_partition.h" @@ -16,8 +16,8 @@ Partition::Partition() : Partition("", 0755, 512, 4096) {} Partition::Partition(const fs::path& host_root, const int root_permissions, const u32 blocks_per_io, const u32 ioblock_size) - : block_id(next_block_id++), host_root(host_root.lexically_normal()), - block_size(block_size), ioblock_size(ioblock_size) { + : block_id(next_block_id++), host_root(host_root.lexically_normal()), block_size(block_size), + ioblock_size(ioblock_size) { this->root = Directory::Create(); // clear defaults, write chmod(this->root, root_permissions); diff --git a/src/core/file_sys/quasifs/src/quasifs_vdriver.cpp b/src/core/file_sys/quasifs/src/quasifs_vdriver.cpp index bcddd7447..89dff086a 100644 --- a/src/core/file_sys/quasifs/src/quasifs_vdriver.cpp +++ b/src/core/file_sys/quasifs/src/quasifs_vdriver.cpp @@ -7,8 +7,8 @@ #include "../quasi_types.h" #include "core/file_sys/quasifs/quasifs.h" -#include "core/file_sys/quasifs/quasifs_inode_directory.h" -#include "core/file_sys/quasifs/quasifs_inode_regularfile.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_directory.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_file.h" #include "core/file_sys/quasifs/quasifs_inode_symlink.h" #include "core/file_sys/quasifs/quasifs_partition.h" @@ -36,12 +36,13 @@ int QFS::OperationImpl::Open(const fs::path& path, int flags, u16 mode) { bool request_append = flags & QUASI_O_APPEND; // - // Prioritize QFS permissions - // Host is (usually) more lenient + // Orbis-specific checks + // Universal checks are embedded into QFS + // Some of those are universal, but order matters (a lot) // - if ((request_write || request_append) && qfs.IsPartitionRO(part)) - return -QUASI_EROFS; + if ((flags & (QUASI_O_WRONLY | QUASI_O_RDWR)) == (QUASI_O_WRONLY | QUASI_O_RDWR)) + return -QUASI_EINVAL; // if it doesn't exist, check the parent inode_ptr checked_node = nullptr == res.node ? parent_node : res.node; @@ -49,8 +50,11 @@ int QFS::OperationImpl::Open(const fs::path& path, int flags, u16 mode) { if ((request_read && !checked_node->CanRead()) || (request_write && !checked_node->CanWrite())) return -QUASI_EACCES; - if ((flags & (QUASI_O_WRONLY | QUASI_O_RDWR)) == (QUASI_O_WRONLY | QUASI_O_RDWR)) - return -QUASI_EINVAL; + if ((request_write || request_append) && qfs.IsPartitionRO(part)) + return -QUASI_EROFS; + + if (flags & QUASI_O_DIRECTORY && flags & QUASI_O_CREAT) + return -QUASI_ENOTDIR; // // Proceed @@ -706,9 +710,12 @@ int QFS::OperationImpl::Stat(const fs::path& path, Libraries::Kernel::OrbisKerne vio_stat.st_size = hio_stat.st_size; vio_stat.st_blksize = hio_stat.st_blksize; vio_stat.st_blocks = hio_stat.st_blocks; - vio_stat.st_atim = hio_stat.st_atim; - vio_stat.st_mtim = hio_stat.st_mtim; - vio_stat.st_ctim = hio_stat.st_ctim; + vio_stat.st_atim.tv_sec = hio_stat.st_atim.tv_sec; + vio_stat.st_atim.tv_nsec = hio_stat.st_atim.tv_nsec; + vio_stat.st_mtim.tv_sec = hio_stat.st_mtim.tv_sec; + vio_stat.st_mtim.tv_nsec = hio_stat.st_mtim.tv_nsec; + vio_stat.st_ctim.tv_sec = hio_stat.st_ctim.tv_sec; + vio_stat.st_ctim.tv_nsec = hio_stat.st_ctim.tv_nsec; } memcpy(statbuf, &vio_stat, sizeof(Libraries::Kernel::OrbisKernelStat)); @@ -746,9 +753,12 @@ int QFS::OperationImpl::FStat(const s32 fd, Libraries::Kernel::OrbisKernelStat* vio_stat.st_size = hio_stat.st_size; vio_stat.st_blksize = hio_stat.st_blksize; vio_stat.st_blocks = hio_stat.st_blocks; - vio_stat.st_atim = hio_stat.st_atim; - vio_stat.st_mtim = hio_stat.st_mtim; - vio_stat.st_ctim = hio_stat.st_ctim; + vio_stat.st_atim.tv_sec = hio_stat.st_atim.tv_sec; + vio_stat.st_atim.tv_nsec = hio_stat.st_atim.tv_nsec; + vio_stat.st_mtim.tv_sec = hio_stat.st_mtim.tv_sec; + vio_stat.st_mtim.tv_nsec = hio_stat.st_mtim.tv_nsec; + vio_stat.st_ctim.tv_sec = hio_stat.st_ctim.tv_sec; + vio_stat.st_ctim.tv_nsec = hio_stat.st_ctim.tv_nsec; } memcpy(statbuf, &vio_stat, sizeof(Libraries::Kernel::OrbisKernelStat)); diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index 47f781d7b..42fd73a52 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -1064,6 +1064,7 @@ void RegisterFileSystem(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("mqQMh1zPPT8", "libScePosix", 1, "libkernel", posix_fstat); LIB_FUNCTION("mqQMh1zPPT8", "libkernel", 1, "libkernel", posix_fstat); LIB_FUNCTION("kBwCPsYX-m4", "libkernel", 1, "libkernel", sceKernelFstat); + LIB_FUNCTION("ih4CD9-gghM", "libScePosix", 1, "libkernel", posix_ftruncate); LIB_FUNCTION("ih4CD9-gghM", "libkernel", 1, "libkernel", posix_ftruncate); LIB_FUNCTION("VW3TVZiM4-E", "libkernel", 1, "libkernel", sceKernelFtruncate); LIB_FUNCTION("WlyEA-sLDf0", "libkernel", 1, "libkernel", sceKernelTruncate); diff --git a/src/emulator.cpp b/src/emulator.cpp index 0f847108d..4576890e6 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -45,7 +45,7 @@ #include "core/file_sys/quasifs/quasi_sys_fcntl.h" #include "core/file_sys/quasifs/quasifs.h" -#include "core/file_sys/quasifs/quasifs_inode_device.h" +#include "core/file_sys/quasifs/quasifs_inode_quasi_device.h" #include "core/file_sys/quasifs/quasifs_partition.h" #include "core/file_sys/devices/console_device.h" @@ -323,8 +323,6 @@ void Emulator::Run(std::filesystem::path file, const std::vector ar } } - // Create stdin/stdout/stderr - Common::Singleton::Instance()->CreateStdHandles(); this->LoadFilesystem(game_folder, id); // Initialize components