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];
103 virtual bool isMaster() = 0;
106 return !isMaster() && getParent() !=
nullptr;
110 return isMaster() && m_pOther !=
nullptr && m_pOther->getParent() !=
nullptr;
117 ReadyMask queryReady(
bool reading,
bool writing)
override;
126 MemoryCopy(out, m_ControlChars, MAX_CONTROL_CHAR);
130 return PTY_BUFFER_SIZE;
133 size_t getConsoleNumber()
const {
134 return m_ConsoleNumber;
137 virtual size_t getPhysicalConsoleNumber()
const {
143 virtual int select(
bool bWriting,
int timeout);
145 virtual uint64_t readIo(
ConsoleIoState& state, uint64_t size, uintptr_t buffer,
147 virtual uint64_t writeIo(
ConsoleIoState& state, uint64_t size, uintptr_t buffer,
156 char m_ControlChars[MAX_CONTROL_CHAR];
158 unsigned short m_Rows;
159 unsigned short m_Cols;
162 static size_t outputLineDiscipline(
char* buf,
size_t len,
size_t maxSz,
size_t flags = 0);
165 size_t processInput(
char* buf,
size_t len);
168 size_t inputLineDiscipline(
ConsoleIoState& state,
char* buf,
size_t len,
bool canBlock,
169 size_t flags = ~0U,
const char* controlChars =
nullptr);
171 mutable Mutex m_IoLock;
178 size_t m_ConsoleNumber;
181 bool isControlCharacter(
size_t flags,
char check,
const char* controlChars);
182 void notifyControlCharacter(
char cause,
const char* controlChars);
194 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
195 bool bCanBlock =
true);
196 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
197 bool bCanBlock =
true);
201 m_Flags = pOther->m_Flags;
214 virtual bool isMaster() {
219 uint64_t readIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
220 uint64_t writeIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
229 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
230 bool bCanBlock =
true);
231 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
232 bool bCanBlock =
true);
238 virtual bool isMaster() {
243 uint64_t readIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
244 uint64_t writeIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
252 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
253 bool bCanBlock =
true);
254 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
255 bool bCanBlock =
true);
257 virtual bool isMaster() {
261 virtual size_t getPhysicalConsoleNumber()
const {
262 return m_TerminalNumber;
265 virtual int select(
bool bWriting,
int timeout);
275 void terminalReadinessChanged(ReadyMask mask);
279 size_t m_TerminalNumber;
283 uint64_t readIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
284 uint64_t writeIo(
ConsoleIoState&, uint64_t, uintptr_t,
bool)
override;
300 enum IAttribute { IMapCRToNL = 1, IIgnoreCR = 2, IMapNLToCR = 4, IStripToSevenBits = 8 };
314 LGenerateEvent = 16384
331 bool lockConsole(
File* file);
334 void unlockConsole(
File* file);
337 bool setPtyLock(
File* file,
bool locked);
340 bool isPtySlaveLocked(
File* file);
344 void newConsole(
char c,
size_t i);
346 bool isConsole(
File* file);
347 bool isMasterConsole(
File* file);
349 void setAttributes(
File* file,
size_t flags);
350 void getAttributes(
File* file,
size_t* flags);
351 void getControlChars(
File* file,
void* p);
352 void setControlChars(
File* file,
void* p);
353 int getWindowSize(
File* file,
unsigned short* rows,
unsigned short* cols);
354 int setWindowSize(
File* file,
unsigned short rows,
unsigned short cols);
355 bool hasDataAvailable(
File* file);
356 void flush(
File* file);
371 static String volumeLabel(
"consolemanager");
394 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.