rpcsx/rpcsx-os/iodev/stderr.cpp

52 lines
1.4 KiB
C++
Raw Normal View History

2023-06-23 02:28:14 +02:00
#include "io-device.hpp"
2023-07-04 18:19:17 +02:00
#include "orbis/KernelAllocator.hpp"
2023-06-23 02:28:14 +02:00
#include <fstream>
struct StderrInstance : public IoDeviceInstance {};
struct StderrDevice : public IoDevice {
StderrInstance *instance = nullptr;
};
2023-07-06 18:16:25 +02:00
static std::int64_t stderr_instance_write(IoDeviceInstance *instance,
const void *data,
std::uint64_t size) {
2023-06-23 02:28:14 +02:00
auto result = fwrite(data, 1, size, stderr);
fflush(stderr);
return result;
}
static std::int64_t stderr_instance_close(IoDeviceInstance *instance) {
instance->device->decRef();
return 0;
}
static std::int32_t stderr_device_open(IoDevice *device,
orbis::Ref<IoDeviceInstance> *instance,
const char *path, std::uint32_t flags,
std::uint32_t mode) {
auto stderrDevice = static_cast<StderrDevice *>(device);
if (stderrDevice->instance == nullptr) {
2023-07-04 18:19:17 +02:00
auto *newInstance = orbis::knew<StderrInstance>();
2023-06-23 02:28:14 +02:00
newInstance->write = stderr_instance_write;
newInstance->close = stderr_instance_close;
io_device_instance_init(device, newInstance);
*instance = newInstance;
} else {
device->incRef();
*instance = stderrDevice->instance;
}
return 0;
}
IoDevice *createStderrCharacterDevice() {
2023-07-04 18:19:17 +02:00
auto *newDevice = orbis::knew<StderrDevice>();
2023-06-23 02:28:14 +02:00
newDevice->open = stderr_device_open;
return newDevice;
}