unistd.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include <errno.h>
  2. #include <stdarg.h>
  3. #include <stdint.h>
  4. #include <sys/ioctl.h>
  5. #include <unistd.h>
  6. #include <syscall.h>
  7. ssize_t read(int fd, void* buf, size_t count)
  8. {
  9. ssize_t ret = syscall3(SYS_read, fd, (uint32_t)buf, count);
  10. if (ret < 0) {
  11. errno = -ret;
  12. return -1;
  13. }
  14. return ret;
  15. }
  16. ssize_t write(int fd, const void* buf, size_t count)
  17. {
  18. ssize_t ret = syscall3(SYS_write, fd, (uint32_t)buf, count);
  19. if (ret < 0) {
  20. errno = -ret;
  21. return -1;
  22. }
  23. return ret;
  24. }
  25. int dup(int oldfd)
  26. {
  27. int ret = syscall1(SYS_dup, oldfd);
  28. if (ret < 0) {
  29. errno = -ret;
  30. return -1;
  31. }
  32. return ret;
  33. }
  34. int dup2(int oldfd, int newfd)
  35. {
  36. int ret = syscall2(SYS_dup2, oldfd, newfd);
  37. if (ret < 0) {
  38. errno = -ret;
  39. return -1;
  40. }
  41. return ret;
  42. }
  43. int pipe(int pipefd[2])
  44. {
  45. int ret = syscall1(SYS_pipe, (uint32_t)pipefd);
  46. if (ret < 0) {
  47. errno = -ret;
  48. return -1;
  49. }
  50. return ret;
  51. }
  52. int close(int fd)
  53. {
  54. int ret = syscall1(SYS_close, fd);
  55. if (ret < 0) {
  56. errno = -ret;
  57. return -1;
  58. }
  59. return ret;
  60. }
  61. _Noreturn void _exit(int code)
  62. {
  63. (void)syscall1(SYS_exit, code);
  64. // if syscall failed
  65. for (;;);
  66. }
  67. pid_t fork(void)
  68. {
  69. pid_t ret = syscall0(SYS_fork);
  70. if (ret < 0) {
  71. errno = -ret;
  72. return -1;
  73. }
  74. return ret;
  75. }
  76. int execve(const char* pathname, char* const argv[], char* const envp[])
  77. {
  78. int ret = syscall3(SYS_execve, (uint32_t)pathname, (uint32_t)argv, (uint32_t)envp);
  79. if (ret < 0) {
  80. errno = -ret;
  81. return -1;
  82. }
  83. return ret;
  84. }
  85. unsigned int sleep(unsigned int seconds)
  86. {
  87. return syscall1(SYS_sleep, seconds);
  88. }
  89. int chdir(const char* path)
  90. {
  91. int ret = syscall1(SYS_chdir, (uint32_t)path);
  92. if (ret < 0) {
  93. errno = -ret;
  94. return -1;
  95. }
  96. return ret;
  97. }
  98. char* getcwd(char* buf, size_t bufsize)
  99. {
  100. int ret = syscall2(SYS_getcwd, (uint32_t)buf, bufsize);
  101. if (ret < 0) {
  102. errno = -ret;
  103. return NULL;
  104. }
  105. return buf;
  106. }
  107. pid_t getpid(void)
  108. {
  109. pid_t ret = syscall0(SYS_getpid);
  110. if (ret < 0) {
  111. errno = -ret;
  112. return -1;
  113. }
  114. return ret;
  115. }
  116. pid_t getppid(void)
  117. {
  118. pid_t ret = syscall0(SYS_getppid);
  119. if (ret < 0) {
  120. errno = -ret;
  121. return -1;
  122. }
  123. return ret;
  124. }
  125. int setpgid(pid_t pid, pid_t pgid)
  126. {
  127. int ret = syscall2(SYS_setpgid, pid, pgid);
  128. if (ret < 0) {
  129. errno = -ret;
  130. return -1;
  131. }
  132. return ret;
  133. }
  134. pid_t setsid(void)
  135. {
  136. pid_t ret = syscall0(SYS_setsid);
  137. if (ret < 0) {
  138. errno = -ret;
  139. return -1;
  140. }
  141. return ret;
  142. }
  143. pid_t getsid(pid_t pid)
  144. {
  145. pid_t ret = syscall1(SYS_getsid, pid);
  146. if (ret < 0) {
  147. errno = -ret;
  148. return -1;
  149. }
  150. return ret;
  151. }
  152. pid_t tcgetpgrp(int fd)
  153. {
  154. pid_t pgrp;
  155. return ioctl(fd, TIOCGPGRP, &pgrp);
  156. }
  157. int tcsetpgrp(int fd, pid_t pgrp)
  158. {
  159. return ioctl(fd, TIOCSPGRP, &pgrp);
  160. }
  161. int ioctl(int fd, unsigned long request, ...)
  162. {
  163. int ret = -EINVAL;
  164. va_list args;
  165. va_start(args, request);
  166. switch (request) {
  167. case TIOCGPGRP:
  168. ret = syscall3(SYS_ioctl, fd, request, va_arg(args, uint32_t));
  169. break;
  170. case TIOCSPGRP:
  171. ret = syscall3(SYS_ioctl, fd, request, va_arg(args, uint32_t));
  172. break;
  173. default:
  174. break;
  175. }
  176. va_end(args);
  177. if (ret < 0) {
  178. errno = -ret;
  179. return -1;
  180. }
  181. return ret;
  182. }