init.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "basic-lib.h"
  2. static inline char tc(int n) {
  3. return '0' + n;
  4. }
  5. void print_int(int n) {
  6. char buf[12];
  7. int len = 0;
  8. while (n) {
  9. int dig = n % 10;
  10. buf[len++] = tc(dig);
  11. n /= 10;
  12. }
  13. write(0, buf, len);
  14. }
  15. size_t strlen(const char* str)
  16. {
  17. const char* p = str;
  18. while (*p)
  19. ++p;
  20. return p - str;
  21. }
  22. static inline void print(const char* str)
  23. {
  24. write(0, str, strlen(str));
  25. }
  26. int main(int argc, char** argv)
  27. {
  28. for (int i = 0; i < argc; ++i)
  29. write(0, argv[i], 0);
  30. print("Hello World from user space init\n");
  31. int ret = fork();
  32. if (ret == 0) {
  33. print("child\n");
  34. exit(255);
  35. } else {
  36. print("parent\n");
  37. }
  38. char buf[128] = {};
  39. const char* path = "/dev";
  40. print("content in ");
  41. print(path);
  42. print(":\n");
  43. int dir = open(path, O_RDONLY | O_DIRECTORY);
  44. if (dir >= 0) {
  45. for (;;) {
  46. int n = getdents(dir, (struct user_dirent*)buf, 128);
  47. if (n < 0)
  48. print("error\n");
  49. if (n <= 0)
  50. break;
  51. int bpos = 0;
  52. for (; bpos < n;) {
  53. struct user_dirent* dirp = (struct user_dirent*)(buf + bpos);
  54. print("ino: ");
  55. print_int(dirp->d_ino);
  56. print(", filename: \"");
  57. print(dirp->d_name);
  58. print("\", filetype: ");
  59. switch (buf[bpos + dirp->d_reclen - 1]) {
  60. case DT_REG:
  61. print("regular file");
  62. break;
  63. case DT_DIR:
  64. print("directory");
  65. break;
  66. case DT_BLK:
  67. print("block device");
  68. break;
  69. default:
  70. print("unknown");
  71. break;
  72. }
  73. print("\n");
  74. bpos += dirp->d_reclen;
  75. }
  76. }
  77. }
  78. for (;;) {
  79. int n = read(0, buf, 128);
  80. if (n)
  81. write(0, buf, n);
  82. else
  83. print("fuck!\n");
  84. if (buf[0] == 'e' && buf[1] == 'x' && buf[2] == 'i' && buf[3] == 't') {
  85. print("\nexited echo mode!\n");
  86. break;
  87. }
  88. }
  89. for (;;) {
  90. int ret;
  91. pid_t pid = wait(&ret);
  92. print("ret: ");
  93. print_int(ret);
  94. print(", pid: ");
  95. print_int(pid);
  96. print("\n");
  97. }
  98. return 0;
  99. }