#include "prx/libkernel/include/Api.hpp" #include "prx/libkernel/File/include/File.hpp" #include "prx/libc/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include static void Require(bool value) { if (!value) std::abort(); } constexpr int GuestEperm = 1; constexpr int GuestEbadf = 9; constexpr int SceKernelErrorEperm = static_cast(0x80020001); constexpr int SceKernelErrorEbadf = static_cast(0x80020009); static bool Open(int fd) { const int duplicate = dup_nid_postfix(fd); if (duplicate < 0) return false; Require(close_nid_postfix(duplicate) == 0); return true; } int main() { bool open[3]; for (int fd = 0; fd < 3; ++fd) open[fd] = Open(fd); for (int fd = 0; fd < 3; ++fd) { if (!open[fd]) continue; Require(close_nid_postfix(fd) == -1 && *__error_nid_postfix() == GuestEperm); Require(sceKernelClose(fd) == SceKernelErrorEperm); Require(Open(fd)); } int pipe[2]; Require(pipe_nid_postfix(pipe) == 0); for (const int fd : pipe) Require(fd >= 3 || !open[fd]); Require(close_nid_postfix(pipe[0]) == 0 && close_nid_postfix(pipe[1]) == 0); Require(close_nid_postfix(pipe[0]) == -1 && *__error_nid_postfix() == GuestEbadf); Require(sceKernelClose(pipe[1]) == SceKernelErrorEbadf); Require(close_nid_postfix(-1) == -1 && *__error_nid_postfix() == GuestEbadf); Require(sceKernelClose(-1) == SceKernelErrorEbadf); return 0; }