fcntl.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <Kernel/Syscall.h>
  2. #include <errno.h>
  3. #include <fcntl.h>
  4. #include <stdarg.h>
  5. #include <string.h>
  6. extern "C" {
  7. int fcntl(int fd, int cmd, ...)
  8. {
  9. va_list ap;
  10. va_start(ap, cmd);
  11. u32 extra_arg = va_arg(ap, u32);
  12. int rc = syscall(SC_fcntl, fd, cmd, extra_arg);
  13. __RETURN_WITH_ERRNO(rc, rc, -1);
  14. }
  15. int watch_file(const char* path, size_t path_length)
  16. {
  17. int rc = syscall(SC_watch_file, path, path_length);
  18. __RETURN_WITH_ERRNO(rc, rc, -1);
  19. }
  20. int creat(const char* path, mode_t mode)
  21. {
  22. return open(path, O_CREAT | O_WRONLY | O_TRUNC, mode);
  23. }
  24. int creat_with_path_length(const char* path, size_t path_length, mode_t mode)
  25. {
  26. return open_with_path_length(path, path_length, O_CREAT | O_WRONLY | O_TRUNC, mode);
  27. }
  28. int open_with_path_length(const char* path, size_t path_length, int options, mode_t mode)
  29. {
  30. if (!path) {
  31. errno = EFAULT;
  32. return -1;
  33. }
  34. if (path_length > INT32_MAX) {
  35. errno = EINVAL;
  36. return -1;
  37. }
  38. Syscall::SC_open_params params { { path, path_length }, options, mode };
  39. int rc = syscall(SC_open, &params);
  40. __RETURN_WITH_ERRNO(rc, rc, -1);
  41. }
  42. int openat_with_path_length(int dirfd, const char* path, size_t path_length, int options, mode_t mode)
  43. {
  44. if (!path) {
  45. errno = EFAULT;
  46. return -1;
  47. }
  48. if (path_length > INT32_MAX) {
  49. errno = EINVAL;
  50. return -1;
  51. }
  52. Syscall::SC_openat_params params { dirfd, { path, path_length }, options, mode };
  53. int rc = syscall(SC_openat, &params);
  54. __RETURN_WITH_ERRNO(rc, rc, -1);
  55. }
  56. int open(const char* path, int options, ...)
  57. {
  58. if (!path) {
  59. errno = EFAULT;
  60. return -1;
  61. }
  62. va_list ap;
  63. va_start(ap, options);
  64. auto mode = (mode_t)va_arg(ap, unsigned);
  65. va_end(ap);
  66. return open_with_path_length(path, strlen(path), options, mode);
  67. }
  68. int openat(int dirfd, const char* path, int options, ...)
  69. {
  70. if (!path) {
  71. errno = EFAULT;
  72. return -1;
  73. }
  74. va_list ap;
  75. va_start(ap, options);
  76. auto mode = (mode_t)va_arg(ap, unsigned);
  77. va_end(ap);
  78. return openat_with_path_length(dirfd, path, strlen(path), options, mode);
  79. }
  80. }