fcntl.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. return openat_with_path_length(AT_FDCWD, path, path_length, options, mode);
  31. }
  32. int openat_with_path_length(int dirfd, const char* path, size_t path_length, int options, mode_t mode)
  33. {
  34. if (!path) {
  35. errno = EFAULT;
  36. return -1;
  37. }
  38. if (path_length > INT32_MAX) {
  39. errno = EINVAL;
  40. return -1;
  41. }
  42. Syscall::SC_open_params params { dirfd, { path, path_length }, options, mode };
  43. int rc = syscall(SC_open, &params);
  44. __RETURN_WITH_ERRNO(rc, rc, -1);
  45. }
  46. int open(const char* path, int options, ...)
  47. {
  48. if (!path) {
  49. errno = EFAULT;
  50. return -1;
  51. }
  52. va_list ap;
  53. va_start(ap, options);
  54. auto mode = (mode_t)va_arg(ap, unsigned);
  55. va_end(ap);
  56. return open_with_path_length(path, strlen(path), options, mode);
  57. }
  58. int openat(int dirfd, const char* path, int options, ...)
  59. {
  60. if (!path) {
  61. errno = EFAULT;
  62. return -1;
  63. }
  64. va_list ap;
  65. va_start(ap, options);
  66. auto mode = (mode_t)va_arg(ap, unsigned);
  67. va_end(ap);
  68. return openat_with_path_length(dirfd, path, strlen(path), options, mode);
  69. }
  70. }