diff --git a/src/kernel/fileSystem.cpp b/src/kernel/fileSystem.cpp index b84e20ec8..1f74e6cd7 100644 --- a/src/kernel/fileSystem.cpp +++ b/src/kernel/fileSystem.cpp @@ -1138,19 +1138,11 @@ int KYTY_SYSV_ABI KernelFstat(int d, FileStat* sb) { auto wt = at; if (file->special != SpecialFile::None) { + stat.st_mode = 0020644u; stat.st_size = 0; stat.st_blksize = 512; stat.st_blocks = 0; - SecToTimespec(&stat.st_atim, at.ToUnix()); - SecToTimespec(&stat.st_mtim, wt.ToUnix()); - stat.st_ctim = stat.st_atim; - stat.st_birthtim = stat.st_mtim; - *sb = stat; - - return OK; - } - - if (!file->directory) { + } else if (!file->directory) { file->mutex.Lock(); bool is_invalid = file->f.IsInvalid(); diff --git a/tests/KernelFileSystemTests.cpp b/tests/KernelFileSystemTests.cpp index 193483def..d676e4e23 100644 --- a/tests/KernelFileSystemTests.cpp +++ b/tests/KernelFileSystemTests.cpp @@ -121,6 +121,20 @@ void CheckSaveRename(const std::filesystem::path &root, "renamed save contents"); } +void TestRandomDevices() { + for (const auto* path : {"/dev/urandom", "/dev/random"}) { + const int fd = FileSystem::KernelOpen(path, 0, 0); + FileSystem::FileStat stat {}; + Check(fd >= 3 && FileSystem::KernelFstat(fd, &stat) == OK && + (stat.st_mode & 0170000) == 0020000, + "entropy sources are character devices"); + std::array entropy {}; + Check(FileSystem::KernelRead(fd, entropy.data(), entropy.size()) == entropy.size(), + "character device supplies requested entropy"); + Check(FileSystem::KernelClose(fd) == OK, "close entropy source"); + } +} + void TestSaveOpenVisibility() { constexpr char Path[] = "/savedata0/visible-save.dat"; constexpr char Payload[] = "saved progress"; @@ -1398,6 +1412,7 @@ int main(int, char**) { TempDirectory temporary; FileSystem::Initialize(); + TestRandomDevices(); CheckMountRoot(temporary.Path()); CheckUnmappedPaths(temporary.Path()); CheckArchiveMount(temporary.Path());