init.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <assert.h>
  2. #include <priv-vars.h>
  3. #include <stdlib.h>
  4. #include <syscall.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <unistd.h>
  8. #include <list.h>
  9. FILE* stdout;
  10. FILE* stdin;
  11. FILE* stderr;
  12. list_head* __io_files_location(void)
  13. {
  14. static list_head __io_files;
  15. return &__io_files;
  16. }
  17. size_t* __environ_size_location(void)
  18. {
  19. static size_t __environ_size;
  20. return &__environ_size;
  21. }
  22. void __init_gblibc(int argc, char** argv, char** envp)
  23. {
  24. (void)argc, (void)argv;
  25. // initialize program break position and heap
  26. start_brk = curr_brk = (void*)syscall1(SYS_brk, (uint32_t)NULL);
  27. sbrk(128 * 1024);
  28. struct mem* first = start_brk;
  29. first->sz = 0;
  30. first->flag = 0;
  31. // save environ vector
  32. environ_size = 4;
  33. environ = malloc(environ_size * sizeof(char*));
  34. assert(environ);
  35. while (*envp) {
  36. char* eqp = strchr(*envp, '=');
  37. if (!eqp || eqp == *envp)
  38. goto next;
  39. *eqp = 0;
  40. char* value = eqp + 1;
  41. setenv(*envp, value, 1);
  42. next:;
  43. ++envp;
  44. }
  45. // stdout, stdin, stderr objects
  46. list_node* node = NULL;
  47. // stdout
  48. node = NEWNODE(FILE);
  49. stdout = &NDDATA(*node, FILE);
  50. memset(stdout, 0x00, sizeof(FILE));
  51. stdout->fd = STDOUT_FILENO;
  52. stdout->flags = FILE_WRITE;
  53. stdout->wbuf = malloc(BUFSIZ);
  54. stdout->wbsz = BUFSIZ;
  55. NDINSERT(&iofiles, node);
  56. // stdin
  57. node = NEWNODE(FILE);
  58. stdin = &NDDATA(*node, FILE);
  59. memset(stdin, 0x00, sizeof(FILE));
  60. stdin->fd = STDIN_FILENO;
  61. stdin->flags = FILE_READ;
  62. stdin->rbuf = malloc(BUFSIZ);
  63. stdin->rbsz = BUFSIZ;
  64. NDINSERT(&iofiles, node);
  65. // stderr
  66. node = NEWNODE(FILE);
  67. stderr = &NDDATA(*node, FILE);
  68. memset(stderr, 0x00, sizeof(FILE));
  69. stderr->fd = STDERR_FILENO;
  70. stderr->flags = FILE_WRITE;
  71. NDINSERT(&iofiles, node);
  72. }