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