fcntl.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, sin-ack <sin-ack@protonmail.com>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <errno.h>
  8. #include <fcntl.h>
  9. #include <stdarg.h>
  10. #include <string.h>
  11. #include <syscall.h>
  12. extern "C" {
  13. int fcntl(int fd, int cmd, ...)
  14. {
  15. va_list ap;
  16. va_start(ap, cmd);
  17. u32 extra_arg = va_arg(ap, u32);
  18. int rc = syscall(SC_fcntl, fd, cmd, extra_arg);
  19. va_end(ap);
  20. __RETURN_WITH_ERRNO(rc, rc, -1);
  21. }
  22. int create_inode_watcher(unsigned flags)
  23. {
  24. int rc = syscall(SC_create_inode_watcher, flags);
  25. __RETURN_WITH_ERRNO(rc, rc, -1);
  26. }
  27. int inode_watcher_add_watch(int fd, const char* path, size_t path_length, unsigned event_mask)
  28. {
  29. Syscall::SC_inode_watcher_add_watch_params params { fd, { path, path_length }, event_mask };
  30. int rc = syscall(SC_inode_watcher_add_watch, &params);
  31. __RETURN_WITH_ERRNO(rc, rc, -1);
  32. }
  33. int inode_watcher_remove_watch(int fd, int wd)
  34. {
  35. int rc = syscall(SC_inode_watcher_remove_watch, fd, wd);
  36. __RETURN_WITH_ERRNO(rc, rc, -1);
  37. }
  38. int creat(const char* path, mode_t mode)
  39. {
  40. return open(path, O_CREAT | O_WRONLY | O_TRUNC, mode);
  41. }
  42. int open(const char* path, int options, ...)
  43. {
  44. if (!path) {
  45. errno = EFAULT;
  46. return -1;
  47. }
  48. auto path_length = strlen(path);
  49. if (path_length > INT32_MAX) {
  50. errno = EINVAL;
  51. return -1;
  52. }
  53. va_list ap;
  54. va_start(ap, options);
  55. auto mode = (mode_t)va_arg(ap, unsigned);
  56. va_end(ap);
  57. Syscall::SC_open_params params { AT_FDCWD, { path, path_length }, options, mode };
  58. int rc = syscall(SC_open, &params);
  59. __RETURN_WITH_ERRNO(rc, rc, -1);
  60. }
  61. int openat(int dirfd, const char* path, int options, ...)
  62. {
  63. if (!path) {
  64. errno = EFAULT;
  65. return -1;
  66. }
  67. auto path_length = strlen(path);
  68. if (path_length > INT32_MAX) {
  69. errno = EINVAL;
  70. return -1;
  71. }
  72. va_list ap;
  73. va_start(ap, options);
  74. auto mode = (mode_t)va_arg(ap, unsigned);
  75. va_end(ap);
  76. Syscall::SC_open_params params { dirfd, { path, path_length }, options, mode };
  77. int rc = syscall(SC_open, &params);
  78. __RETURN_WITH_ERRNO(rc, rc, -1);
  79. }
  80. }