From b90b6f0257697eb2c57738985a663df1fd1460d1 Mon Sep 17 00:00:00 2001 From: Jeremy Ellington Date: Tue, 20 Jul 2004 16:07:56 +0000 Subject: [PATCH] Use raw tty mode for SOL session --- ipmitool/lib/ipmi_sol.c | 49 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/ipmitool/lib/ipmi_sol.c b/ipmitool/lib/ipmi_sol.c index add2220..9a1f2a5 100644 --- a/ipmitool/lib/ipmi_sol.c +++ b/ipmitool/lib/ipmi_sol.c @@ -40,6 +40,8 @@ #include #include +#include + #include #include #include @@ -58,6 +60,8 @@ #define SOL_PARAMETER_SOL_PAYLOAD_CHANNEL 0x07 #define SOL_PARAMETER_SOL_PAYLOAD_PORT 0x08 +static struct termios _saved_tio; +static int _in_raw_mode = 0; extern int verbose; @@ -670,13 +674,51 @@ static int ipmi_sol_set_param(struct ipmi_intf * intf, } + +void leave_raw_mode(void) +{ + if (!_in_raw_mode) + return; + if (tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio) == -1) + perror("tcsetattr"); + else + _in_raw_mode = 0; +} + + + +void enter_raw_mode(void) +{ + struct termios tio; + if (tcgetattr(fileno(stdin), &tio) == -1) { + perror("tcgetattr"); + return; + } + _saved_tio = tio; + tio.c_iflag |= IGNPAR; + tio.c_iflag &= ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXANY | IXOFF)\ + ; + tio.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL); + // #ifdef IEXTEN + tio.c_lflag &= ~IEXTEN; + // #endif + tio.c_oflag &= ~OPOST; + tio.c_cc[VMIN] = 1; + tio.c_cc[VTIME] = 0; + if (tcsetattr(fileno(stdin), TCSADRAIN, &tio) == -1) + perror("tcsetattr"); + else + _in_raw_mode = 1; +} + + + /* * ipmi_sol_red_pill */ static int ipmi_sol_red_pill(struct ipmi_intf * intf) { struct ipmi_v2_payload v2_payload; - char buffer[255]; int bShouldExit = 0; fd_set read_fds; struct timeval tv; @@ -684,6 +726,8 @@ static int ipmi_sol_red_pill(struct ipmi_intf * intf) size_t num_read; char c; + enter_raw_mode(); + while (! bShouldExit) { FD_ZERO(&read_fds); @@ -736,7 +780,6 @@ static int ipmi_sol_red_pill(struct ipmi_intf * intf) * Received input from the BMC. */ int i; - bzero(buffer, sizeof(buffer)); //printf("The BMC has data for us...\n"); struct ipmi_rs * rs =intf->recv_sol(intf); for (i = 0; i < rs->data_len; ++i) @@ -752,6 +795,8 @@ static int ipmi_sol_red_pill(struct ipmi_intf * intf) } } + leave_raw_mode(); + return 0; }