20#include "pedigree/kernel/processor/types.h"
21#include "pedigree/kernel/utilities/Buffer.h"
22#include "pedigree/kernel/utilities/String.h"
28ConsoleMasterFile::ConsoleMasterFile(
size_t consoleNumber,
String consoleName,
Filesystem* pFs)
32 bSlaveLocked(false) {}
34uint64_t ConsoleMasterFile::readIo(
ConsoleIoState& state, uint64_t size, uintptr_t buffer,
37 size_t slaveFlags =
m_pOther->m_Flags;
38 if (!(slaveFlags & ConsoleManager::OPostProcess) ||
39 !(slaveFlags & ConsoleManager::OMapNLToCRNL)) {
42 uint64_t nBytes = state.output.
read(
reinterpret_cast<char*
>(buffer), size, bCanBlock);
55 uint64_t totalBytes = 0;
56 while (totalBytes < size) {
61 const uint64_t readSize = size > 1 ? size / 2 : 1;
63 state.output.
read(
reinterpret_cast<char*
>(buffer + totalBytes), readSize, bCanBlock);
72 totalBytes += disciplineSize;
73 size -= disciplineSize;
90uint64_t ConsoleMasterFile::writeIo(
ConsoleIoState& state, uint64_t size, uintptr_t buffer,
92 if (!state.input.
canWrite(bCanBlock)) {
97 size_t amount =
inputLineDiscipline(state,
reinterpret_cast<char*
>(buffer), size, bCanBlock);
99 return state.revoked() ? 0 : amount;
103 return readEpoch(captureOpenEpoch(), size, buffer, canBlock);
108 return writeEpoch(captureOpenEpoch(), size, buffer, canBlock);
bool canWrite(bool block)
size_t read(T *buffer, size_t count, bool block=true)
ConsoleFile * m_pOther
Other side of the console.
static size_t outputLineDiscipline(char *buf, size_t len, size_t maxSz, size_t flags=0)
Output line discipline.
size_t inputLineDiscipline(ConsoleIoState &state, char *buf, size_t len, bool canBlock, size_t flags=~0U, const char *controlChars=nullptr)
Input line discipline.
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)