21#include "pedigree/kernel/LockGuard.h"
22#include "pedigree/kernel/process/Thread.h"
23#include "pedigree/kernel/processor/Processor.h"
24#include "pedigree/kernel/processor/ProcessorInformation.h"
26#include "modules/Module.h"
37 char a =
'a' + (i % 10);
41 char master[] = {
'p',
't',
'y', c, a, 0};
42 char slave[] = {
't',
't',
'y', c, a, 0};
44 String masterName(master), slaveName(slave);
49 pMaster->setOther(pSlave);
50 pSlave->setOther(pMaster);
59ConsoleManager::ConsoleManager() : m_Consoles(), m_Lock() {
61 for (
size_t i = 0; i < 16; ++i) {
62 for (
char c =
'p'; c <=
'z'; ++c) {
65 for (
char c =
'a'; c <=
'e'; ++c) {
71ConsoleManager::~ConsoleManager() {
72 for (
auto it : m_Consoles) {
81File* ConsoleManager::getConsole(
String consoleName) {
83 for (
size_t i = 0; i < m_Consoles.
count(); i++) {
85 if (pC->m_ConsoleName == consoleName) {
103 if (!pConsole->isMaster())
118 if (!isConsole(file))
122 if (!pConsole->isMaster())
128 if (pConsole->
pLocker != pProcess)
135 if (!isConsole(file) || !isMasterConsole(file) || !
static_cast<ConsoleFile*
>(file)->isPtyMaster())
145 if (!isConsole(file) || !
static_cast<ConsoleFile*
>(file)->isPtySlave())
149 if (!other || !other->isMaster())
154bool ConsoleManager::isConsole(
File* file) {
157 return (file->getInode() == 0xdeadbeef);
160bool ConsoleManager::isMasterConsole(
File* file) {
161 if (!isConsole(file))
165 return pFile->isMaster();
168void ConsoleManager::setAttributes(
File* file,
size_t flags) {
173 pFile->m_Flags = flags;
176void ConsoleManager::getAttributes(
File* file,
size_t* flags) {
180 *flags = pFile->m_Flags;
183void ConsoleManager::setControlChars(
File* file,
void* p) {
187 MemoryCopy(pFile->m_ControlChars, p, MAX_CONTROL_CHAR);
190void ConsoleManager::getControlChars(
File* file,
void* p) {
194 MemoryCopy(p, pFile->m_ControlChars, MAX_CONTROL_CHAR);
197int ConsoleManager::getWindowSize(
File* file,
unsigned short* rows,
unsigned short* cols) {
201 if (!pFile->isMaster()) {
207 *rows = pFile->m_Rows;
208 *cols = pFile->m_Cols;
212int ConsoleManager::setWindowSize(
File* file,
unsigned short rows,
unsigned short cols) {
216 if ((!pFile->isMaster()) && pFile->
m_pOther) {
220 pFile->m_Rows = rows;
221 pFile->m_Cols = cols;
225bool ConsoleManager::hasDataAvailable(
File* file) {
229 return pFile->
select(
false, 0);
232void ConsoleManager::flush(
File* file) {}
234File* ConsoleManager::getOther(
File* file) {
244static bool initConsole() {
248static void destroyConsole() {}
250MODULE_INFO(
"console", &initConsole, &destroyConsole,
"vfs");
ConsoleFile * m_pOther
Other side of the console.
virtual int select(bool bWriting, int timeout)
select - check and optionally for a particular state.
bool lockConsole(File *file)
bool setPtyLock(File *file, bool locked)
Set the UNIX 98 PTY slave lock associated with a master.
void unlockConsole(File *file)
Release a console master locked as above.
bool isPtySlaveLocked(File *file)
Returns whether a PTY slave is currently locked.
void newConsole(char c, size_t i)
bool bLocked
Is this master locked (ie, already opened)?
bool bSlaveLocked
Whether the corresponding UNIX 98 slave rejects new opens.
static ProcessorInformation & information()
void pushBack(const T &value)