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
libc_stdio_set_console(const char * device_name,int mode)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
libc_stdio_get_console(void)75 int libc_stdio_get_console(void) {
76 if (std_console)
77 return fileno(std_console);
78 else
79 return -1;
80 }
81