fAttached was never set in Shell::AttachBuffer(), and that caused

TermParse::StopThreads() in Shell::DetachBuffer() to be never called.
Moved initialization of termios struct to its own functions.
Added const to some methods.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34893 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini
2010-01-04 18:34:52 +00:00
parent 3e5498e4c9
commit 9f7a3e3406
2 changed files with 64 additions and 57 deletions
+62 -55
View File
@@ -170,7 +170,7 @@ Shell::TTYName() const
ssize_t
Shell::Read(void *buffer, size_t numBytes)
Shell::Read(void *buffer, size_t numBytes) const
{
if (fFd < 0)
return B_NO_INIT;
@@ -202,7 +202,7 @@ Shell::UpdateWindowSize(int rows, int columns)
status_t
Shell::GetAttr(struct termios &attr)
Shell::GetAttr(struct termios &attr) const
{
if (tcgetattr(fFd, &attr) < 0)
return errno;
@@ -232,6 +232,8 @@ Shell::AttachBuffer(TerminalBuffer *buffer)
if (fAttached)
return B_ERROR;
fAttached = true;
return fTermParse->StartThreads(buffer);
}
@@ -260,6 +262,60 @@ receive_handshake_message(handshake_t& handshake)
}
static void
initialize_termios(struct termios &tio)
{
/*
* Set Terminal interface.
*/
tio.c_line = 0;
tio.c_lflag |= ECHOE;
/* input: nl->nl, cr->nl */
tio.c_iflag &= ~(INLCR|IGNCR);
tio.c_iflag |= ICRNL;
tio.c_iflag &= ~ISTRIP;
/* output: cr->cr, nl in not retrun, no delays, ln->cr/ln */
tio.c_oflag &= ~(OCRNL|ONLRET|NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
tio.c_oflag |= ONLCR;
tio.c_oflag |= OPOST;
/* baud rate is 19200 (equal beterm) */
tio.c_cflag &= ~(CBAUD);
tio.c_cflag |= B19200;
tio.c_cflag &= ~CSIZE;
tio.c_cflag |= CS8;
tio.c_cflag |= CREAD;
tio.c_cflag |= HUPCL;
tio.c_iflag &= ~(IGNBRK|BRKINT);
/*
* enable signals, canonical processing (erase, kill, etc), echo.
*/
tio.c_lflag |= ISIG|ICANON|ECHO|ECHOE|ECHONL;
tio.c_lflag &= ~(ECHOK | IEXTEN);
/* set control characters. */
tio.c_cc[VINTR] = 'C' & 0x1f; /* '^C' */
tio.c_cc[VQUIT] = CQUIT; /* '^\' */
tio.c_cc[VERASE] = 0x7f; /* '^?' */
tio.c_cc[VKILL] = 'U' & 0x1f; /* '^U' */
tio.c_cc[VEOF] = CEOF; /* '^D' */
tio.c_cc[VEOL] = CEOL; /* '^@' */
tio.c_cc[VMIN] = 4;
tio.c_cc[VTIME] = 0;
tio.c_cc[VEOL2] = CEOL; /* '^@' */
tio.c_cc[VSWTCH] = CSWTCH; /* '^@' */
tio.c_cc[VSTART] = CSTART; /* '^S' */
tio.c_cc[VSTOP] = CSTOP; /* '^Q' */
tio.c_cc[VSUSP] = CSUSP; /* '^Z' */
}
status_t
Shell::_Spawn(int row, int col, const char *encoding, int argc, const char **argv)
{
@@ -379,55 +435,8 @@ Shell::_Spawn(int row, int col, const char *encoding, int argc, const char **arg
* TODO: so why are we doing it ?
*/
tcgetattr(slave, &tio);
/*
* Set Terminal interface.
*/
tio.c_line = 0;
tio.c_lflag |= ECHOE;
/* input: nl->nl, cr->nl */
tio.c_iflag &= ~(INLCR|IGNCR);
tio.c_iflag |= ICRNL;
tio.c_iflag &= ~ISTRIP;
/* output: cr->cr, nl in not retrun, no delays, ln->cr/ln */
tio.c_oflag &= ~(OCRNL|ONLRET|NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
tio.c_oflag |= ONLCR;
tio.c_oflag |= OPOST;
/* baud rate is 19200 (equal beterm) */
tio.c_cflag &= ~(CBAUD);
tio.c_cflag |= B19200;
tio.c_cflag &= ~CSIZE;
tio.c_cflag |= CS8;
tio.c_cflag |= CREAD;
tio.c_cflag |= HUPCL;
tio.c_iflag &= ~(IGNBRK|BRKINT);
/*
* enable signals, canonical processing (erase, kill, etc), echo.
*/
tio.c_lflag |= ISIG|ICANON|ECHO|ECHOE|ECHONL;
tio.c_lflag &= ~(ECHOK | IEXTEN);
/* set control characters. */
tio.c_cc[VINTR] = 'C' & 0x1f; /* '^C' */
tio.c_cc[VQUIT] = CQUIT; /* '^\' */
tio.c_cc[VERASE] = 0x7f; /* '^?' */
tio.c_cc[VKILL] = 'U' & 0x1f; /* '^U' */
tio.c_cc[VEOF] = CEOF; /* '^D' */
tio.c_cc[VEOL] = CEOL; /* '^@' */
tio.c_cc[VMIN] = 4;
tio.c_cc[VTIME] = 0;
tio.c_cc[VEOL2] = CEOL; /* '^@' */
tio.c_cc[VSWTCH] = CSWTCH; /* '^@' */
tio.c_cc[VSTART] = CSTART; /* '^S' */
tio.c_cc[VSTOP] = CSTOP; /* '^Q' */
tio.c_cc[VSUSP] = CSUSP; /* '^Z' */
initialize_termios(tio);
/*
* change control tty.
@@ -468,10 +477,7 @@ Shell::_Spawn(int row, int col, const char *encoding, int argc, const char **arg
exit(1);
}
struct winsize ws;
ws.ws_row = handshake.row;
ws.ws_col = handshake.col;
struct winsize ws = { handshake.row, handshake.col };
ioctl(0, TIOCSWINSZ, &ws);
@@ -498,6 +504,7 @@ Shell::_Spawn(int row, int col, const char *encoding, int argc, const char **arg
/*
* Exec failed.
* TODO: This doesn't belong here.
*/
sleep(1);
+2 -2
View File
@@ -29,12 +29,12 @@ public:
const char * TTYName() const;
ssize_t Read(void *buffer, size_t numBytes);
ssize_t Read(void *buffer, size_t numBytes) const;
ssize_t Write(const void *buffer, size_t numBytes);
status_t UpdateWindowSize(int row, int columns);
status_t GetAttr(struct termios &attr);
status_t GetAttr(struct termios &attr) const;
status_t SetAttr(struct termios &attr);
int FD() const;