Bläddra i källkod

telnet: corrected ^C behaviour

Sergey Alirzaev 5 år sedan
förälder
incheckning
899c5dd583
2 ändrade filer med 18 tillägg och 19 borttagningar
  1. 12 16
      modules/Telnet_Server/telnet_server.c
  2. 6 3
      modules/cli/cli.c

+ 12 - 16
modules/Telnet_Server/telnet_server.c

@@ -167,7 +167,6 @@ typedef struct{
 	uint8_t login_err;	// the number of failed password entry attempts
 	uint8_t num_connect;
 	bool active_conn;
-	bool flag_telnet_ip_option;
 	cli_state_t *cli_state;
 } telnetd_state_t;
 
@@ -265,7 +264,7 @@ void parseopt(telnetd_state_t *ts, uint8_t code, uint8_t option)
 
 		case TELOPT_TIMING_MARK:
 			xTimerStop(ts->cli_state->RepeatSensorInfoTimer, 0);
-			ts->flag_telnet_ip_option = true;
+			ts->cli_state->flag_telnet_ip_option = true;
 			sendopt(ts, TELNET_WILL, TELOPT_TIMING_MARK);
 			sendopt(ts, TELNET_MARK, 0);
 			if(ts->cli_state->input_state != CLI_CHANGE_PWD && ts->cli_state->input_state != CLI_CHANGE_PWD_ACK)
@@ -435,25 +434,22 @@ static void newdata(telnetd_state_t *s)
 	case STATE_IAC:
 		switch (c) {
 		case TELNET_IAC:
-		s->state = STATE_NORMAL;
-		break;
-
+			s->state = STATE_NORMAL;
+			break;
 		case TELNET_WILL:
 		case TELNET_WONT:
 		case TELNET_DO:
 		case TELNET_DONT:
-		s->code = c;
-		s->state = STATE_OPT;
-		break;
-
+			s->code = c;
+			s->state = STATE_OPT;
+			break;
 		case TELNET_SB:
-		s->state = STATE_SB;
-		break;
-
+			s->state = STATE_SB;
+			break;
 		default:
-		s->state = STATE_NORMAL;
-		break;
-	}
+			s->state = STATE_NORMAL;
+			break;
+		}
 		break;
 	case STATE_OPT:
 		parseopt(s, s->code, c);
@@ -816,7 +812,7 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 						auth_tlnt_srvr_param[cur_cnt].num_connect = 0;
 						auth_tlnt_srvr_param[cur_cnt].active_conn = false;
 						auth_tlnt_srvr_param[cur_cnt].telnet_code_auth = USER;
-						auth_tlnt_srvr_param[cur_cnt].flag_telnet_ip_option = false;
+						auth_tlnt_srvr_param[cur_cnt].cli_state->flag_telnet_ip_option = false;
 						cnt_conn -= 1;
 						closesocket(i);
 						FD_CLR(i, &master_set);

+ 6 - 3
modules/cli/cli.c

@@ -16,6 +16,8 @@
 
 #define ISO_nl       0x0a
 #define ISO_cr       0x0d
+#define ISO_etx      0x03
+#define ISO_del      0x7f
 
 #define REPEAT_SENSOR_INFO_TIME		configTICK_RATE_HZ*5*1
 
@@ -193,9 +195,10 @@ void cli_getchar(cli_state_t *s, char incoming_char)
 {
 	s->buf[s->bufptr] = incoming_char;
 
+	printf("got char: %x\r\n", (unsigned)incoming_char);
 	bool echo_enabled = true;	// FIXME
 	if(echo_enabled && s->input_state != CLI_AUTH_PASSW){
-		if(s->buf[s->bufptr] != 0x03 && s->buf[s->bufptr] != 0x7f){
+		if (s->buf[s->bufptr] != ISO_etx && s->buf[s->bufptr] != ISO_del) {
 			s->send( s->num_connect, &s->buf[s->bufptr], 1);
 		}
 	}
@@ -215,7 +218,7 @@ void cli_getchar(cli_state_t *s, char incoming_char)
 		}
 		cli_input(s);
 		s->bufptr = 0;
-	} else if( s->buf[s->bufptr] == '\b' || s->buf[s->bufptr] == 0x7f) {
+	} else if ( s->buf[s->bufptr] == '\b' || s->buf[s->bufptr] == ISO_del) {
 		/* Backspace was pressed. Erase the last character in the string - if any. */
 		s->buf[s->bufptr] = '\0';
 		if (s->bufptr > 0) {
@@ -224,7 +227,7 @@ void cli_getchar(cli_state_t *s, char incoming_char)
 			const char backspace[] = "\b \b";
 			s->send(s->num_connect, backspace, sizeof(backspace));
 		}
-	} else if (s->buf[s->bufptr] == 0x03){
+	} else if (s->buf[s->bufptr] == ISO_etx){
 		xTimerStop(s->RepeatSensorInfoTimer, 0);
 		s->flag_telnet_ip_option = true;
 		if(s->input_state != CLI_CHANGE_PWD && s->input_state != CLI_CHANGE_PWD_ACK)