Merge pull request #5236 from mysterywolf/posix
[libc][posix] 解决RT_LIBC_USING_FILEIO范围过大的问题
This commit is contained in:
commit
4107d7bea2
|
@ -119,7 +119,7 @@ void rtthread_startup(void)
|
|||
#ifdef RT_USING_FINSH
|
||||
/* init finsh */
|
||||
finsh_system_init();
|
||||
#if !defined(RT_LIBC_USING_FILEIO) && defined(RT_USING_DEVICE)
|
||||
#if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE)
|
||||
finsh_set_device("uart1");
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -18,9 +18,9 @@
|
|||
#include <lwp.h>
|
||||
#endif
|
||||
|
||||
#ifdef RT_LIBC_USING_FILEIO
|
||||
#ifdef RT_USING_POSIX
|
||||
#include <libc.h>
|
||||
#endif
|
||||
#endif /* RT_USING_POSIX */
|
||||
|
||||
/* Global variables */
|
||||
const struct dfs_filesystem_ops *filesystem_operation_table[DFS_FILESYSTEM_TYPES_MAX];
|
||||
|
@ -216,10 +216,10 @@ struct dfs_fd *fd_get(int fd)
|
|||
struct dfs_fd *d;
|
||||
struct dfs_fdtable *fdt;
|
||||
|
||||
#ifdef RT_LIBC_USING_FILEIO
|
||||
#ifdef RT_USING_POSIX
|
||||
if ((0 <= fd) && (fd <= 2))
|
||||
fd = libc_stdio_get_console();
|
||||
#endif
|
||||
#endif /* RT_USING_POSIX */
|
||||
|
||||
fdt = dfs_fdtable_get();
|
||||
fd = fd - DFS_FD_OFFSET;
|
||||
|
|
|
@ -145,10 +145,17 @@ void finsh_set_prompt_mode(rt_uint32_t prompt_mode)
|
|||
int finsh_getchar(void)
|
||||
{
|
||||
#ifdef RT_USING_DEVICE
|
||||
#ifdef RT_LIBC_USING_FILEIO
|
||||
return getchar();
|
||||
#else
|
||||
char ch = 0;
|
||||
#ifdef RT_USING_POSIX
|
||||
if(read(STDIN_FILENO, &ch, 1) > 0)
|
||||
{
|
||||
return ch;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1; /* EOF */
|
||||
}
|
||||
#else
|
||||
rt_device_t device;
|
||||
|
||||
RT_ASSERT(shell != RT_NULL);
|
||||
|
@ -163,14 +170,14 @@ int finsh_getchar(void)
|
|||
rt_sem_take(&shell->rx_sem, RT_WAITING_FOREVER);
|
||||
|
||||
return ch;
|
||||
#endif /* RT_LIBC_USING_FILEIO */
|
||||
#endif /* RT_USING_POSIX */
|
||||
#else
|
||||
extern char rt_hw_console_getchar(void);
|
||||
return rt_hw_console_getchar();
|
||||
#endif /* RT_USING_DEVICE */
|
||||
}
|
||||
|
||||
#if !defined(RT_LIBC_USING_FILEIO) && defined(RT_USING_DEVICE)
|
||||
#if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE)
|
||||
static rt_err_t finsh_rx_ind(rt_device_t dev, rt_size_t size)
|
||||
{
|
||||
RT_ASSERT(shell != RT_NULL);
|
||||
|
@ -436,7 +443,7 @@ void finsh_thread_entry(void *parameter)
|
|||
shell->echo_mode = 0;
|
||||
#endif
|
||||
|
||||
#if !defined(RT_LIBC_USING_FILEIO) && defined(RT_USING_DEVICE)
|
||||
#if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE)
|
||||
/* set console device as shell device */
|
||||
if (shell->device == RT_NULL)
|
||||
{
|
||||
|
|
|
@ -78,7 +78,7 @@ struct finsh_shell
|
|||
rt_uint16_t line_position;
|
||||
rt_uint16_t line_curpos;
|
||||
|
||||
#if !defined(RT_LIBC_USING_FILEIO) && defined(RT_USING_DEVICE)
|
||||
#if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE)
|
||||
rt_device_t device;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue