stdio.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. }
  38. if (std_console) return fileno(std_console);
  39. return -1;
  40. }
  41. int libc_stdio_get_console(void) {
  42. if (std_console)
  43. return fileno(std_console);
  44. else
  45. return -1;
  46. }