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