stdio.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. #include <rtthread.h>
  13. #include "libc.h"
  14. #define STDIO_DEVICE_NAME_MAX 32
  15. int _EXFUN(fileno, (FILE *));
  16. static FILE* std_console = NULL;
  17. int libc_stdio_set_console(const char* device_name, int mode)
  18. {
  19. FILE *fp;
  20. char name[STDIO_DEVICE_NAME_MAX];
  21. char *file_mode;
  22. snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
  23. name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
  24. if (mode == O_RDWR) file_mode = "r+";
  25. else if (mode == O_WRONLY) file_mode = "wb";
  26. else file_mode = "rb";
  27. fp = fopen(name, file_mode);
  28. if (fp)
  29. {
  30. setvbuf(fp, NULL, _IONBF, 0);
  31. if (std_console)
  32. {
  33. fclose(std_console);
  34. std_console = NULL;
  35. }
  36. std_console = fp;
  37. if (mode == O_RDWR)
  38. {
  39. _GLOBAL_REENT->_stdin = std_console;
  40. }
  41. else
  42. {
  43. _GLOBAL_REENT->_stdin = NULL;
  44. }
  45. if (mode == O_RDONLY)
  46. {
  47. _GLOBAL_REENT->_stdout = NULL;
  48. _GLOBAL_REENT->_stderr = NULL;
  49. }
  50. else
  51. {
  52. _GLOBAL_REENT->_stdout = std_console;
  53. _GLOBAL_REENT->_stderr = std_console;
  54. }
  55. _GLOBAL_REENT->__sdidinit = 1;
  56. }
  57. if (std_console) return fileno(std_console);
  58. return -1;
  59. }
  60. int libc_stdio_get_console(void) {
  61. if (std_console)
  62. return fileno(std_console);
  63. else
  64. return -1;
  65. }