23#include "pedigree/kernel/Spinlock.h"
24#include "pedigree/kernel/compiler.h"
25#include "pedigree/kernel/process/ConditionVariable.h"
26#include "pedigree/kernel/process/Mutex.h"
27#include "pedigree/kernel/process/OperationBarrier.h"
28#include "pedigree/kernel/process/Semaphore.h"
29#include "pedigree/kernel/processor/types.h"
30#include "pedigree/kernel/utilities/Buffer.h"
31#include "pedigree/kernel/utilities/SharedPointer.h"
32#include "pedigree/kernel/utilities/String.h"
33#include "pedigree/kernel/utilities/Vector.h"
34#include "pedigree/kernel/utilities/utility.h"
36#include "ConsoleDefines.h"
37#include "modules/system/vfs/File.h"
38#include "modules/system/vfs/Filesystem.h"
44#define DEFAULT_FLAGS \
45 (static_cast<size_t>(ConsoleManager::OPostProcess) | \
46 static_cast<size_t>(ConsoleManager::IMapCRToNL) | \
47 static_cast<size_t>(ConsoleManager::OMapNLToCRNL) | \
48 static_cast<size_t>(ConsoleManager::LEcho) | static_cast<size_t>(ConsoleManager::LEchoErase) | \
49 static_cast<size_t>(ConsoleManager::LEchoKill) | \
50 static_cast<size_t>(ConsoleManager::LCookedMode) | \
51 static_cast<size_t>(ConsoleManager::LGenerateEvent))
55 enum class Character { Interrupt, Quit, Suspend };
57 virtual void controlCharacter(Character) {}
65 void closeAdmission();
66 void cancelAndDrain();
71 char line[LINEBUFFER_MAXIMUM];
104 virtual bool isMaster() = 0;
105 bool isCharacterDevice()
const override {
108 bool isConsole()
const override {
113 return !isMaster() && getParent() !=
nullptr;
117 return isMaster() && m_pOther !=
nullptr && m_pOther->getParent() !=
nullptr;
124 ReadyMask queryReady(
bool reading,
bool writing)
override;
133 MemoryCopy(out, m_ControlChars, MAX_CONTROL_CHAR);
137 return PTY_BUFFER_SIZE;
140 size_t getConsoleNumber()
const {
141 return m_ConsoleNumber;
144 virtual size_t getPhysicalConsoleNumber()
const {
150 virtual int select(
bool bWriting,
int timeout);
152 virtual uint64_t readIo(
ConsoleIoState& state, uint64_t size, uintptr_t buffer,
154 virtual uint64_t writeIo(
ConsoleIoState& state, uint64_t size, uintptr_t buffer,
163 char m_ControlChars[MAX_CONTROL_CHAR];
165 unsigned short m_Rows;
166 unsigned short m_Cols;
169 static size_t outputLineDiscipline(
char* buf,
size_t len,
size_t maxSz,
size_t flags = 0);
172 size_t processInput(
char* buf,
size_t len);
175 size_t inputLineDiscipline(
ConsoleIoState& state,
char* buf,
size_t len,
bool canBlock,
176 size_t flags = ~0U,
const char* controlChars =
nullptr);
178 mutable Mutex m_IoLock;
185 size_t m_ConsoleNumber;
188 bool isControlCharacter(
size_t flags,
char check,
const char* controlChars);
189 void notifyControlCharacter(
char cause,
const char* controlChars);
201 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
202 bool bCanBlock =
true);
203 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
204 bool bCanBlock =
true);
208 m_Flags = pOther->m_Flags;
221 virtual bool isMaster() {
226 uint64_t readIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
227 uint64_t writeIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
236 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
237 bool bCanBlock =
true);
238 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
239 bool bCanBlock =
true);
245 virtual bool isMaster() {
250 uint64_t readIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
251 uint64_t writeIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
259 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
260 bool bCanBlock =
true);
261 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
262 bool bCanBlock =
true);
264 virtual bool isMaster() {
268 virtual size_t getPhysicalConsoleNumber()
const {
269 return m_TerminalNumber;
272 virtual int select(
bool bWriting,
int timeout);
282 void terminalReadinessChanged(ReadyMask mask);
287 size_t m_TerminalNumber;
292 uint64_t readIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
293 uint64_t writeIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
309 enum IAttribute { IMapCRToNL = 1, IIgnoreCR = 2, IMapNLToCR = 4, IStripToSevenBits = 8 };
323 LGenerateEvent = 16384
340 bool lockConsole(
File* file);
343 void unlockConsole(
File* file);
346 bool setPtyLock(
File* file,
bool locked);
349 bool isPtySlaveLocked(
File* file);
353 void newConsole(
char c,
size_t i);
355 bool isConsole(
File* file);
356 bool isMasterConsole(
File* file);
358 void setAttributes(
File* file,
size_t flags);
359 void getAttributes(
File* file,
size_t* flags);
360 void getControlChars(
File* file,
void* p);
361 void setControlChars(
File* file,
void* p);
362 int getWindowSize(
File* file,
unsigned short* rows,
unsigned short* cols);
363 int setWindowSize(
File* file,
unsigned short rows,
unsigned short cols);
364 bool hasDataAvailable(
File* file);
365 void flush(
File* file);
380 static String volumeLabel(
"consolemanager");
403 void newConsole(
char c,
size_t i,
bool lock);
ConsoleFile * m_pOther
Other side of the console.
bool supportsReadinessNotifications() const override
void getControlCharacters(char *out)
Grabs the current array of control characters.
virtual bool isSeekable() const
virtual size_t getBlockSize() const
virtual bool isBytewise() const
virtual bool removeNode(File *, const String &, File *)
virtual const String & getVolumeLabel() const
virtual bool createFile(File *parent, const String &filename, uint32_t mask)
virtual File * getRoot() const
virtual bool initialise(Disk *pDisk)
virtual bool createSymlink(File *parent, const String &filename, const String &value)
virtual bool createDirectory(File *parent, const String &filename, uint32_t mask)
bool bLocked
Is this master locked (ie, already opened)?
bool bSlaveLocked
Whether the corresponding UNIX 98 slave rejects new opens.
ReadyMask queryReady(bool reading, bool writing) override
bool supportsReadinessNotifications() const override
virtual ReadyMask queryReady(bool reading, bool writing)
A vector / dynamic array.