stdio.c 1.6 KB

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