diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2020-01-17 21:48:44 +0300 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2020-01-17 21:49:58 +0100 |
commit | e0013a6b4c4a006617d2c0ef09e25720892fee3d (patch) | |
tree | d6da8453d920c252251f728c06dafd3a94790352 | |
parent | d6184afcaeb260f76e8b27a7931f609f822b7d1f (diff) | |
download | serenity-e0013a6b4c4a006617d2c0ef09e25720892fee3d.zip |
Kernel+LibC: Unify sys$open() and sys$openat()
The syscall is now called sys$open(), but it behaves like the old sys$openat().
In userspace, open_with_path_length() is made a wrapper over openat_with_path_length().
-rw-r--r-- | Kernel/Process.cpp | 46 | ||||
-rw-r--r-- | Kernel/Process.h | 1 | ||||
-rw-r--r-- | Kernel/Syscall.h | 7 | ||||
-rw-r--r-- | Libraries/LibC/fcntl.cpp | 16 |
4 files changed, 4 insertions, 66 deletions
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index c4a6ffaeba..e10d5405e2 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1862,50 +1862,6 @@ int Process::sys$open(const Syscall::SC_open_params* user_params) if (!validate_read_and_copy_typed(¶ms, user_params)) return -EFAULT; - auto options = params.options; - auto mode = params.mode; - - if (options & O_NOFOLLOW_NOERROR) - return -EINVAL; - - if ((options & O_RDWR) || (options & O_WRONLY)) - REQUIRE_PROMISE(wpath); - else - REQUIRE_PROMISE(rpath); - - if (options & O_CREAT) - REQUIRE_PROMISE(cpath); - - auto path = get_syscall_path_argument(params.path); - if (path.is_error()) - return path.error(); - - // Ignore everything except permission bits. - mode &= 04777; - - int fd = alloc_fd(); -#ifdef DEBUG_IO - dbgprintf("%s(%u) sys$open(\"%s\") -> %d\n", name().characters(), pid(), path.value().characters(), fd); -#endif - if (fd < 0) - return fd; - auto result = VFS::the().open(path.value(), options, mode & ~umask(), current_directory()); - if (result.is_error()) - return result.error(); - auto description = result.value(); - description->set_rw_mode(options); - description->set_file_flags(options); - u32 fd_flags = (options & O_CLOEXEC) ? FD_CLOEXEC : 0; - m_fds[fd].set(move(description), fd_flags); - return fd; -} - -int Process::sys$openat(const Syscall::SC_openat_params* user_params) -{ - Syscall::SC_openat_params params; - if (!validate_read_and_copy_typed(¶ms, user_params)) - return -EFAULT; - int dirfd = params.dirfd; int options = params.options; u16 mode = params.mode; @@ -1928,7 +1884,7 @@ int Process::sys$openat(const Syscall::SC_openat_params* user_params) if (path.is_error()) return path.error(); #ifdef DEBUG_IO - dbgprintf("%s(%u) sys$openat(%d, \"%s\")\n", dirfd, name().characters(), pid(), path.value().characters()); + dbgprintf("%s(%u) sys$open(%d, \"%s\")\n", dirfd, name().characters(), pid(), path.value().characters()); #endif int fd = alloc_fd(); if (fd < 0) diff --git a/Kernel/Process.h b/Kernel/Process.h index 657fef17c8..9cd732c9e0 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -145,7 +145,6 @@ public: pid_t sys$getppid(); mode_t sys$umask(mode_t); int sys$open(const Syscall::SC_open_params*); - int sys$openat(const Syscall::SC_openat_params*); int sys$close(int fd); ssize_t sys$read(int fd, u8*, ssize_t); ssize_t sys$write(int fd, const u8*, ssize_t); diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index 6a65ed564e..0e4064dcce 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -132,7 +132,6 @@ typedef u32 socklen_t; __ENUMERATE_SYSCALL(setkeymap) \ __ENUMERATE_SYSCALL(clock_gettime) \ __ENUMERATE_SYSCALL(clock_nanosleep) \ - __ENUMERATE_SYSCALL(openat) \ __ENUMERATE_SYSCALL(join_thread) \ __ENUMERATE_SYSCALL(module_load) \ __ENUMERATE_SYSCALL(module_unload) \ @@ -218,12 +217,6 @@ struct SC_mmap_params { }; struct SC_open_params { - StringArgument path; - int options; - u16 mode; -}; - -struct SC_openat_params { int dirfd; StringArgument path; int options; diff --git a/Libraries/LibC/fcntl.cpp b/Libraries/LibC/fcntl.cpp index a144105e84..7033bd3def 100644 --- a/Libraries/LibC/fcntl.cpp +++ b/Libraries/LibC/fcntl.cpp @@ -33,17 +33,7 @@ int creat_with_path_length(const char* path, size_t path_length, mode_t mode) int open_with_path_length(const char* path, size_t path_length, int options, mode_t mode) { - if (!path) { - errno = EFAULT; - return -1; - } - if (path_length > INT32_MAX) { - errno = EINVAL; - return -1; - } - Syscall::SC_open_params params { { path, path_length }, options, mode }; - int rc = syscall(SC_open, ¶ms); - __RETURN_WITH_ERRNO(rc, rc, -1); + return openat_with_path_length(AT_FDCWD, path, path_length, options, mode); } int openat_with_path_length(int dirfd, const char* path, size_t path_length, int options, mode_t mode) @@ -56,8 +46,8 @@ int openat_with_path_length(int dirfd, const char* path, size_t path_length, int errno = EINVAL; return -1; } - Syscall::SC_openat_params params { dirfd, { path, path_length }, options, mode }; - int rc = syscall(SC_openat, ¶ms); + Syscall::SC_open_params params { dirfd, { path, path_length }, options, mode }; + int rc = syscall(SC_open, ¶ms); __RETURN_WITH_ERRNO(rc, rc, -1); } |