xref: /nrf52832-nimble/rt-thread/components/libc/compilers/newlib/stdio.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2017/10/15     bernard      the first version
9*10465441SEvalZero  */
10*10465441SEvalZero #include <stdio.h>
11*10465441SEvalZero #include <stdlib.h>
12*10465441SEvalZero 
13*10465441SEvalZero #include <rtthread.h>
14*10465441SEvalZero #include "libc.h"
15*10465441SEvalZero 
16*10465441SEvalZero #define STDIO_DEVICE_NAME_MAX   32
17*10465441SEvalZero 
18*10465441SEvalZero int	_EXFUN(fileno, (FILE *));
19*10465441SEvalZero 
20*10465441SEvalZero static FILE* std_console = NULL;
21*10465441SEvalZero 
libc_stdio_set_console(const char * device_name,int mode)22*10465441SEvalZero int libc_stdio_set_console(const char* device_name, int mode)
23*10465441SEvalZero {
24*10465441SEvalZero     FILE *fp;
25*10465441SEvalZero     char name[STDIO_DEVICE_NAME_MAX];
26*10465441SEvalZero     char *file_mode;
27*10465441SEvalZero 
28*10465441SEvalZero     snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
29*10465441SEvalZero     name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
30*10465441SEvalZero 
31*10465441SEvalZero     if (mode == O_RDWR) file_mode = "r+";
32*10465441SEvalZero     else if (mode == O_WRONLY) file_mode = "wb";
33*10465441SEvalZero     else file_mode = "rb";
34*10465441SEvalZero 
35*10465441SEvalZero     fp = fopen(name, file_mode);
36*10465441SEvalZero     if (fp)
37*10465441SEvalZero     {
38*10465441SEvalZero         setvbuf(fp, NULL, _IONBF, 0);
39*10465441SEvalZero 
40*10465441SEvalZero         if (std_console)
41*10465441SEvalZero         {
42*10465441SEvalZero             fclose(std_console);
43*10465441SEvalZero             std_console = NULL;
44*10465441SEvalZero         }
45*10465441SEvalZero         std_console = fp;
46*10465441SEvalZero 
47*10465441SEvalZero         if (mode == O_RDWR)
48*10465441SEvalZero         {
49*10465441SEvalZero             _GLOBAL_REENT->_stdin  = std_console;
50*10465441SEvalZero         }
51*10465441SEvalZero         else
52*10465441SEvalZero         {
53*10465441SEvalZero             _GLOBAL_REENT->_stdin  = NULL;
54*10465441SEvalZero         }
55*10465441SEvalZero 
56*10465441SEvalZero         if (mode == O_RDONLY)
57*10465441SEvalZero         {
58*10465441SEvalZero             _GLOBAL_REENT->_stdout = NULL;
59*10465441SEvalZero             _GLOBAL_REENT->_stderr = NULL;
60*10465441SEvalZero         }
61*10465441SEvalZero         else
62*10465441SEvalZero         {
63*10465441SEvalZero             _GLOBAL_REENT->_stdout = std_console;
64*10465441SEvalZero             _GLOBAL_REENT->_stderr = std_console;
65*10465441SEvalZero         }
66*10465441SEvalZero 
67*10465441SEvalZero         _GLOBAL_REENT->__sdidinit = 1;
68*10465441SEvalZero     }
69*10465441SEvalZero 
70*10465441SEvalZero     if (std_console) return fileno(std_console);
71*10465441SEvalZero 
72*10465441SEvalZero     return -1;
73*10465441SEvalZero }
74*10465441SEvalZero 
libc_stdio_get_console(void)75*10465441SEvalZero int libc_stdio_get_console(void) {
76*10465441SEvalZero     if (std_console)
77*10465441SEvalZero         return fileno(std_console);
78*10465441SEvalZero     else
79*10465441SEvalZero         return -1;
80*10465441SEvalZero }
81