summaryrefslogtreecommitdiff
path: root/components/libc/compilers
diff options
context:
space:
mode:
authorMeco Man <[email protected]>2021-10-27 02:52:04 -0400
committerMeco Man <[email protected]>2021-10-27 03:04:05 -0400
commit25bd908fb7ea04e0e9218597b10f75814bf77a4f (patch)
treeef436b820dcc00cdc46ae24a86d86e654ae60896 /components/libc/compilers
parent4d256eb308f4e9f7abc1644dda3fd675e560d518 (diff)
[libc][posix] 解决RT_LIBC_USING_FILEIO范围过大的问题
Diffstat (limited to 'components/libc/compilers')
-rw-r--r--components/libc/compilers/gcc/newlib/libc.c4
-rw-r--r--components/libc/compilers/gcc/newlib/libc.h4
-rw-r--r--components/libc/compilers/gcc/newlib/stdio.c51
3 files changed, 49 insertions, 10 deletions
diff --git a/components/libc/compilers/gcc/newlib/libc.c b/components/libc/compilers/gcc/newlib/libc.c
index 943d127eed..86af026429 100644
--- a/components/libc/compilers/gcc/newlib/libc.c
+++ b/components/libc/compilers/gcc/newlib/libc.c
@@ -20,7 +20,7 @@
int libc_system_init(void)
{
-#ifdef RT_LIBC_USING_FILEIO
+#ifdef RT_USING_POSIX
rt_device_t dev_console;
dev_console = rt_console_get_device();
@@ -28,7 +28,7 @@ int libc_system_init(void)
{
libc_stdio_set_console(dev_console->parent.name, O_RDWR);
}
-#endif /* RT_LIBC_USING_FILEIO */
+#endif /* RT_USING_POSIX */
#if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT
pthread_system_init();
diff --git a/components/libc/compilers/gcc/newlib/libc.h b/components/libc/compilers/gcc/newlib/libc.h
index fdb0a45472..0ae1057730 100644
--- a/components/libc/compilers/gcc/newlib/libc.h
+++ b/components/libc/compilers/gcc/newlib/libc.h
@@ -15,10 +15,10 @@ extern "C" {
#endif
int libc_system_init(void);
-#ifdef RT_LIBC_USING_FILEIO
+#ifdef RT_USING_POSIX
int libc_stdio_get_console(void);
int libc_stdio_set_console(const char* device_name, int mode);
-#endif /* RT_LIBC_USING_FILEIO */
+#endif /* RT_USING_POSIX */
#ifdef __cplusplus
}
diff --git a/components/libc/compilers/gcc/newlib/stdio.c b/components/libc/compilers/gcc/newlib/stdio.c
index 5f9dd2de4c..c0da1b1cec 100644
--- a/components/libc/compilers/gcc/newlib/stdio.c
+++ b/components/libc/compilers/gcc/newlib/stdio.c
@@ -8,15 +8,15 @@
* 2017/10/15 bernard the first version
*/
#include <rtthread.h>
-
-#ifdef RT_LIBC_USING_FILEIO
#include <stdio.h>
-#include <stdlib.h>
#include <fcntl.h>
#include "libc.h"
#define STDIO_DEVICE_NAME_MAX 32
+#ifdef RT_LIBC_USING_FILEIO
+#include <stdlib.h>
+
static FILE* std_console = NULL;
int libc_stdio_set_console(const char* device_name, int mode)
@@ -28,9 +28,18 @@ int libc_stdio_set_console(const char* device_name, int mode)
snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
- if (mode == O_RDWR) file_mode = "r+";
- else if (mode == O_WRONLY) file_mode = "wb";
- else file_mode = "rb";
+ if (mode == O_RDWR)
+ {
+ file_mode = "r+";
+ }
+ else if (mode == O_WRONLY)
+ {
+ file_mode = "wb";
+ }
+ else
+ {
+ file_mode = "rb";
+ }
fp = fopen(name, file_mode);
if (fp)
@@ -80,4 +89,34 @@ int libc_stdio_get_console(void)
return -1;
}
+#elif defined(RT_USING_POSIX)
+#include <unistd.h>
+static int std_fd = -1;
+
+int libc_stdio_set_console(const char* device_name, int mode)
+{
+ int fd;
+ char name[STDIO_DEVICE_NAME_MAX];
+
+ snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
+ name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
+
+ fd = open(name, mode, 0);
+ if (fd >= 0)
+ {
+ if (std_fd >= 0)
+ {
+ close(std_fd);
+ }
+ std_fd = fd;
+ }
+
+ return std_fd;
+}
+
+int libc_stdio_get_console(void)
+{
+ return std_fd;
+}
+
#endif /* RT_LIBC_USING_FILEIO */