Luna/kernel/src/fs/devices/SlavePTY.h

70 lines
1.3 KiB
C++

#pragma once
#include "fs/VFS.h"
#include <luna/Buffer.h>
#include <luna/String.h>
class MasterPTY;
class SlavePTY : public VFS::DeviceInode
{
public:
SlavePTY() = default;
VFS::InodeType type() const override
{
return VFS::InodeType::CharacterDevice;
}
Result<u64> query_shared_memory(off_t, usize) override
{
return err(ENOTSUP);
}
VFS::FileSystem* fs() const override
{
return nullptr;
}
Result<usize> read(u8* buf, usize offset, usize length) const override;
Result<usize> write(const u8* buf, usize offset, usize length) override;
Result<u64> ioctl(int request, void* arg) override;
Result<u64> isatty() const override
{
return 1;
}
Result<void> truncate(usize) override
{
// POSIX says truncate is for regular files, but doesn't tell us what error to return for non-regular files.
return err(EINVAL);
}
bool will_block_if_read() const override
{
return m_buffer.is_empty();
}
void did_link() override
{
m_metadata.nlinks++;
}
void did_unlink() override
{
m_metadata.nlinks--;
}
virtual ~SlavePTY() = default;
private:
mutable Buffer m_buffer;
MasterPTY* m_master;
String m_name;
friend class MasterPTY;
};