mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2026-04-26 12:55:14 -06:00
added /dev/null properly
fixed opening r mode fixed some test cases
This commit is contained in:
parent
c16ba68422
commit
b105adeb9e
@ -777,6 +777,8 @@ set(CORE src/core/aerolib/stubs.cpp
|
||||
src/core/file_sys/devices/logger.cpp
|
||||
src/core/file_sys/devices/logger.h
|
||||
src/core/file_sys/devices/nop_device.h
|
||||
src/core/file_sys/devices/null_device.cpp
|
||||
src/core/file_sys/devices/null_device.h
|
||||
src/core/file_sys/devices/random_device.cpp
|
||||
src/core/file_sys/devices/random_device.h
|
||||
src/core/file_sys/devices/srandom_device.cpp
|
||||
|
||||
29
src/core/file_sys/devices/null_device.cpp
Normal file
29
src/core/file_sys/devices/null_device.cpp
Normal file
@ -0,0 +1,29 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "null_device.h"
|
||||
|
||||
namespace Core::Devices {
|
||||
|
||||
NullDevice::NullDevice() = default;
|
||||
NullDevice::~NullDevice() = default;
|
||||
|
||||
s64 NullDevice::read(void* buf, u64 count) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
s64 NullDevice::write(const void* buf, u64 count) {
|
||||
return count;
|
||||
}
|
||||
|
||||
s64 NullDevice::pread(void* buf, size_t count, u64 offset) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
s64 NullDevice::pwrite(const void* buf, size_t count, u64 offset) {
|
||||
return count;
|
||||
}
|
||||
|
||||
} // namespace Core::Devices
|
||||
37
src/core/file_sys/devices/null_device.h
Normal file
37
src/core/file_sys/devices/null_device.h
Normal file
@ -0,0 +1,37 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "core/file_sys/quasifs/quasifs_inode_device.h"
|
||||
|
||||
namespace Core::Devices {
|
||||
|
||||
class NullDevice final : public QuasiFS::Device {
|
||||
|
||||
public:
|
||||
NullDevice();
|
||||
~NullDevice();
|
||||
|
||||
s64 read(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;
|
||||
|
||||
// clang-format off
|
||||
s32 ioctl(u64 cmd, Common::VaCtx* args) override { DEVICE_STUB(); }
|
||||
s64 readv(const Libraries::Kernel::OrbisKernelIovec* iov, int iovcnt) override { DEVICE_STUB(); }
|
||||
s64 writev(const Libraries::Kernel::OrbisKernelIovec* iov, int iovcnt) override { DEVICE_STUB(); }
|
||||
s64 preadv(const Libraries::Kernel::OrbisKernelIovec* iov, int iovcnt, u64 offset) override { DEVICE_STUB(); }
|
||||
s64 pwritev(const Libraries::Kernel::OrbisKernelIovec* iov, int iovcnt, u64 offset) override { DEVICE_STUB(); }
|
||||
s64 lseek(s64 offset, int whence) override { DEVICE_STUB(); }
|
||||
s32 fstat(Libraries::Kernel::OrbisKernelStat* sb) override { DEVICE_STUB(); }
|
||||
s32 fsync() override { DEVICE_STUB(); }
|
||||
s32 ftruncate(s64 length) override { DEVICE_STUB(); }
|
||||
s32 getdents(void* buf, u32 nbytes, s64* basep) override { DEVICE_STUB(); }
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
} // namespace Core::Devices
|
||||
@ -22,4 +22,20 @@ s64 RandomDevice::read(void* buf, u64 count) {
|
||||
return count;
|
||||
}
|
||||
|
||||
s64 RandomDevice::write(const void* buf, u64 count) {
|
||||
return count;
|
||||
}
|
||||
|
||||
s64 RandomDevice::pread(void* buf, u64 count, u64 offset) {
|
||||
auto rbuf = static_cast<char*>(buf);
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
rbuf[i] = std::rand() & 0xFF;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
s64 RandomDevice::pwrite(const void* buf, u64 count, u64 offset) {
|
||||
return count;
|
||||
}
|
||||
|
||||
} // namespace Core::Devices
|
||||
@ -15,12 +15,12 @@ public:
|
||||
~RandomDevice();
|
||||
|
||||
s64 read(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 ;
|
||||
|
||||
// clang-format off
|
||||
s64 write(const void* buf, u64 count) override { DEVICE_STUB(); }
|
||||
s32 ioctl(u64 cmd, Common::VaCtx* args) override { DEVICE_STUB(); }
|
||||
s64 pread(void* buf, size_t count, u64 offset) override { DEVICE_STUB(); }
|
||||
s64 pwrite(const void* buf, size_t count, u64 offset) override { DEVICE_STUB(); }
|
||||
s64 readv(const Libraries::Kernel::OrbisKernelIovec* iov, int iovcnt) override { DEVICE_STUB(); }
|
||||
s64 writev(const Libraries::Kernel::OrbisKernelIovec* iov, int iovcnt) override { DEVICE_STUB(); }
|
||||
s64 preadv(const Libraries::Kernel::OrbisKernelIovec* iov, int iovcnt, u64 offset) override { DEVICE_STUB(); }
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
#define DEVICE_STUB() \
|
||||
{ \
|
||||
LOG_ERROR(Kernel_Fs, "(STUBBED) called"); \
|
||||
return 0; \
|
||||
return -QUASI_ENOSYS; \
|
||||
}
|
||||
|
||||
namespace QuasiFS {
|
||||
|
||||
@ -31,7 +31,7 @@ int QFS::OperationImpl::Open(const fs::path& path, int flags, u16 mode) {
|
||||
partition_ptr part = res.mountpoint;
|
||||
dir_ptr parent_node = std::static_pointer_cast<Directory>(res.parent);
|
||||
|
||||
bool request_read = (flags & (QUASI_O_WRONLY | QUASI_O_RDWR)) == 0;
|
||||
bool request_read = !(flags & QUASI_O_WRONLY) || (flags & QUASI_O_RDWR);
|
||||
bool request_write = (flags & (QUASI_O_WRONLY | QUASI_O_RDWR)) != 0;
|
||||
bool request_append = flags & QUASI_O_APPEND;
|
||||
|
||||
@ -556,8 +556,7 @@ s64 QFS::OperationImpl::Read(const s32 fd, void* buf, u64 count) {
|
||||
if (host_used && (hio_status != vio_status))
|
||||
LogError("Host returned {}, but virtual driver returned {}", hio_status, vio_status);
|
||||
|
||||
return hio_status;
|
||||
// return vio_status;
|
||||
return vio_status;
|
||||
}
|
||||
|
||||
s64 QFS::OperationImpl::PRead(const s32 fd, void* buf, u64 count, u64 offset) {
|
||||
|
||||
@ -55,6 +55,7 @@
|
||||
#include "core/file_sys/devices/random_device.h"
|
||||
#include "core/file_sys/devices/srandom_device.h"
|
||||
#include "core/file_sys/devices/zero_device.h"
|
||||
#include "core/file_sys/devices/null_device.h"
|
||||
|
||||
Frontend::WindowSDL* g_window = nullptr;
|
||||
|
||||
@ -104,7 +105,7 @@ void Emulator::LoadFilesystem(const std::filesystem::path& game_folder, const st
|
||||
|
||||
qfs->Operation.MKDir("/app0", 0555);
|
||||
qfs->Operation.MKDir("/data", 0777);
|
||||
qfs->Operation.MKDir("/dev", 0755);
|
||||
qfs->Operation.MKDir("/dev", 0555);
|
||||
qfs->Operation.MKDir("/download0", 0777); // not sure about perms here
|
||||
qfs->Operation.MKDir("/hostapp", 0777);
|
||||
qfs->Operation.MKDir("/temp", 0777);
|
||||
@ -125,10 +126,11 @@ void Emulator::LoadFilesystem(const std::filesystem::path& game_folder, const st
|
||||
//
|
||||
|
||||
qfs->Operation.MKDir("/dev/fd");
|
||||
qfs->ForceInsert("/dev/fd", "0", QuasiFS::Device::Create<Devices::NopDevice>());
|
||||
qfs->ForceInsert("/dev/fd", "0", QuasiFS::Device::Create<Devices::ZeroDevice>());
|
||||
qfs->ForceInsert("/dev/fd", "1", QuasiFS::Device::Create<Devices::Logger>("stdout", false));
|
||||
// qfs->ForceInsert("/dev/fd", "1", std::make_shared<Devices::Logger>("stdout", false));
|
||||
qfs->ForceInsert("/dev/fd", "2", QuasiFS::Device::Create<Devices::Logger>("stderr", true));
|
||||
// stdin is unavailable from within the app???
|
||||
qfs->Operation.LinkSymbolic("/dev/fd/0", "/dev/stdin");
|
||||
qfs->Operation.LinkSymbolic("/dev/fd/1", "/dev/stdout");
|
||||
qfs->Operation.LinkSymbolic("/dev/fd/2", "/dev/stderr");
|
||||
@ -142,7 +144,13 @@ void Emulator::LoadFilesystem(const std::filesystem::path& game_folder, const st
|
||||
qfs->ForceInsert("/dev", "urandom", QuasiFS::Device::Create<Devices::RandomDevice>());
|
||||
qfs->ForceInsert("/dev", "srandom", QuasiFS::Device::Create<Devices::SRandomDevice>());
|
||||
qfs->ForceInsert("/dev", "zero", QuasiFS::Device::Create<Devices::ZeroDevice>());
|
||||
qfs->ForceInsert("/dev", "null", QuasiFS::Device::Create<Devices::NopDevice>());
|
||||
qfs->ForceInsert("/dev", "null", QuasiFS::Device::Create<Devices::NullDevice>());
|
||||
|
||||
qfs->Operation.Chmod("/dev/deci_stderr",0666);
|
||||
qfs->Operation.Chmod("/dev/deci_stdout",0666);
|
||||
qfs->Operation.Chmod("/dev/random",0666);
|
||||
qfs->Operation.Chmod("/dev/urandom",0666);
|
||||
qfs->Operation.Chmod("/dev/srandom",0666);
|
||||
|
||||
if (int fd_dev = qfs->Operation.Open("/dev/stdin", QUASI_O_RDONLY); fd_dev != 0)
|
||||
LOG_CRITICAL(Kernel_Fs, "XDXDXD 0");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user