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
|
#ifdef RT_USING_FINSH
|
||||||
/* init finsh */
|
/* init finsh */
|
||||||
finsh_system_init();
|
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");
|
finsh_set_device("uart1");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
#include <lwp.h>
|
#include <lwp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RT_LIBC_USING_FILEIO
|
#ifdef RT_USING_POSIX
|
||||||
#include <libc.h>
|
#include <libc.h>
|
||||||
#endif
|
#endif /* RT_USING_POSIX */
|
||||||
|
|
||||||
/* Global variables */
|
/* Global variables */
|
||||||
const struct dfs_filesystem_ops *filesystem_operation_table[DFS_FILESYSTEM_TYPES_MAX];
|
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_fd *d;
|
||||||
struct dfs_fdtable *fdt;
|
struct dfs_fdtable *fdt;
|
||||||
|
|
||||||
#ifdef RT_LIBC_USING_FILEIO
|
#ifdef RT_USING_POSIX
|
||||||
if ((0 <= fd) && (fd <= 2))
|
if ((0 <= fd) && (fd <= 2))
|
||||||
fd = libc_stdio_get_console();
|
fd = libc_stdio_get_console();
|
||||||
#endif
|
#endif /* RT_USING_POSIX */
|
||||||
|
|
||||||
fdt = dfs_fdtable_get();
|
fdt = dfs_fdtable_get();
|
||||||
fd = fd - DFS_FD_OFFSET;
|
fd = fd - DFS_FD_OFFSET;
|
||||||
|
|
|
@ -145,10 +145,17 @@ void finsh_set_prompt_mode(rt_uint32_t prompt_mode)
|
||||||
int finsh_getchar(void)
|
int finsh_getchar(void)
|
||||||
{
|
{
|
||||||
#ifdef RT_USING_DEVICE
|
#ifdef RT_USING_DEVICE
|
||||||
#ifdef RT_LIBC_USING_FILEIO
|
|
||||||
return getchar();
|
|
||||||
#else
|
|
||||||
char ch = 0;
|
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_device_t device;
|
||||||
|
|
||||||
RT_ASSERT(shell != RT_NULL);
|
RT_ASSERT(shell != RT_NULL);
|
||||||
|
@ -163,14 +170,14 @@ int finsh_getchar(void)
|
||||||
rt_sem_take(&shell->rx_sem, RT_WAITING_FOREVER);
|
rt_sem_take(&shell->rx_sem, RT_WAITING_FOREVER);
|
||||||
|
|
||||||
return ch;
|
return ch;
|
||||||
#endif /* RT_LIBC_USING_FILEIO */
|
#endif /* RT_USING_POSIX */
|
||||||
#else
|
#else
|
||||||
extern char rt_hw_console_getchar(void);
|
extern char rt_hw_console_getchar(void);
|
||||||
return rt_hw_console_getchar();
|
return rt_hw_console_getchar();
|
||||||
#endif /* RT_USING_DEVICE */
|
#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)
|
static rt_err_t finsh_rx_ind(rt_device_t dev, rt_size_t size)
|
||||||
{
|
{
|
||||||
RT_ASSERT(shell != RT_NULL);
|
RT_ASSERT(shell != RT_NULL);
|
||||||
|
@ -436,7 +443,7 @@ void finsh_thread_entry(void *parameter)
|
||||||
shell->echo_mode = 0;
|
shell->echo_mode = 0;
|
||||||
#endif
|
#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 */
|
/* set console device as shell device */
|
||||||
if (shell->device == RT_NULL)
|
if (shell->device == RT_NULL)
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,7 +78,7 @@ struct finsh_shell
|
||||||
rt_uint16_t line_position;
|
rt_uint16_t line_position;
|
||||||
rt_uint16_t line_curpos;
|
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;
|
rt_device_t device;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
int libc_system_init(void)
|
int libc_system_init(void)
|
||||||
{
|
{
|
||||||
#ifdef RT_LIBC_USING_FILEIO
|
#ifdef RT_USING_POSIX
|
||||||
rt_device_t dev_console;
|
rt_device_t dev_console;
|
||||||
|
|
||||||
dev_console = rt_console_get_device();
|
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);
|
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
|
#if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT
|
||||||
pthread_system_init();
|
pthread_system_init();
|
||||||
|
|
|
@ -15,10 +15,10 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int libc_system_init(void);
|
int libc_system_init(void);
|
||||||
#ifdef RT_LIBC_USING_FILEIO
|
#ifdef RT_USING_POSIX
|
||||||
int libc_stdio_get_console(void);
|
int libc_stdio_get_console(void);
|
||||||
int libc_stdio_set_console(const char* device_name, int mode);
|
int libc_stdio_set_console(const char* device_name, int mode);
|
||||||
#endif /* RT_LIBC_USING_FILEIO */
|
#endif /* RT_USING_POSIX */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,15 +8,15 @@
|
||||||
* 2017/10/15 bernard the first version
|
* 2017/10/15 bernard the first version
|
||||||
*/
|
*/
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
|
||||||
#ifdef RT_LIBC_USING_FILEIO
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include "libc.h"
|
#include "libc.h"
|
||||||
|
|
||||||
#define STDIO_DEVICE_NAME_MAX 32
|
#define STDIO_DEVICE_NAME_MAX 32
|
||||||
|
|
||||||
|
#ifdef RT_LIBC_USING_FILEIO
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
static FILE* std_console = NULL;
|
static FILE* std_console = NULL;
|
||||||
|
|
||||||
int libc_stdio_set_console(const char* device_name, int mode)
|
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);
|
snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
|
||||||
name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
|
name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
|
||||||
|
|
||||||
if (mode == O_RDWR) file_mode = "r+";
|
if (mode == O_RDWR)
|
||||||
else if (mode == O_WRONLY) file_mode = "wb";
|
{
|
||||||
else file_mode = "rb";
|
file_mode = "r+";
|
||||||
|
}
|
||||||
|
else if (mode == O_WRONLY)
|
||||||
|
{
|
||||||
|
file_mode = "wb";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
file_mode = "rb";
|
||||||
|
}
|
||||||
|
|
||||||
fp = fopen(name, file_mode);
|
fp = fopen(name, file_mode);
|
||||||
if (fp)
|
if (fp)
|
||||||
|
@ -80,4 +89,34 @@ int libc_stdio_get_console(void)
|
||||||
return -1;
|
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 */
|
#endif /* RT_LIBC_USING_FILEIO */
|
||||||
|
|
Loading…
Reference in New Issue