Преглед изворни кода

开启telnet的回显选项,可以使用table键、上下键等 (#103)

Co-authored-by: jianbaoshan <jianbs@sino-telecom.com>
jianbaoshan пре 1 година
родитељ
комит
87b4872ce9
1 измењених фајлова са 23 додато и 2 уклоњено
  1. 23 2
      telnet/telnet.c

+ 23 - 2
telnet/telnet.c

@@ -58,6 +58,8 @@ static int dev_old_flag;
 #define TELNET_DO           253
 #define TELNET_DONT         254
 
+#define TELNET_OPT_ECHO     1
+
 struct telnet_session
 {
     struct rt_ringbuffer rx_ringbuffer;
@@ -164,6 +166,9 @@ static void process_rx(struct telnet_session* telnet, rt_uint8_t *data, rt_size_
 
             /* don't option */
         case STATE_WILL:
+            send_option_to_client(telnet, TELNET_DO, *data);
+            telnet->state = STATE_NORMAL;
+            break;
         case STATE_WONT:
             send_option_to_client(telnet, TELNET_DONT, *data);
             telnet->state = STATE_NORMAL;
@@ -171,6 +176,9 @@ static void process_rx(struct telnet_session* telnet, rt_uint8_t *data, rt_size_
 
             /* won't option */
         case STATE_DO:
+            send_option_to_client(telnet, TELNET_WILL, *data);
+            telnet->state = STATE_NORMAL;
+            break;
         case STATE_DONT:
             send_option_to_client(telnet, TELNET_WONT, *data);
             telnet->state = STATE_NORMAL;
@@ -315,6 +323,18 @@ static rt_err_t telnet_control(rt_device_t dev, int cmd, void *args)
     };
 #endif /* RT_USING_DEVICE_OPS */
 
+
+static int telnet_enable_echo(rt_int32_t fd)
+{
+    rt_uint8_t cmd_len = 3;
+    rt_uint8_t cmd_buffer[4];
+
+    cmd_buffer[0] = TELNET_IAC;
+    cmd_buffer[1] = TELNET_WILL;
+    cmd_buffer[2] = TELNET_OPT_ECHO;
+    return send(fd, cmd_buffer, cmd_len, 0);
+}
+
 /* telnet server thread entry */
 static void telnet_thread(void* parameter)
 {
@@ -412,14 +432,15 @@ static void telnet_thread(void* parameter)
         telnet->state = STATE_NORMAL;
 
         telnet->echo_mode = finsh_get_echo();
-        /* disable echo mode */
-        finsh_set_echo(0);
+        /* enable echo mode */
+        finsh_set_echo(1);
         /* output RT-Thread version and shell prompt */
 #ifdef FINSH_USING_MSH
         msh_exec("version", rt_strlen("version"));
 #endif /* FINSH_USING_MSH */
         rt_kprintf(FINSH_PROMPT);
 
+        telnet_enable_echo(telnet->client_fd);
         while (1)
         {
             /* try to send all data in tx ringbuffer */