mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2024-12-25 23:10:32 +00:00
negotiation fix
This commit is contained in:
parent
97dfec41b1
commit
04d21a878a
2 changed files with 94 additions and 49 deletions
|
@ -85,7 +85,7 @@ U0 HandleControlCodes(U8 ch) {
|
||||||
SysLog("Vertical Tab\n");
|
SysLog("Vertical Tab\n");
|
||||||
break;
|
break;
|
||||||
case 12: // FF (Form Feed)
|
case 12: // FF (Form Feed)
|
||||||
SysLog("form feed");
|
// SysLog("form feed\n");
|
||||||
DocClear(term.doc);
|
DocClear(term.doc);
|
||||||
// DocPrint(term.doc, "\f");
|
// DocPrint(term.doc, "\f");
|
||||||
break;
|
break;
|
||||||
|
@ -216,24 +216,27 @@ U0 ANSIParse()
|
||||||
}
|
}
|
||||||
else if (ansi_code[0] == 6) {
|
else if (ansi_code[0] == 6) {
|
||||||
// Respond with cursor position
|
// Respond with cursor position
|
||||||
// U8 response[32] = "\x1B[%d;%dR", window_width, window_height;
|
// U8 response[7] = "\x1B[%d;%dR", term.window_width, term.window_height;
|
||||||
SysLog("reported cursor position\n");
|
SysLog("reported cursor position\n");
|
||||||
U8 cursorResponse[8];
|
// TODO: hardcoded the position 80x24
|
||||||
|
// U8 response[9] = "\x1B[80;24R";
|
||||||
|
// if (term.sock_ready) TCPSocketSend(term.sock, response, 9);
|
||||||
|
U8 cursorResponse[9];
|
||||||
cursorResponse[0] = ANSI_ESC;
|
cursorResponse[0] = ANSI_ESC;
|
||||||
cursorResponse[1] = ANSI_CSI;
|
cursorResponse[1] = '['; // Start of CSI
|
||||||
cursorResponse[2] = 0x32;
|
cursorResponse[2] = '2'; // First digit of "24"
|
||||||
cursorResponse[3] = 0x35;
|
cursorResponse[3] = '4'; // Second digit of "24"
|
||||||
cursorResponse[4] = 0x3B;
|
cursorResponse[4] = ';'; // Separator
|
||||||
cursorResponse[5] = 0x38;
|
cursorResponse[5] = '8'; // First digit of "80"
|
||||||
cursorResponse[6] = 0x30;
|
cursorResponse[6] = '0'; // Second digit of "80"
|
||||||
cursorResponse[6] = 0x52;
|
cursorResponse[7] = 'R'; // End of CPR
|
||||||
cursorResponse[7] = 0x00;
|
cursorResponse[8] = 0x00; // Null-terminator
|
||||||
if (term.sock_ready) TCPSocketSend(term.sock, cursorResponse, 7);
|
if (term.sock_ready) TCPSocketSend(term.sock, cursorResponse, 9);
|
||||||
}
|
}
|
||||||
else if (ansi_code[0] == 255) {
|
else if (ansi_code[0] == 255) {
|
||||||
// https://github.com/NuSkooler/enigma-bbs/blob/97cd0c3063b0c9f93a0fa4a44a85318ca81aef43/core/ansi_term.js#L140
|
// https://github.com/NuSkooler/enigma-bbs/blob/97cd0c3063b0c9f93a0fa4a44a85318ca81aef43/core/ansi_term.js#L140
|
||||||
SysLog("reported screensize?\n");
|
SysLog("reported screensize?\n");
|
||||||
SendWindowSize(term.sock, 25, 80);
|
// SendWindowSize(term.sock, 80, 25);
|
||||||
}
|
}
|
||||||
ptr++;
|
ptr++;
|
||||||
break;
|
break;
|
||||||
|
@ -254,8 +257,8 @@ U0 ANSIParse()
|
||||||
ptr++;
|
ptr++;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
// colors might be printed in the wrong order?
|
// TODO: what happens in this case??? --> [0;1;34;44m
|
||||||
// like, <Esc>[1;40m and now <Esc>[40m;1m
|
|
||||||
I64 m;
|
I64 m;
|
||||||
Bool isBright = FALSE;
|
Bool isBright = FALSE;
|
||||||
for (m = 0; m <= ansi_param_count; m++) {
|
for (m = 0; m <= ansi_param_count; m++) {
|
||||||
|
@ -506,7 +509,7 @@ U0 ANSIParse()
|
||||||
// break;
|
// break;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
SysLog("H or f row:%d, col:%d, cnt:%d\n", row, col, ansi_param_count);
|
// SysLog("H or f row:%d, col:%d, cnt:%d\n", row, col, ansi_param_count);
|
||||||
|
|
||||||
|
|
||||||
// Adjust the position based on the window size
|
// Adjust the position based on the window size
|
||||||
|
@ -713,7 +716,7 @@ receive_data:
|
||||||
// parse the buffer
|
// parse the buffer
|
||||||
ANSIParse;
|
ANSIParse;
|
||||||
} else {
|
} else {
|
||||||
SysLog("BUF_SIZE: %d\n", BUF_SIZE);
|
//SysLog("BUF_SIZE: %d\n", BUF_SIZE);
|
||||||
if (!term.sock_ready || force_disconnect)
|
if (!term.sock_ready || force_disconnect)
|
||||||
DocPrint(term.doc, "Error: Connection closed by the remote host.\n");
|
DocPrint(term.doc, "Error: Connection closed by the remote host.\n");
|
||||||
else
|
else
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#define LINEMODE 0x22
|
#define LINEMODE 0x22
|
||||||
#define NAWS 0x1F // (Negotiate About Window Size)
|
#define NAWS 0x1F // (Negotiate About Window Size)
|
||||||
#define IS 0x00
|
#define IS 0x00
|
||||||
|
#define SEND 0x01
|
||||||
#define SB 0xFA
|
#define SB 0xFA
|
||||||
#define SE 0xF0
|
#define SE 0xF0
|
||||||
|
|
||||||
|
@ -28,14 +29,33 @@
|
||||||
// #define TELNET_BRK 243 /* 0xf3 - Break */
|
// #define TELNET_BRK 243 /* 0xf3 - Break */
|
||||||
// #define TELNET_SYNC 242 /* 0xf2 - Data mark */
|
// #define TELNET_SYNC 242 /* 0xf2 - Data mark */
|
||||||
// #define TELNET_NOP 241 /* 0xf1 - No operation */
|
// #define TELNET_NOP 241 /* 0xf1 - No operation */
|
||||||
|
#define SE_END 240
|
||||||
|
|
||||||
U0 SendWindowSize(I64 sock, U16 rows, U16 cols)
|
// #define TELNET_NAWS 31
|
||||||
|
// #define TELNET_TERMINAL_TYPE 24
|
||||||
|
#define SEND_LOCATION 23
|
||||||
|
#define BINARY_TRANSMISSION 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
U0 TelnetRequest(I64 sock, U8 option_code)
|
||||||
|
{
|
||||||
|
U8 request[3];
|
||||||
|
request[0] = IAC;
|
||||||
|
request[1] = WILL;
|
||||||
|
request[2] = option_code;
|
||||||
|
|
||||||
|
TCPSocketSend(sock, request, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
U0 SendWindowSize(I64 sock, U16 cols, U16 rows)
|
||||||
{
|
{
|
||||||
U8 buf[9];
|
U8 buf[9];
|
||||||
|
|
||||||
buf[0] = IAC;
|
buf[0] = IAC;
|
||||||
buf[1] = SB;
|
buf[1] = SB;
|
||||||
buf[2] = NAWS;
|
buf[2] = NAWS;
|
||||||
|
// if dynamic resolution, make sure to account for 255 AIC (byte stuffing needs to be done)
|
||||||
buf[3] = cols >> 8; // High byte of columns
|
buf[3] = cols >> 8; // High byte of columns
|
||||||
buf[4] = cols & 0xFF; // Low byte of columns
|
buf[4] = cols & 0xFF; // Low byte of columns
|
||||||
buf[5] = rows >> 8; // High byte of rows
|
buf[5] = rows >> 8; // High byte of rows
|
||||||
|
@ -44,42 +64,66 @@ U0 SendWindowSize(I64 sock, U16 rows, U16 cols)
|
||||||
buf[8] = SE;
|
buf[8] = SE;
|
||||||
|
|
||||||
SysLog("SendWindowSize: %d x %d\n", cols, rows);
|
SysLog("SendWindowSize: %d x %d\n", cols, rows);
|
||||||
TCPSocketSendString(sock, buf);
|
TCPSocketSend(sock, buf, 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
U0 SendTerminalType(I64 sock, U8 *terminal_type)
|
U0 SendTerminalType(I64 sock)
|
||||||
{
|
{
|
||||||
U8 response[256];
|
|
||||||
I64 len = StrLen(terminal_type);
|
U8 response[14];
|
||||||
|
|
||||||
response[0] = IAC;
|
response[0] = IAC;
|
||||||
response[1] = SB;
|
response[1] = SB;
|
||||||
response[2] = TERMINAL_TYPE;
|
response[2] = TERMINAL_TYPE;
|
||||||
response[3] = IS;
|
response[3] = IS;
|
||||||
MemCopy(response + 4, terminal_type, len);
|
|
||||||
|
|
||||||
SysLog("SendTerminalType: %s\n", terminal_type);
|
response[4] = 'A';
|
||||||
|
response[5] = 'N';
|
||||||
|
response[6] = 'S';
|
||||||
|
response[7] = 'I';
|
||||||
|
response[8] = '-';
|
||||||
|
response[9] = 'B';
|
||||||
|
response[10] = 'B';
|
||||||
|
response[11] = 'S';
|
||||||
|
|
||||||
response[len + 4] = IAC;
|
response[12] = IAC;
|
||||||
response[len + 5] = SE;
|
response[13] = SE;
|
||||||
response[len + 6] = '\0';
|
|
||||||
TCPSocketSendString(sock, response);
|
SysLog("SendTerminalType: ANSI-BBS\n");
|
||||||
|
TCPSocketSend(sock, response, 14);
|
||||||
}
|
}
|
||||||
|
|
||||||
U0 TelnetNegotiate(I64 sock, U8 ptr)
|
U0 TelnetNegotiate(I64 sock, U8 *ptr)
|
||||||
{
|
{
|
||||||
U8 negotiation_code = *(ptr + 1);
|
U8 negotiation_code = *(ptr + 1);
|
||||||
U8 option_code = *(ptr + 2);
|
U8 option_code = *(ptr + 2);
|
||||||
|
|
||||||
// Send a response to the server
|
|
||||||
U8 response[4];
|
|
||||||
response[0] = IAC;
|
|
||||||
|
|
||||||
|
SysLog("Negotiation code: %d | Option code: %d\n", negotiation_code, option_code);
|
||||||
|
|
||||||
|
// Check if this is a subnegotiation request
|
||||||
|
if (negotiation_code == SB)
|
||||||
|
{
|
||||||
|
SysLog("SB: %d\n", option_code);
|
||||||
|
if (option_code == TERMINAL_TYPE && *(ptr + 3) == SEND)
|
||||||
|
{
|
||||||
|
SendTerminalType(sock);
|
||||||
|
}
|
||||||
|
else if (option_code == NAWS && *(ptr + 3) == SEND)
|
||||||
|
{
|
||||||
|
SendWindowSize(sock, 80, 25);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, handle it as a normal negotiation...
|
||||||
|
U8 response[3];
|
||||||
|
response[0] = IAC;
|
||||||
if (negotiation_code == DO || negotiation_code == DONT)
|
if (negotiation_code == DO || negotiation_code == DONT)
|
||||||
{
|
{
|
||||||
if (option_code == ECHO)
|
if (option_code == ECHO)
|
||||||
{
|
{
|
||||||
if (negotiation_code == DO)
|
if (negotiation_code == DO || negotiation_code == WILL)
|
||||||
{
|
{
|
||||||
response[1] = WILL;
|
response[1] = WILL;
|
||||||
}
|
}
|
||||||
|
@ -101,23 +145,29 @@ U0 TelnetNegotiate(I64 sock, U8 ptr)
|
||||||
}
|
}
|
||||||
else if (option_code == TERMINAL_TYPE)
|
else if (option_code == TERMINAL_TYPE)
|
||||||
{
|
{
|
||||||
|
SysLog("TERMINAL_TYPE negotiation\n");
|
||||||
if (negotiation_code == DO)
|
if (negotiation_code == DO)
|
||||||
{
|
{
|
||||||
|
SysLog("TERMINAL_TYPE WILL\n");
|
||||||
response[1] = WILL;
|
response[1] = WILL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SysLog("TERMINAL_TYPE WONT\n");
|
||||||
response[1] = WONT;
|
response[1] = WONT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (option_code == NAWS)
|
else if (option_code == NAWS)
|
||||||
{
|
{
|
||||||
if (negotiation_code == DO)
|
SysLog("NAWS negotiation\n");
|
||||||
|
if (negotiation_code == DO || negotiation_code == WILL)
|
||||||
{
|
{
|
||||||
|
SysLog("NAWS WILL\n");
|
||||||
response[1] = WILL;
|
response[1] = WILL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SysLog("NAWS WONT\n");
|
||||||
response[1] = WONT;
|
response[1] = WONT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,22 +189,14 @@ U0 TelnetNegotiate(I64 sock, U8 ptr)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
response[1] = DONT;
|
response[1] = WONT;
|
||||||
}
|
}
|
||||||
|
|
||||||
response[2] = option_code;
|
response[2] = option_code;
|
||||||
response[3] = '\0';
|
TCPSocketSend(sock, response, 3);
|
||||||
|
// if (option_code == NAWS && negotiation_code == DO)
|
||||||
if (term.sock_ready)
|
// {
|
||||||
{
|
// SysLog("Sending NAWS right away\n");
|
||||||
TCPSocketSendString(sock, response);
|
// SendWindowSize(sock, 80, 25);
|
||||||
// the bugged out SendTerminalType and SendWindowsSize was what crashed the BBS...
|
// }
|
||||||
if (option_code == TERMINAL_TYPE) SendTerminalType(sock, "ANSI-BBS");
|
|
||||||
else if (option_code == NAWS) SendWindowSize(sock, 25, 80);
|
|
||||||
|
|
||||||
// send out the dimension regardless
|
|
||||||
TCPSocketSendString(term.sock, "\x1B[8;25;80t");
|
|
||||||
// TCPSocketSendString(term.sock, "\xdb\b \xdb\b \xdb\b[\xdb\b[\xdb\b \xdb\bM\xdb\ba\xdb\bi\xdb\bn\xdb\bt\xdb\be\xdb\bn\xdb\ba\xdb\bn\xdb\bc\xdb\be\xdb\b \xdb\bC\xdb\bo\xdb\bm\xdb\bp\xdb\bl\xdb\be\xdb\bt\xdb\be\xdb\b \xdb\b]\xdb\b]\xdb\b \b\r\n\r\n\x1b[0m\x1b[2J\r\n\r\n\x1b[0;1;30mHX Force retinal scan in progress ... \x1b[0;0;30m");
|
|
||||||
// TCPSocketSendString(term.sock, "\033[s\033[99B\033[99B\033[99B_\033[99C\033[99C\033[99C_\033[6n\033[u\033[0m_\033[2J\033[H");
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue