mirror of
				https://github.com/LadybirdBrowser/ladybird.git
				synced 2025-10-31 21:30:58 +00:00 
			
		
		
		
	AK+LibCore: Avoid double-negation of syscall error values
This is a remnant from SerenityOS. Let's avoid confusion as to why we negate errno when we call Error::from_syscall just to negate it again when we store the error code.
This commit is contained in:
		
							parent
							
								
									24ac5e2eee
								
							
						
					
					
						commit
						dceed08058
					
				
				
				Notes:
				
					github-actions[bot]
				
				2025-05-11 01:21:05 +00:00 
				
			
			Author: https://github.com/trflynn89
Commit: dceed08058
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4689
			
					 7 changed files with 100 additions and 100 deletions
				
			
		|  | @ -36,9 +36,9 @@ public: | ||||||
|     static Error from_windows_error(); |     static Error from_windows_error(); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     static Error from_syscall(StringView syscall_name, int rc) |     static Error from_syscall(StringView syscall_name, int code) | ||||||
|     { |     { | ||||||
|         return Error(syscall_name, rc); |         return Error(syscall_name, code); | ||||||
|     } |     } | ||||||
|     static Error from_string_view(StringView string_literal) { return Error(string_literal); } |     static Error from_string_view(StringView string_literal) { return Error(string_literal); } | ||||||
| 
 | 
 | ||||||
|  | @ -113,9 +113,9 @@ private: | ||||||
|     { |     { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Error(StringView syscall_name, int rc) |     Error(StringView syscall_name, int code) | ||||||
|         : m_string_literal(syscall_name) |         : m_string_literal(syscall_name) | ||||||
|         , m_code(-rc) |         , m_code(code) | ||||||
|         , m_kind(Kind::Syscall) |         , m_kind(Kind::Syscall) | ||||||
|     { |     { | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -33,7 +33,7 @@ Directory::~Directory() | ||||||
| ErrorOr<void> Directory::chown(uid_t uid, gid_t gid) | ErrorOr<void> Directory::chown(uid_t uid, gid_t gid) | ||||||
| { | { | ||||||
|     if (m_directory_fd == -1) |     if (m_directory_fd == -1) | ||||||
|         return Error::from_syscall("fchown"sv, -EBADF); |         return Error::from_syscall("fchown"sv, EBADF); | ||||||
|     TRY(Core::System::fchown(m_directory_fd, uid, gid)); |     TRY(Core::System::fchown(m_directory_fd, uid, gid)); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -120,7 +120,7 @@ ErrorOr<NonnullOwnPtr<LocalSocket>> LocalServer::accept() | ||||||
|     int accepted_fd = ::accept(m_fd, (sockaddr*)&un, &un_size); |     int accepted_fd = ::accept(m_fd, (sockaddr*)&un, &un_size); | ||||||
| #endif | #endif | ||||||
|     if (accepted_fd < 0) { |     if (accepted_fd < 0) { | ||||||
|         return Error::from_syscall("accept"sv, -errno); |         return Error::from_syscall("accept"sv, errno); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #if defined(AK_OS_MACOS) || defined(AK_OS_IOS) || defined(AK_OS_HAIKU) | #if defined(AK_OS_MACOS) || defined(AK_OS_IOS) || defined(AK_OS_HAIKU) | ||||||
|  |  | ||||||
|  | @ -182,7 +182,7 @@ ErrorOr<String> Process::get_name() | ||||||
|     char buffer[BUFSIZ]; |     char buffer[BUFSIZ]; | ||||||
|     int rc = get_process_name(buffer, BUFSIZ); |     int rc = get_process_name(buffer, BUFSIZ); | ||||||
|     if (rc != 0) |     if (rc != 0) | ||||||
|         return Error::from_syscall("get_process_name"sv, -rc); |         return Error::from_syscall("get_process_name"sv, rc); | ||||||
|     return String::from_utf8(StringView { buffer, strlen(buffer) }); |     return String::from_utf8(StringView { buffer, strlen(buffer) }); | ||||||
| #elif defined(AK_LIBC_GLIBC) || (defined(AK_OS_LINUX) && !defined(AK_OS_ANDROID)) | #elif defined(AK_LIBC_GLIBC) || (defined(AK_OS_LINUX) && !defined(AK_OS_ANDROID)) | ||||||
|     return String::from_utf8(StringView { program_invocation_name, strlen(program_invocation_name) }); |     return String::from_utf8(StringView { program_invocation_name, strlen(program_invocation_name) }); | ||||||
|  | @ -200,13 +200,13 @@ ErrorOr<void> Process::set_name([[maybe_unused]] StringView name, [[maybe_unused | ||||||
| #if defined(AK_OS_SERENITY) | #if defined(AK_OS_SERENITY) | ||||||
|     int rc = set_process_name(name.characters_without_null_termination(), name.length()); |     int rc = set_process_name(name.characters_without_null_termination(), name.length()); | ||||||
|     if (rc != 0) |     if (rc != 0) | ||||||
|         return Error::from_syscall("set_process_name"sv, -rc); |         return Error::from_syscall("set_process_name"sv, rc); | ||||||
|     if (set_thread_name == SetThreadName::No) |     if (set_thread_name == SetThreadName::No) | ||||||
|         return {}; |         return {}; | ||||||
| 
 | 
 | ||||||
|     rc = prctl(PR_SET_THREAD_NAME, gettid(), name.characters_without_null_termination(), name.length()); |     rc = prctl(PR_SET_THREAD_NAME, gettid(), name.characters_without_null_termination(), name.length()); | ||||||
|     if (rc != 0) |     if (rc != 0) | ||||||
|         return Error::from_syscall("set_thread_name"sv, -rc); |         return Error::from_syscall("set_thread_name"sv, rc); | ||||||
|     return {}; |     return {}; | ||||||
| #else | #else | ||||||
|     // FIXME: Implement Process::set_name() for other platforms.
 |     // FIXME: Implement Process::set_name() for other platforms.
 | ||||||
|  | @ -232,7 +232,7 @@ ErrorOr<bool> Process::is_being_debugged() | ||||||
| #elif defined(AK_OS_GNU_HURD) | #elif defined(AK_OS_GNU_HURD) | ||||||
|     process_t proc = getproc(); |     process_t proc = getproc(); | ||||||
|     if (!MACH_PORT_VALID(proc)) |     if (!MACH_PORT_VALID(proc)) | ||||||
|         return Error::from_syscall("getproc"sv, -errno); |         return Error::from_syscall("getproc"sv, errno); | ||||||
| 
 | 
 | ||||||
|     int flags = PI_FETCH_TASKINFO; |     int flags = PI_FETCH_TASKINFO; | ||||||
|     // We're going to ask the proc server for the info about our process,
 |     // We're going to ask the proc server for the info about our process,
 | ||||||
|  | @ -253,7 +253,7 @@ ErrorOr<bool> Process::is_being_debugged() | ||||||
|     mach_port_deallocate(mach_task_self(), proc); |     mach_port_deallocate(mach_task_self(), proc); | ||||||
|     if (err) { |     if (err) { | ||||||
|         __hurd_fail(static_cast<error_t>(err)); |         __hurd_fail(static_cast<error_t>(err)); | ||||||
|         return Error::from_syscall("proc_getprocinfo"sv, -errno); |         return Error::from_syscall("proc_getprocinfo"sv, errno); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Now cast the returned buffer pointer back to struct procinfo, and
 |     // Now cast the returned buffer pointer back to struct procinfo, and
 | ||||||
|  | @ -284,7 +284,7 @@ ErrorOr<bool> Process::is_being_debugged() | ||||||
|     mib[3] = getpid(); |     mib[3] = getpid(); | ||||||
| 
 | 
 | ||||||
|     if (sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) < 0) |     if (sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) < 0) | ||||||
|         return Error::from_syscall("sysctl"sv, -errno); |         return Error::from_syscall("sysctl"sv, errno); | ||||||
| 
 | 
 | ||||||
|     // We're being debugged if the P_TRACED flag is set.
 |     // We're being debugged if the P_TRACED flag is set.
 | ||||||
| #    if defined(AK_OS_MACOS) | #    if defined(AK_OS_MACOS) | ||||||
|  | @ -346,7 +346,7 @@ ErrorOr<int> Process::wait_for_termination() | ||||||
|     int exit_code = -1; |     int exit_code = -1; | ||||||
|     int status; |     int status; | ||||||
|     if (waitpid(m_pid, &status, 0) == -1) |     if (waitpid(m_pid, &status, 0) == -1) | ||||||
|         return Error::from_syscall("waitpid"sv, -errno); |         return Error::from_syscall("waitpid"sv, errno); | ||||||
| 
 | 
 | ||||||
|     if (WIFEXITED(status)) { |     if (WIFEXITED(status)) { | ||||||
|         exit_code = WEXITSTATUS(status); |         exit_code = WEXITSTATUS(status); | ||||||
|  |  | ||||||
|  | @ -65,7 +65,7 @@ ErrorOr<int> accept4(int sockfd, sockaddr* address, socklen_t* address_length, i | ||||||
| { | { | ||||||
|     auto fd = ::accept4(sockfd, address, address_length, flags); |     auto fd = ::accept4(sockfd, address, address_length, flags); | ||||||
|     if (fd < 0) |     if (fd < 0) | ||||||
|         return Error::from_syscall("accept4"sv, -errno); |         return Error::from_syscall("accept4"sv, errno); | ||||||
|     return fd; |     return fd; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | @ -73,7 +73,7 @@ ErrorOr<int> accept4(int sockfd, sockaddr* address, socklen_t* address_length, i | ||||||
| ErrorOr<void> sigaction(int signal, struct sigaction const* action, struct sigaction* old_action) | ErrorOr<void> sigaction(int signal, struct sigaction const* action, struct sigaction* old_action) | ||||||
| { | { | ||||||
|     if (::sigaction(signal, action, old_action) < 0) |     if (::sigaction(signal, action, old_action) < 0) | ||||||
|         return Error::from_syscall("sigaction"sv, -errno); |         return Error::from_syscall("sigaction"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -87,7 +87,7 @@ ErrorOr<sighandler_t> signal(int signal, sighandler_t handler) | ||||||
| { | { | ||||||
|     auto old_handler = ::signal(signal, handler); |     auto old_handler = ::signal(signal, handler); | ||||||
|     if (old_handler == SIG_ERR) |     if (old_handler == SIG_ERR) | ||||||
|         return Error::from_syscall("signal"sv, -errno); |         return Error::from_syscall("signal"sv, errno); | ||||||
|     return old_handler; |     return old_handler; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -95,14 +95,14 @@ ErrorOr<struct stat> fstat(int fd) | ||||||
| { | { | ||||||
|     struct stat st = {}; |     struct stat st = {}; | ||||||
|     if (::fstat(fd, &st) < 0) |     if (::fstat(fd, &st) < 0) | ||||||
|         return Error::from_syscall("fstat"sv, -errno); |         return Error::from_syscall("fstat"sv, errno); | ||||||
|     return st; |     return st; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<struct stat> fstatat(int fd, StringView path, int flags) | ErrorOr<struct stat> fstatat(int fd, StringView path, int flags) | ||||||
| { | { | ||||||
|     if (!path.characters_without_null_termination()) |     if (!path.characters_without_null_termination()) | ||||||
|         return Error::from_syscall("fstatat"sv, -EFAULT); |         return Error::from_syscall("fstatat"sv, EFAULT); | ||||||
| 
 | 
 | ||||||
|     struct stat st = {}; |     struct stat st = {}; | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|  | @ -120,7 +120,7 @@ ErrorOr<int> fcntl(int fd, int command, ...) | ||||||
|     int rc = ::fcntl(fd, command, extra_arg); |     int rc = ::fcntl(fd, command, extra_arg); | ||||||
|     va_end(ap); |     va_end(ap); | ||||||
|     if (rc < 0) |     if (rc < 0) | ||||||
|         return Error::from_syscall("fcntl"sv, -errno); |         return Error::from_syscall("fcntl"sv, errno); | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -130,14 +130,14 @@ ErrorOr<void*> mmap(void* address, size_t size, int protection, int flags, int f | ||||||
|     VERIFY(!alignment); |     VERIFY(!alignment); | ||||||
|     auto* ptr = ::mmap(address, size, protection, flags, fd, offset); |     auto* ptr = ::mmap(address, size, protection, flags, fd, offset); | ||||||
|     if (ptr == MAP_FAILED) |     if (ptr == MAP_FAILED) | ||||||
|         return Error::from_syscall("mmap"sv, -errno); |         return Error::from_syscall("mmap"sv, errno); | ||||||
|     return ptr; |     return ptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> munmap(void* address, size_t size) | ErrorOr<void> munmap(void* address, size_t size) | ||||||
| { | { | ||||||
|     if (::munmap(address, size) < 0) |     if (::munmap(address, size) < 0) | ||||||
|         return Error::from_syscall("munmap"sv, -errno); |         return Error::from_syscall("munmap"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -205,53 +205,53 @@ ErrorOr<int> open(StringView path, int options, mode_t mode) | ||||||
| ErrorOr<int> openat(int fd, StringView path, int options, mode_t mode) | ErrorOr<int> openat(int fd, StringView path, int options, mode_t mode) | ||||||
| { | { | ||||||
|     if (!path.characters_without_null_termination()) |     if (!path.characters_without_null_termination()) | ||||||
|         return Error::from_syscall("open"sv, -EFAULT); |         return Error::from_syscall("open"sv, EFAULT); | ||||||
| 
 | 
 | ||||||
|     // NOTE: We have to ensure that the path is null-terminated.
 |     // NOTE: We have to ensure that the path is null-terminated.
 | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     int rc = ::openat(fd, path_string.characters(), options, mode); |     int rc = ::openat(fd, path_string.characters(), options, mode); | ||||||
|     if (rc < 0) |     if (rc < 0) | ||||||
|         return Error::from_syscall("open"sv, -errno); |         return Error::from_syscall("open"sv, errno); | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> close(int fd) | ErrorOr<void> close(int fd) | ||||||
| { | { | ||||||
|     if (::close(fd) < 0) |     if (::close(fd) < 0) | ||||||
|         return Error::from_syscall("close"sv, -errno); |         return Error::from_syscall("close"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> ftruncate(int fd, off_t length) | ErrorOr<void> ftruncate(int fd, off_t length) | ||||||
| { | { | ||||||
|     if (::ftruncate(fd, length) < 0) |     if (::ftruncate(fd, length) < 0) | ||||||
|         return Error::from_syscall("ftruncate"sv, -errno); |         return Error::from_syscall("ftruncate"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<struct stat> stat(StringView path) | ErrorOr<struct stat> stat(StringView path) | ||||||
| { | { | ||||||
|     if (!path.characters_without_null_termination()) |     if (!path.characters_without_null_termination()) | ||||||
|         return Error::from_syscall("stat"sv, -EFAULT); |         return Error::from_syscall("stat"sv, EFAULT); | ||||||
| 
 | 
 | ||||||
|     struct stat st = {}; |     struct stat st = {}; | ||||||
| 
 | 
 | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (::stat(path_string.characters(), &st) < 0) |     if (::stat(path_string.characters(), &st) < 0) | ||||||
|         return Error::from_syscall("stat"sv, -errno); |         return Error::from_syscall("stat"sv, errno); | ||||||
|     return st; |     return st; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<struct stat> lstat(StringView path) | ErrorOr<struct stat> lstat(StringView path) | ||||||
| { | { | ||||||
|     if (!path.characters_without_null_termination()) |     if (!path.characters_without_null_termination()) | ||||||
|         return Error::from_syscall("lstat"sv, -EFAULT); |         return Error::from_syscall("lstat"sv, EFAULT); | ||||||
| 
 | 
 | ||||||
|     struct stat st = {}; |     struct stat st = {}; | ||||||
| 
 | 
 | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (::lstat(path_string.characters(), &st) < 0) |     if (::lstat(path_string.characters(), &st) < 0) | ||||||
|         return Error::from_syscall("lstat"sv, -errno); |         return Error::from_syscall("lstat"sv, errno); | ||||||
|     return st; |     return st; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -259,7 +259,7 @@ ErrorOr<ssize_t> read(int fd, Bytes buffer) | ||||||
| { | { | ||||||
|     ssize_t rc = ::read(fd, buffer.data(), buffer.size()); |     ssize_t rc = ::read(fd, buffer.data(), buffer.size()); | ||||||
|     if (rc < 0) |     if (rc < 0) | ||||||
|         return Error::from_syscall("read"sv, -errno); |         return Error::from_syscall("read"sv, errno); | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -267,14 +267,14 @@ ErrorOr<ssize_t> write(int fd, ReadonlyBytes buffer) | ||||||
| { | { | ||||||
|     ssize_t rc = ::write(fd, buffer.data(), buffer.size()); |     ssize_t rc = ::write(fd, buffer.data(), buffer.size()); | ||||||
|     if (rc < 0) |     if (rc < 0) | ||||||
|         return Error::from_syscall("write"sv, -errno); |         return Error::from_syscall("write"sv, errno); | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> kill(pid_t pid, int signal) | ErrorOr<void> kill(pid_t pid, int signal) | ||||||
| { | { | ||||||
|     if (::kill(pid, signal) < 0) |     if (::kill(pid, signal) < 0) | ||||||
|         return Error::from_syscall("kill"sv, -errno); |         return Error::from_syscall("kill"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -282,7 +282,7 @@ ErrorOr<int> dup(int source_fd) | ||||||
| { | { | ||||||
|     int fd = ::dup(source_fd); |     int fd = ::dup(source_fd); | ||||||
|     if (fd < 0) |     if (fd < 0) | ||||||
|         return Error::from_syscall("dup"sv, -errno); |         return Error::from_syscall("dup"sv, errno); | ||||||
|     return fd; |     return fd; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -290,7 +290,7 @@ ErrorOr<int> dup2(int source_fd, int destination_fd) | ||||||
| { | { | ||||||
|     int fd = ::dup2(source_fd, destination_fd); |     int fd = ::dup2(source_fd, destination_fd); | ||||||
|     if (fd < 0) |     if (fd < 0) | ||||||
|         return Error::from_syscall("dup2"sv, -errno); |         return Error::from_syscall("dup2"sv, errno); | ||||||
|     return fd; |     return fd; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -298,7 +298,7 @@ ErrorOr<ByteString> getcwd() | ||||||
| { | { | ||||||
|     auto* cwd = ::getcwd(nullptr, 0); |     auto* cwd = ::getcwd(nullptr, 0); | ||||||
|     if (!cwd) |     if (!cwd) | ||||||
|         return Error::from_syscall("getcwd"sv, -errno); |         return Error::from_syscall("getcwd"sv, errno); | ||||||
| 
 | 
 | ||||||
|     ByteString string_cwd(cwd); |     ByteString string_cwd(cwd); | ||||||
|     free(cwd); |     free(cwd); | ||||||
|  | @ -316,7 +316,7 @@ ErrorOr<void> ioctl(int fd, unsigned request, ...) | ||||||
| #endif | #endif | ||||||
|     va_end(ap); |     va_end(ap); | ||||||
|     if (::ioctl(fd, request, arg) < 0) |     if (::ioctl(fd, request, arg) < 0) | ||||||
|         return Error::from_syscall("ioctl"sv, -errno); |         return Error::from_syscall("ioctl"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -324,50 +324,50 @@ ErrorOr<struct termios> tcgetattr(int fd) | ||||||
| { | { | ||||||
|     struct termios ios = {}; |     struct termios ios = {}; | ||||||
|     if (::tcgetattr(fd, &ios) < 0) |     if (::tcgetattr(fd, &ios) < 0) | ||||||
|         return Error::from_syscall("tcgetattr"sv, -errno); |         return Error::from_syscall("tcgetattr"sv, errno); | ||||||
|     return ios; |     return ios; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> tcsetattr(int fd, int optional_actions, struct termios const& ios) | ErrorOr<void> tcsetattr(int fd, int optional_actions, struct termios const& ios) | ||||||
| { | { | ||||||
|     if (::tcsetattr(fd, optional_actions, &ios) < 0) |     if (::tcsetattr(fd, optional_actions, &ios) < 0) | ||||||
|         return Error::from_syscall("tcsetattr"sv, -errno); |         return Error::from_syscall("tcsetattr"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> chmod(StringView pathname, mode_t mode) | ErrorOr<void> chmod(StringView pathname, mode_t mode) | ||||||
| { | { | ||||||
|     if (!pathname.characters_without_null_termination()) |     if (!pathname.characters_without_null_termination()) | ||||||
|         return Error::from_syscall("chmod"sv, -EFAULT); |         return Error::from_syscall("chmod"sv, EFAULT); | ||||||
| 
 | 
 | ||||||
|     ByteString path = pathname; |     ByteString path = pathname; | ||||||
|     if (::chmod(path.characters(), mode) < 0) |     if (::chmod(path.characters(), mode) < 0) | ||||||
|         return Error::from_syscall("chmod"sv, -errno); |         return Error::from_syscall("chmod"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> fchmod(int fd, mode_t mode) | ErrorOr<void> fchmod(int fd, mode_t mode) | ||||||
| { | { | ||||||
|     if (::fchmod(fd, mode) < 0) |     if (::fchmod(fd, mode) < 0) | ||||||
|         return Error::from_syscall("fchmod"sv, -errno); |         return Error::from_syscall("fchmod"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> fchown(int fd, uid_t uid, gid_t gid) | ErrorOr<void> fchown(int fd, uid_t uid, gid_t gid) | ||||||
| { | { | ||||||
|     if (::fchown(fd, uid, gid) < 0) |     if (::fchown(fd, uid, gid) < 0) | ||||||
|         return Error::from_syscall("fchown"sv, -errno); |         return Error::from_syscall("fchown"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> chown(StringView pathname, uid_t uid, gid_t gid) | ErrorOr<void> chown(StringView pathname, uid_t uid, gid_t gid) | ||||||
| { | { | ||||||
|     if (!pathname.characters_without_null_termination()) |     if (!pathname.characters_without_null_termination()) | ||||||
|         return Error::from_syscall("chown"sv, -EFAULT); |         return Error::from_syscall("chown"sv, EFAULT); | ||||||
| 
 | 
 | ||||||
|     ByteString path = pathname; |     ByteString path = pathname; | ||||||
|     if (::lchown(path.characters(), uid, gid) < 0) |     if (::lchown(path.characters(), uid, gid) < 0) | ||||||
|         return Error::from_syscall("lchown"sv, -errno); |         return Error::from_syscall("lchown"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -375,7 +375,7 @@ static ALWAYS_INLINE ErrorOr<pid_t> posix_spawn_wrapper(StringView path, posix_s | ||||||
| { | { | ||||||
|     pid_t child_pid; |     pid_t child_pid; | ||||||
|     if ((errno = spawn_function(&child_pid, path.to_byte_string().characters(), file_actions, attr, arguments, envp))) |     if ((errno = spawn_function(&child_pid, path.to_byte_string().characters(), file_actions, attr, arguments, envp))) | ||||||
|         return Error::from_syscall(function_name, -errno); |         return Error::from_syscall(function_name, errno); | ||||||
|     return child_pid; |     return child_pid; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -393,7 +393,7 @@ ErrorOr<off_t> lseek(int fd, off_t offset, int whence) | ||||||
| { | { | ||||||
|     off_t rc = ::lseek(fd, offset, whence); |     off_t rc = ::lseek(fd, offset, whence); | ||||||
|     if (rc < 0) |     if (rc < 0) | ||||||
|         return Error::from_syscall("lseek"sv, -errno); |         return Error::from_syscall("lseek"sv, errno); | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -402,7 +402,7 @@ ErrorOr<WaitPidResult> waitpid(pid_t waitee, int options) | ||||||
|     int wstatus; |     int wstatus; | ||||||
|     pid_t pid = ::waitpid(waitee, &wstatus, options); |     pid_t pid = ::waitpid(waitee, &wstatus, options); | ||||||
|     if (pid < 0) |     if (pid < 0) | ||||||
|         return Error::from_syscall("waitpid"sv, -errno); |         return Error::from_syscall("waitpid"sv, errno); | ||||||
|     return WaitPidResult { pid, wstatus }; |     return WaitPidResult { pid, wstatus }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -410,7 +410,7 @@ ErrorOr<bool> isatty(int fd) | ||||||
| { | { | ||||||
|     int rc = ::isatty(fd); |     int rc = ::isatty(fd); | ||||||
|     if (rc < 0) |     if (rc < 0) | ||||||
|         return Error::from_syscall("isatty"sv, -errno); |         return Error::from_syscall("isatty"sv, errno); | ||||||
|     return rc == 1; |     return rc == 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -419,7 +419,7 @@ ErrorOr<void> link(StringView old_path, StringView new_path) | ||||||
|     ByteString old_path_string = old_path; |     ByteString old_path_string = old_path; | ||||||
|     ByteString new_path_string = new_path; |     ByteString new_path_string = new_path; | ||||||
|     if (::link(old_path_string.characters(), new_path_string.characters()) < 0) |     if (::link(old_path_string.characters(), new_path_string.characters()) < 0) | ||||||
|         return Error::from_syscall("link"sv, -errno); |         return Error::from_syscall("link"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -428,7 +428,7 @@ ErrorOr<void> symlink(StringView target, StringView link_path) | ||||||
|     ByteString target_string = target; |     ByteString target_string = target; | ||||||
|     ByteString link_path_string = link_path; |     ByteString link_path_string = link_path; | ||||||
|     if (::symlink(target_string.characters(), link_path_string.characters()) < 0) |     if (::symlink(target_string.characters(), link_path_string.characters()) < 0) | ||||||
|         return Error::from_syscall("symlink"sv, -errno); |         return Error::from_syscall("symlink"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -438,7 +438,7 @@ ErrorOr<void> mkdir(StringView path, mode_t mode) | ||||||
|         return Error::from_errno(EFAULT); |         return Error::from_errno(EFAULT); | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (::mkdir(path_string.characters(), mode) < 0) |     if (::mkdir(path_string.characters(), mode) < 0) | ||||||
|         return Error::from_syscall("mkdir"sv, -errno); |         return Error::from_syscall("mkdir"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -449,7 +449,7 @@ ErrorOr<void> chdir(StringView path) | ||||||
| 
 | 
 | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (::chdir(path_string.characters()) < 0) |     if (::chdir(path_string.characters()) < 0) | ||||||
|         return Error::from_syscall("chdir"sv, -errno); |         return Error::from_syscall("chdir"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -460,7 +460,7 @@ ErrorOr<void> rmdir(StringView path) | ||||||
| 
 | 
 | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (::rmdir(path_string.characters()) < 0) |     if (::rmdir(path_string.characters()) < 0) | ||||||
|         return Error::from_syscall("rmdir"sv, -errno); |         return Error::from_syscall("rmdir"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -468,7 +468,7 @@ ErrorOr<int> mkstemp(Span<char> pattern) | ||||||
| { | { | ||||||
|     int fd = ::mkstemp(pattern.data()); |     int fd = ::mkstemp(pattern.data()); | ||||||
|     if (fd < 0) |     if (fd < 0) | ||||||
|         return Error::from_syscall("mkstemp"sv, -errno); |         return Error::from_syscall("mkstemp"sv, errno); | ||||||
|     return fd; |     return fd; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -490,7 +490,7 @@ ErrorOr<void> rename(StringView old_path, StringView new_path) | ||||||
|     ByteString old_path_string = old_path; |     ByteString old_path_string = old_path; | ||||||
|     ByteString new_path_string = new_path; |     ByteString new_path_string = new_path; | ||||||
|     if (::rename(old_path_string.characters(), new_path_string.characters()) < 0) |     if (::rename(old_path_string.characters(), new_path_string.characters()) < 0) | ||||||
|         return Error::from_syscall("rename"sv, -errno); |         return Error::from_syscall("rename"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -501,7 +501,7 @@ ErrorOr<void> unlink(StringView path) | ||||||
| 
 | 
 | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (::unlink(path_string.characters()) < 0) |     if (::unlink(path_string.characters()) < 0) | ||||||
|         return Error::from_syscall("unlink"sv, -errno); |         return Error::from_syscall("unlink"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -516,7 +516,7 @@ ErrorOr<void> utimensat(int fd, StringView path, struct timespec const times[2], | ||||||
| 
 | 
 | ||||||
|     // Note the explicit null terminators above.
 |     // Note the explicit null terminators above.
 | ||||||
|     if (::utimensat(fd, builder.string_view().characters_without_null_termination(), times, flag) < 0) |     if (::utimensat(fd, builder.string_view().characters_without_null_termination(), times, flag) < 0) | ||||||
|         return Error::from_syscall("utimensat"sv, -errno); |         return Error::from_syscall("utimensat"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -524,7 +524,7 @@ ErrorOr<struct utsname> uname() | ||||||
| { | { | ||||||
|     struct utsname uts; |     struct utsname uts; | ||||||
|     if (::uname(&uts) < 0) |     if (::uname(&uts) < 0) | ||||||
|         return Error::from_syscall("uname"sv, -errno); |         return Error::from_syscall("uname"sv, errno); | ||||||
|     return uts; |     return uts; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -532,21 +532,21 @@ ErrorOr<int> socket(int domain, int type, int protocol) | ||||||
| { | { | ||||||
|     auto fd = ::socket(domain, type, protocol); |     auto fd = ::socket(domain, type, protocol); | ||||||
|     if (fd < 0) |     if (fd < 0) | ||||||
|         return Error::from_syscall("socket"sv, -errno); |         return Error::from_syscall("socket"sv, errno); | ||||||
|     return fd; |     return fd; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> bind(int sockfd, struct sockaddr const* address, socklen_t address_length) | ErrorOr<void> bind(int sockfd, struct sockaddr const* address, socklen_t address_length) | ||||||
| { | { | ||||||
|     if (::bind(sockfd, address, address_length) < 0) |     if (::bind(sockfd, address, address_length) < 0) | ||||||
|         return Error::from_syscall("bind"sv, -errno); |         return Error::from_syscall("bind"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> listen(int sockfd, int backlog) | ErrorOr<void> listen(int sockfd, int backlog) | ||||||
| { | { | ||||||
|     if (::listen(sockfd, backlog) < 0) |     if (::listen(sockfd, backlog) < 0) | ||||||
|         return Error::from_syscall("listen"sv, -errno); |         return Error::from_syscall("listen"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -554,14 +554,14 @@ ErrorOr<int> accept(int sockfd, struct sockaddr* address, socklen_t* address_len | ||||||
| { | { | ||||||
|     auto fd = ::accept(sockfd, address, address_length); |     auto fd = ::accept(sockfd, address, address_length); | ||||||
|     if (fd < 0) |     if (fd < 0) | ||||||
|         return Error::from_syscall("accept"sv, -errno); |         return Error::from_syscall("accept"sv, errno); | ||||||
|     return fd; |     return fd; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> connect(int sockfd, struct sockaddr const* address, socklen_t address_length) | ErrorOr<void> connect(int sockfd, struct sockaddr const* address, socklen_t address_length) | ||||||
| { | { | ||||||
|     if (::connect(sockfd, address, address_length) < 0) |     if (::connect(sockfd, address, address_length) < 0) | ||||||
|         return Error::from_syscall("connect"sv, -errno); |         return Error::from_syscall("connect"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -569,7 +569,7 @@ ErrorOr<ssize_t> send(int sockfd, void const* buffer, size_t buffer_length, int | ||||||
| { | { | ||||||
|     auto sent = ::send(sockfd, buffer, buffer_length, flags); |     auto sent = ::send(sockfd, buffer, buffer_length, flags); | ||||||
|     if (sent < 0) |     if (sent < 0) | ||||||
|         return Error::from_syscall("send"sv, -errno); |         return Error::from_syscall("send"sv, errno); | ||||||
|     return sent; |     return sent; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -577,7 +577,7 @@ ErrorOr<ssize_t> sendmsg(int sockfd, const struct msghdr* message, int flags) | ||||||
| { | { | ||||||
|     auto sent = ::sendmsg(sockfd, message, flags); |     auto sent = ::sendmsg(sockfd, message, flags); | ||||||
|     if (sent < 0) |     if (sent < 0) | ||||||
|         return Error::from_syscall("sendmsg"sv, -errno); |         return Error::from_syscall("sendmsg"sv, errno); | ||||||
|     return sent; |     return sent; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -585,7 +585,7 @@ ErrorOr<ssize_t> sendto(int sockfd, void const* source, size_t source_length, in | ||||||
| { | { | ||||||
|     auto sent = ::sendto(sockfd, source, source_length, flags, destination, destination_length); |     auto sent = ::sendto(sockfd, source, source_length, flags, destination, destination_length); | ||||||
|     if (sent < 0) |     if (sent < 0) | ||||||
|         return Error::from_syscall("sendto"sv, -errno); |         return Error::from_syscall("sendto"sv, errno); | ||||||
|     return sent; |     return sent; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -593,7 +593,7 @@ ErrorOr<ssize_t> recv(int sockfd, void* buffer, size_t length, int flags) | ||||||
| { | { | ||||||
|     auto received = ::recv(sockfd, buffer, length, flags); |     auto received = ::recv(sockfd, buffer, length, flags); | ||||||
|     if (received < 0) |     if (received < 0) | ||||||
|         return Error::from_syscall("recv"sv, -errno); |         return Error::from_syscall("recv"sv, errno); | ||||||
|     return received; |     return received; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -601,7 +601,7 @@ ErrorOr<ssize_t> recvmsg(int sockfd, struct msghdr* message, int flags) | ||||||
| { | { | ||||||
|     auto received = ::recvmsg(sockfd, message, flags); |     auto received = ::recvmsg(sockfd, message, flags); | ||||||
|     if (received < 0) |     if (received < 0) | ||||||
|         return Error::from_syscall("recvmsg"sv, -errno); |         return Error::from_syscall("recvmsg"sv, errno); | ||||||
|     return received; |     return received; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -609,7 +609,7 @@ ErrorOr<ssize_t> recvfrom(int sockfd, void* buffer, size_t buffer_length, int fl | ||||||
| { | { | ||||||
|     auto received = ::recvfrom(sockfd, buffer, buffer_length, flags, address, address_length); |     auto received = ::recvfrom(sockfd, buffer, buffer_length, flags, address, address_length); | ||||||
|     if (received < 0) |     if (received < 0) | ||||||
|         return Error::from_syscall("recvfrom"sv, -errno); |         return Error::from_syscall("recvfrom"sv, errno); | ||||||
|     return received; |     return received; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -620,7 +620,7 @@ ErrorOr<AddressInfoVector> getaddrinfo(char const* nodename, char const* servnam | ||||||
|     int const rc = ::getaddrinfo(nodename, servname, &hints, &results); |     int const rc = ::getaddrinfo(nodename, servname, &hints, &results); | ||||||
|     if (rc != 0) { |     if (rc != 0) { | ||||||
|         if (rc == EAI_SYSTEM) { |         if (rc == EAI_SYSTEM) { | ||||||
|             return Error::from_syscall("getaddrinfo"sv, -errno); |             return Error::from_syscall("getaddrinfo"sv, errno); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         auto const* error_string = gai_strerror(rc); |         auto const* error_string = gai_strerror(rc); | ||||||
|  | @ -638,35 +638,35 @@ ErrorOr<AddressInfoVector> getaddrinfo(char const* nodename, char const* servnam | ||||||
| ErrorOr<void> getsockopt(int sockfd, int level, int option, void* value, socklen_t* value_size) | ErrorOr<void> getsockopt(int sockfd, int level, int option, void* value, socklen_t* value_size) | ||||||
| { | { | ||||||
|     if (::getsockopt(sockfd, level, option, value, value_size) < 0) |     if (::getsockopt(sockfd, level, option, value, value_size) < 0) | ||||||
|         return Error::from_syscall("getsockopt"sv, -errno); |         return Error::from_syscall("getsockopt"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> setsockopt(int sockfd, int level, int option, void const* value, socklen_t value_size) | ErrorOr<void> setsockopt(int sockfd, int level, int option, void const* value, socklen_t value_size) | ||||||
| { | { | ||||||
|     if (::setsockopt(sockfd, level, option, value, value_size) < 0) |     if (::setsockopt(sockfd, level, option, value, value_size) < 0) | ||||||
|         return Error::from_syscall("setsockopt"sv, -errno); |         return Error::from_syscall("setsockopt"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> getsockname(int sockfd, struct sockaddr* address, socklen_t* address_length) | ErrorOr<void> getsockname(int sockfd, struct sockaddr* address, socklen_t* address_length) | ||||||
| { | { | ||||||
|     if (::getsockname(sockfd, address, address_length) < 0) |     if (::getsockname(sockfd, address, address_length) < 0) | ||||||
|         return Error::from_syscall("getsockname"sv, -errno); |         return Error::from_syscall("getsockname"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> getpeername(int sockfd, struct sockaddr* address, socklen_t* address_length) | ErrorOr<void> getpeername(int sockfd, struct sockaddr* address, socklen_t* address_length) | ||||||
| { | { | ||||||
|     if (::getpeername(sockfd, address, address_length) < 0) |     if (::getpeername(sockfd, address, address_length) < 0) | ||||||
|         return Error::from_syscall("getpeername"sv, -errno); |         return Error::from_syscall("getpeername"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> socketpair(int domain, int type, int protocol, int sv[2]) | ErrorOr<void> socketpair(int domain, int type, int protocol, int sv[2]) | ||||||
| { | { | ||||||
|     if (::socketpair(domain, type, protocol, sv) < 0) |     if (::socketpair(domain, type, protocol, sv) < 0) | ||||||
|         return Error::from_syscall("socketpair"sv, -errno); |         return Error::from_syscall("socketpair"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -676,10 +676,10 @@ ErrorOr<Array<int, 2>> pipe2(int flags) | ||||||
| 
 | 
 | ||||||
| #if defined(__unix__) | #if defined(__unix__) | ||||||
|     if (::pipe2(fds.data(), flags) < 0) |     if (::pipe2(fds.data(), flags) < 0) | ||||||
|         return Error::from_syscall("pipe2"sv, -errno); |         return Error::from_syscall("pipe2"sv, errno); | ||||||
| #else | #else | ||||||
|     if (::pipe(fds.data()) < 0) |     if (::pipe(fds.data()) < 0) | ||||||
|         return Error::from_syscall("pipe2"sv, -errno); |         return Error::from_syscall("pipe2"sv, errno); | ||||||
| 
 | 
 | ||||||
|     // Ensure we don't leak the fds if any of the system calls below fail.
 |     // Ensure we don't leak the fds if any of the system calls below fail.
 | ||||||
|     AK::ArmedScopeGuard close_fds { [&]() { |     AK::ArmedScopeGuard close_fds { [&]() { | ||||||
|  | @ -705,13 +705,13 @@ ErrorOr<Array<int, 2>> pipe2(int flags) | ||||||
| ErrorOr<void> access(StringView pathname, int mode, int flags) | ErrorOr<void> access(StringView pathname, int mode, int flags) | ||||||
| { | { | ||||||
|     if (pathname.is_null()) |     if (pathname.is_null()) | ||||||
|         return Error::from_syscall("access"sv, -EFAULT); |         return Error::from_syscall("access"sv, EFAULT); | ||||||
| 
 | 
 | ||||||
|     ByteString path_string = pathname; |     ByteString path_string = pathname; | ||||||
|     (void)flags; |     (void)flags; | ||||||
| 
 | 
 | ||||||
|     if (::access(path_string.characters(), mode) < 0) |     if (::access(path_string.characters(), mode) < 0) | ||||||
|         return Error::from_syscall("access"sv, -errno); |         return Error::from_syscall("access"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -731,7 +731,7 @@ ErrorOr<ByteString> readlink(StringView pathname) | ||||||
|     ByteString path_string = pathname; |     ByteString path_string = pathname; | ||||||
|     int rc = ::readlink(path_string.characters(), data, sizeof(data)); |     int rc = ::readlink(path_string.characters(), data, sizeof(data)); | ||||||
|     if (rc == -1) |     if (rc == -1) | ||||||
|         return Error::from_syscall("readlink"sv, -errno); |         return Error::from_syscall("readlink"sv, errno); | ||||||
| 
 | 
 | ||||||
|     return ByteString(data, rc); |     return ByteString(data, rc); | ||||||
| #endif | #endif | ||||||
|  | @ -741,7 +741,7 @@ ErrorOr<int> poll(Span<struct pollfd> poll_fds, int timeout) | ||||||
| { | { | ||||||
|     auto const rc = ::poll(poll_fds.data(), poll_fds.size(), timeout); |     auto const rc = ::poll(poll_fds.data(), poll_fds.size(), timeout); | ||||||
|     if (rc < 0) |     if (rc < 0) | ||||||
|         return Error::from_syscall("poll"sv, -errno); |         return Error::from_syscall("poll"sv, errno); | ||||||
|     return { rc }; |     return { rc }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -762,18 +762,18 @@ ErrorOr<ByteString> current_executable_path() | ||||||
|     auto ret = ::readlink("/proc/self/exe", path, sizeof(path) - 1); |     auto ret = ::readlink("/proc/self/exe", path, sizeof(path) - 1); | ||||||
|     // Ignore error if it wasn't a symlink
 |     // Ignore error if it wasn't a symlink
 | ||||||
|     if (ret == -1 && errno != EINVAL) |     if (ret == -1 && errno != EINVAL) | ||||||
|         return Error::from_syscall("readlink"sv, -errno); |         return Error::from_syscall("readlink"sv, errno); | ||||||
| #elif defined(AK_OS_GNU_HURD) | #elif defined(AK_OS_GNU_HURD) | ||||||
|     // We could read /proc/self/exe, but why rely on procfs being mounted
 |     // We could read /proc/self/exe, but why rely on procfs being mounted
 | ||||||
|     // if we can do the same thing procfs does and ask the proc server directly?
 |     // if we can do the same thing procfs does and ask the proc server directly?
 | ||||||
|     process_t proc = getproc(); |     process_t proc = getproc(); | ||||||
|     if (!MACH_PORT_VALID(proc)) |     if (!MACH_PORT_VALID(proc)) | ||||||
|         return Error::from_syscall("getproc"sv, -errno); |         return Error::from_syscall("getproc"sv, errno); | ||||||
|     kern_return_t err = proc_get_exe(proc, getpid(), path); |     kern_return_t err = proc_get_exe(proc, getpid(), path); | ||||||
|     mach_port_deallocate(mach_task_self(), proc); |     mach_port_deallocate(mach_task_self(), proc); | ||||||
|     if (err) { |     if (err) { | ||||||
|         __hurd_fail(static_cast<error_t>(err)); |         __hurd_fail(static_cast<error_t>(err)); | ||||||
|         return Error::from_syscall("proc_get_exe"sv, -errno); |         return Error::from_syscall("proc_get_exe"sv, errno); | ||||||
|     } |     } | ||||||
| #elif defined(AK_OS_DRAGONFLY) | #elif defined(AK_OS_DRAGONFLY) | ||||||
|     return TRY(readlink("/proc/curproc/file"sv)); |     return TRY(readlink("/proc/curproc/file"sv)); | ||||||
|  | @ -783,12 +783,12 @@ ErrorOr<ByteString> current_executable_path() | ||||||
|     int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; |     int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; | ||||||
|     size_t len = sizeof(path); |     size_t len = sizeof(path); | ||||||
|     if (sysctl(mib, 4, path, &len, nullptr, 0) < 0) |     if (sysctl(mib, 4, path, &len, nullptr, 0) < 0) | ||||||
|         return Error::from_syscall("sysctl"sv, -errno); |         return Error::from_syscall("sysctl"sv, errno); | ||||||
| #elif defined(AK_OS_NETBSD) | #elif defined(AK_OS_NETBSD) | ||||||
|     int mib[4] = { CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME }; |     int mib[4] = { CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME }; | ||||||
|     size_t len = sizeof(path); |     size_t len = sizeof(path); | ||||||
|     if (sysctl(mib, 4, path, &len, nullptr, 0) < 0) |     if (sysctl(mib, 4, path, &len, nullptr, 0) < 0) | ||||||
|         return Error::from_syscall("sysctl"sv, -errno); |         return Error::from_syscall("sysctl"sv, errno); | ||||||
| #elif defined(AK_OS_MACOS) || defined(AK_OS_IOS) | #elif defined(AK_OS_MACOS) || defined(AK_OS_IOS) | ||||||
|     u32 size = sizeof(path); |     u32 size = sizeof(path); | ||||||
|     auto ret = _NSGetExecutablePath(path, &size); |     auto ret = _NSGetExecutablePath(path, &size); | ||||||
|  | @ -819,7 +819,7 @@ ErrorOr<rlimit> get_resource_limits(int resource) | ||||||
|     rlimit limits; |     rlimit limits; | ||||||
| 
 | 
 | ||||||
|     if (::getrlimit(resource, &limits) != 0) |     if (::getrlimit(resource, &limits) != 0) | ||||||
|         return Error::from_syscall("getrlimit"sv, -errno); |         return Error::from_syscall("getrlimit"sv, errno); | ||||||
| 
 | 
 | ||||||
|     return limits; |     return limits; | ||||||
| } | } | ||||||
|  | @ -830,7 +830,7 @@ ErrorOr<void> set_resource_limits(int resource, rlim_t limit) | ||||||
|     limits.rlim_cur = min(limit, limits.rlim_max); |     limits.rlim_cur = min(limit, limits.rlim_max); | ||||||
| 
 | 
 | ||||||
|     if (::setrlimit(resource, &limits) != 0) |     if (::setrlimit(resource, &limits) != 0) | ||||||
|         return Error::from_syscall("setrlimit"sv, -errno); |         return Error::from_syscall("setrlimit"sv, errno); | ||||||
| 
 | 
 | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
|  | @ -849,7 +849,7 @@ bool is_socket(int fd) | ||||||
| ErrorOr<void> sleep_ms(u32 milliseconds) | ErrorOr<void> sleep_ms(u32 milliseconds) | ||||||
| { | { | ||||||
|     if (usleep(1000 * milliseconds) != 0) |     if (usleep(1000 * milliseconds) != 0) | ||||||
|         return Error::from_syscall("usleep"sv, -errno); |         return Error::from_syscall("usleep"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ ErrorOr<int> open(StringView path, int options, mode_t mode) | ||||||
|     ByteString str = path; |     ByteString str = path; | ||||||
|     int fd = _open(str.characters(), options | O_BINARY | _O_OBTAIN_DIR, mode); |     int fd = _open(str.characters(), options | O_BINARY | _O_OBTAIN_DIR, mode); | ||||||
|     if (fd < 0) |     if (fd < 0) | ||||||
|         return Error::from_syscall("open"sv, -errno); |         return Error::from_syscall("open"sv, errno); | ||||||
|     ScopeGuard guard = [&] { _close(fd); }; |     ScopeGuard guard = [&] { _close(fd); }; | ||||||
|     return dup(_get_osfhandle(fd)); |     return dup(_get_osfhandle(fd)); | ||||||
| } | } | ||||||
|  | @ -105,7 +105,7 @@ ErrorOr<struct stat> fstat(int handle) | ||||||
|     int fd = _open_osfhandle(TRY(dup(handle)), 0); |     int fd = _open_osfhandle(TRY(dup(handle)), 0); | ||||||
|     ScopeGuard guard = [&] { _close(fd); }; |     ScopeGuard guard = [&] { _close(fd); }; | ||||||
|     if (::fstat(fd, &st) < 0) |     if (::fstat(fd, &st) < 0) | ||||||
|         return Error::from_syscall("fstat"sv, -errno); |         return Error::from_syscall("fstat"sv, errno); | ||||||
|     return st; |     return st; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -119,7 +119,7 @@ ErrorOr<ByteString> getcwd() | ||||||
| { | { | ||||||
|     auto* cwd = _getcwd(nullptr, 0); |     auto* cwd = _getcwd(nullptr, 0); | ||||||
|     if (!cwd) |     if (!cwd) | ||||||
|         return Error::from_syscall("getcwd"sv, -errno); |         return Error::from_syscall("getcwd"sv, errno); | ||||||
| 
 | 
 | ||||||
|     ByteString string_cwd(cwd); |     ByteString string_cwd(cwd); | ||||||
|     free(cwd); |     free(cwd); | ||||||
|  | @ -129,12 +129,12 @@ ErrorOr<ByteString> getcwd() | ||||||
| ErrorOr<struct stat> stat(StringView path) | ErrorOr<struct stat> stat(StringView path) | ||||||
| { | { | ||||||
|     if (path.is_null()) |     if (path.is_null()) | ||||||
|         return Error::from_syscall("stat"sv, -EFAULT); |         return Error::from_syscall("stat"sv, EFAULT); | ||||||
| 
 | 
 | ||||||
|     struct stat st = {}; |     struct stat st = {}; | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (::stat(path_string.characters(), &st) < 0) |     if (::stat(path_string.characters(), &st) < 0) | ||||||
|         return Error::from_syscall("stat"sv, -errno); |         return Error::from_syscall("stat"sv, errno); | ||||||
|     return st; |     return st; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -145,7 +145,7 @@ ErrorOr<void> rmdir(StringView path) | ||||||
| 
 | 
 | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (_rmdir(path_string.characters()) < 0) |     if (_rmdir(path_string.characters()) < 0) | ||||||
|         return Error::from_syscall("rmdir"sv, -errno); |         return Error::from_syscall("rmdir"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -156,7 +156,7 @@ ErrorOr<void> unlink(StringView path) | ||||||
| 
 | 
 | ||||||
|     ByteString path_string = path; |     ByteString path_string = path; | ||||||
|     if (_unlink(path_string.characters()) < 0) |     if (_unlink(path_string.characters()) < 0) | ||||||
|         return Error::from_syscall("unlink"sv, -errno); |         return Error::from_syscall("unlink"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -164,7 +164,7 @@ ErrorOr<void> mkdir(StringView path, mode_t) | ||||||
| { | { | ||||||
|     ByteString str = path; |     ByteString str = path; | ||||||
|     if (_mkdir(str.characters()) < 0) |     if (_mkdir(str.characters()) < 0) | ||||||
|         return Error::from_syscall("mkdir"sv, -errno); |         return Error::from_syscall("mkdir"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -188,14 +188,14 @@ ErrorOr<void*> mmap(void* address, size_t size, int protection, int flags, int f | ||||||
|     ScopeGuard guard = [&] { _close(fd); }; |     ScopeGuard guard = [&] { _close(fd); }; | ||||||
|     void* ptr = ::mmap(address, size, protection, flags, fd, offset); |     void* ptr = ::mmap(address, size, protection, flags, fd, offset); | ||||||
|     if (ptr == MAP_FAILED) |     if (ptr == MAP_FAILED) | ||||||
|         return Error::from_syscall("mmap"sv, -errno); |         return Error::from_syscall("mmap"sv, errno); | ||||||
|     return ptr; |     return ptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> munmap(void* address, size_t size) | ErrorOr<void> munmap(void* address, size_t size) | ||||||
| { | { | ||||||
|     if (::munmap(address, size) < 0) |     if (::munmap(address, size) < 0) | ||||||
|         return Error::from_syscall("munmap"sv, -errno); |         return Error::from_syscall("munmap"sv, errno); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -56,7 +56,7 @@ ErrorOr<ByteString> real_path(StringView path) | ||||||
|     ScopeGuard free_path = [real_path]() { free(real_path); }; |     ScopeGuard free_path = [real_path]() { free(real_path); }; | ||||||
| 
 | 
 | ||||||
|     if (!real_path) |     if (!real_path) | ||||||
|         return Error::from_syscall("realpath"sv, -errno); |         return Error::from_syscall("realpath"sv, errno); | ||||||
| 
 | 
 | ||||||
|     return ByteString { real_path, strlen(real_path) }; |     return ByteString { real_path, strlen(real_path) }; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy Flynn
						Timothy Flynn