diff options
| author | bernard <[email protected]> | 2017-10-15 22:41:59 +0800 |
|---|---|---|
| committer | bernard <[email protected]> | 2017-10-15 22:41:59 +0800 |
| commit | 5c7b16d00bdb536a694e6e31a2e0a1c33cb9dcb9 (patch) | |
| tree | 5da5e3404e1241b65e90089c4c370b40130df832 /components/libc/compilers/newlib/stdio.c | |
| parent | b27c7e482648535760e012cd6f1afef1d800e2d2 (diff) | |
[libc] Update libc.
1. Add POSIX termios implementation;
2. Add POSIX signals implementation;
3. Add stdio for each libc.
Diffstat (limited to 'components/libc/compilers/newlib/stdio.c')
| -rw-r--r-- | components/libc/compilers/newlib/stdio.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/components/libc/compilers/newlib/stdio.c b/components/libc/compilers/newlib/stdio.c new file mode 100644 index 0000000000..276e68050c --- /dev/null +++ b/components/libc/compilers/newlib/stdio.c @@ -0,0 +1,85 @@ +/* + * File : stdio.c + * Brief : stdio for newlib + * + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2017, RT-Thread Development Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#include <stdio.h> +#include <stdlib.h> + +#include <rtthread.h> +#include "libc.h" + +#define STDIO_DEVICE_NAME_MAX 32 + +static FILE* std_console = NULL; + +int libc_stdio_set_console(const char* device_name, int mode) +{ + FILE *fp; + char name[STDIO_DEVICE_NAME_MAX]; + char *file_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 if (mode == O_RDONLY) file_mode = "rb"; + + fp = fopen(name, file_mode); + if (fp) + { + setvbuf(fp, NULL, _IONBF, 0); + + if (std_console) + { + fclose(std_console); + std_console = NULL; + } + std_console = fp; + + if (mode == O_RDWR) + { + _GLOBAL_REENT->_stdin = std_console; + } + else + { + _GLOBAL_REENT->_stdin = NULL; + } + + if (mode == O_RDONLY) + { + _GLOBAL_REENT->_stdout = NULL; + _GLOBAL_REENT->_stderr = NULL; + } + else + { + _GLOBAL_REENT->_stdout = std_console; + _GLOBAL_REENT->_stderr = std_console; + } + + _GLOBAL_REENT->__sdidinit = 1; + } + + return fileno(std_console); +} |
