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