[libc][posix] 解决RT_LIBC_USING_FILEIO范围过大的问题

This commit is contained in:
Meco Man
2021-10-27 02:52:04 -04:00
parent 4d256eb308
commit 25bd908fb7
7 changed files with 68 additions and 21 deletions

View File

@@ -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();

View File

@@ -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
}

View File

@@ -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 */