stdio.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. #include "dfs.h"
  15. #define STDIO_DEVICE_NAME_MAX 32
  16. int _EXFUN(fileno, (FILE *));
  17. static FILE* std_console = NULL;
  18. int sys_dup2(int oldfd, int new);
  19. int libc_stdio_set_console(const char* device_name, int mode)
  20. {
  21. FILE *fp;
  22. char name[STDIO_DEVICE_NAME_MAX];
  23. char *file_mode;
  24. snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
  25. name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
  26. if (mode == O_RDWR) file_mode = "r+";
  27. else if (mode == O_WRONLY) file_mode = "wb";
  28. else file_mode = "rb";
  29. fp = fopen(name, file_mode);
  30. if (fp)
  31. {
  32. setvbuf(fp, NULL, _IONBF, 0);
  33. if (std_console)
  34. {
  35. fclose(std_console);
  36. std_console = NULL;
  37. }
  38. std_console = fp;
  39. }
  40. if (std_console)
  41. {
  42. int fd = fileno(std_console);
  43. /* set fd (0, 1, 2) */
  44. sys_dup2(fd, 0);
  45. sys_dup2(fd, 1);
  46. sys_dup2(fd, 2);
  47. return fd;
  48. }
  49. return -1;
  50. }
  51. int libc_stdio_get_console(void) {
  52. if (std_console)
  53. return fileno(std_console);
  54. else
  55. return -1;
  56. }