diff options
| author | Meco Man <[email protected]> | 2021-10-27 02:52:04 -0400 |
|---|---|---|
| committer | Meco Man <[email protected]> | 2021-10-27 03:04:05 -0400 |
| commit | 25bd908fb7ea04e0e9218597b10f75814bf77a4f (patch) | |
| tree | ef436b820dcc00cdc46ae24a86d86e654ae60896 /components/libc/compilers | |
| parent | 4d256eb308f4e9f7abc1644dda3fd675e560d518 (diff) | |
[libc][posix] 解决RT_LIBC_USING_FILEIO范围过大的问题
Diffstat (limited to 'components/libc/compilers')
| -rw-r--r-- | components/libc/compilers/gcc/newlib/libc.c | 4 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/libc.h | 4 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/stdio.c | 51 |
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 */ |
