Jelajahi Sumber

[telnet]修复5.1.0下RT_USING_POSIX_STDIO打开后的编译和使用

liuchao 1 tahun lalu
induk
melakukan
677533ee03
1 mengubah file dengan 92 tambahan dan 1 penghapusan
  1. 92 1
      telnet/telnet.c

+ 92 - 1
telnet/telnet.c

@@ -28,7 +28,12 @@
 #endif /* defined(RT_USING_POSIX_STDIO) */
 
 #if defined(RT_USING_POSIX_STDIO) || defined(RT_USING_POSIX)
+#if RT_VER_NUM >= 0x50100
+#include <unistd.h>
+#include <posix/stdio.h>
+#else
 #include <libc.h>
+#endif /* RT_VER_NUM >= 0x50100 */
 static int dev_old_flag;
 #endif /* defined(RT_USING_POSIX_STDIO) || defined(RT_USING_POSIX) */
 
@@ -263,8 +268,13 @@ static void client_close(struct telnet_session* telnet)
     rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
     /* set finsh device */
 #if defined(RT_USING_POSIX_STDIO) || defined(RT_USING_POSIX)
+#if RT_VER_NUM >= 0x50100
+    ioctl(rt_posix_stdio_get_console(), F_SETFL, (void *) dev_old_flag);
+    rt_posix_stdio_set_console(RT_CONSOLE_DEVICE_NAME, O_RDWR);
+#else
     ioctl(libc_stdio_get_console(), F_SETFL, (void *) dev_old_flag);
     libc_stdio_set_console(RT_CONSOLE_DEVICE_NAME, O_RDWR);
+#endif /* RT_VER_NUM >= 0x50100 */
 #else
     finsh_set_device(RT_CONSOLE_DEVICE_NAME);
 #endif /* defined(RT_USING_POSIX_STDIO) || defined(RT_USING_POSIX) */
@@ -298,7 +308,7 @@ static rt_err_t telnet_close(rt_device_t dev)
 
 static rt_ssize_t telnet_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
 {
-    rt_size_t result;
+    rt_size_t result = 0;
 
     rt_sem_take(telnet->read_notice, RT_WAITING_FOREVER);
 
@@ -360,6 +370,75 @@ static rt_err_t telnet_control(rt_device_t dev, int cmd, void *args)
     };
 #endif /* RT_USING_DEVICE_OPS */
 
+#ifdef RT_USING_POSIX_STDIO
+#include <dfs_file.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <poll.h>
+#include <sys/ioctl.h>
+
+#ifdef RT_USING_POSIX_TERMIOS
+#include <termios.h>
+#endif
+
+/* it's possible the 'getc/putc' is defined by stdio.h in gcc/newlib. */
+#ifdef getc
+#undef getc
+#endif
+
+#ifdef putc
+#undef putc
+#endif
+
+#ifdef RT_USING_DFS_V2
+static ssize_t telnet_fops_read(struct dfs_file *fd, void *buf, size_t count, off_t *pos)
+#else
+static ssize_t telnet_fops_read(struct dfs_file *fd, void *buf, size_t count)
+#endif
+{
+    int size = 0;
+    rt_device_t device;
+    int wait_ret;
+
+    device = &telnet->device;
+
+    do
+    {
+        size = rt_device_read(device, -1,  buf, count);
+        if (size <= 0)
+        {
+            if (fd->flags & O_NONBLOCK)
+            {
+                size = -EAGAIN;
+                break;
+            }
+
+            wait_ret = rt_wqueue_wait_interruptible(&(device->wait_queue), 0, RT_WAITING_FOREVER);
+            if (wait_ret != RT_EOK)
+            {
+                break;
+            }
+        }
+    }while (size <= 0);
+
+    if (size < 0)
+    {
+        size = 0;
+    }
+    return size;
+}
+static const struct dfs_file_ops telnet_fops =
+{
+    .open   = NULL,
+    .close  = NULL,
+    .ioctl  = NULL,
+    .read   = telnet_fops_read,
+    .write  = NULL,
+    .poll   = NULL,
+};
+#endif /* RT_USING_POSIX_STDIO */
+
+
 /* telnet server thread entry */
 static void telnet_thread(void* parameter)
 {
@@ -411,6 +490,10 @@ static void telnet_thread(void* parameter)
     telnet->device.control  = telnet_control;
 #endif /* RT_USING_DEVICE_OPS */
 
+#ifdef RT_USING_POSIX_STDIO
+    telnet->device.fops = &telnet_fops;
+#endif
+
     /* no private */
     telnet->device.user_data = RT_NULL;
 
@@ -436,11 +519,19 @@ static void telnet_thread(void* parameter)
         /* set finsh device */
 #if defined(RT_USING_POSIX_STDIO) || defined(RT_USING_POSIX)
         /* backup flag */
+#if RT_VER_NUM >= 0x50100
+        dev_old_flag = ioctl(rt_posix_stdio_get_console(), F_GETFL, (void *) RT_NULL);
+        /* add non-block flag */
+        ioctl(rt_posix_stdio_get_console(), F_SETFL, (void *) (dev_old_flag | O_NONBLOCK));
+        /* set tcp shell device for console */
+        rt_posix_stdio_set_console("telnet", O_RDWR);
+#else
         dev_old_flag = ioctl(libc_stdio_get_console(), F_GETFL, (void *) RT_NULL);
         /* add non-block flag */
         ioctl(libc_stdio_get_console(), F_SETFL, (void *) (dev_old_flag | O_NONBLOCK));
         /* set tcp shell device for console */
         libc_stdio_set_console("telnet", O_RDWR);
+#endif /* RT_VER_NUM >= 0x50100 */
         /* resume finsh thread, make sure it will unblock from last device receive */
         rt_thread_t tid = rt_thread_find(FINSH_THREAD_NAME);
         if (tid)