/* * Copyright (c) 2021, Andreas Kling * Copyright (c) 2021-2022, Kenneth Myhra * Copyright (c) 2021-2024, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #if !defined(AK_OS_WINDOWS) # include # include # include # include # include # include # include # include # include # include # include #else # include # define O_CLOEXEC O_NOINHERIT # define STDIN_FILENO to_fd(reinterpret_cast(_get_osfhandle(_fileno(stdin)))) # define STDOUT_FILENO to_fd(reinterpret_cast(_get_osfhandle(_fileno(stdout)))) # define STDERR_FILENO to_fd(reinterpret_cast(_get_osfhandle(_fileno(stderr)))) # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) using sighandler_t = void (*)(int); using socklen_t = int; struct addrinfo; struct sockaddr; #endif #if !defined(AK_OS_BSD_GENERIC) && !defined(AK_OS_ANDROID) && !defined(AK_OS_WINDOWS) # include #endif #ifdef AK_OS_FREEBSD # include #endif #ifdef AK_OS_SOLARIS # include # include #endif namespace Core::System { #if !defined(AK_OS_MACOS) && !defined(AK_OS_HAIKU) ErrorOr accept4(int sockfd, struct sockaddr*, socklen_t*, int flags); #endif ErrorOr sigaction(int signal, struct sigaction const* action, struct sigaction* old_action); #if defined(AK_OS_SOLARIS) CORE_API ErrorOr signal(int signal, SIG_TYP handler); #elif defined(AK_OS_BSD_GENERIC) CORE_API ErrorOr signal(int signal, sig_t handler); #else CORE_API ErrorOr signal(int signal, sighandler_t handler); #endif CORE_API ErrorOr fstat(int fd); ErrorOr fstatat(int fd, StringView path, int flags); CORE_API ErrorOr fcntl(int fd, int command, ...); ErrorOr mmap(void* address, size_t, int protection, int flags, int fd, off_t, size_t alignment = 0, StringView name = {}); ErrorOr munmap(void* address, size_t); ErrorOr anon_create(size_t size, int options); CORE_API ErrorOr open(StringView path, int options, mode_t mode = 0); ErrorOr openat(int fd, StringView path, int options, mode_t mode = 0); CORE_API ErrorOr close(int fd); ErrorOr ftruncate(int fd, off_t length); CORE_API ErrorOr stat(StringView path); CORE_API ErrorOr lstat(StringView path); CORE_API ErrorOr read(int fd, Bytes buffer); CORE_API ErrorOr write(int fd, ReadonlyBytes buffer); CORE_API ErrorOr dup(int source_fd); ErrorOr dup2(int source_fd, int destination_fd); CORE_API ErrorOr getcwd(); CORE_API ErrorOr ioctl(int fd, unsigned request, ...); ErrorOr tcgetattr(int fd); ErrorOr tcsetattr(int fd, int optional_actions, struct termios const&); CORE_API ErrorOr chmod(StringView pathname, mode_t mode); ErrorOr lseek(int fd, off_t, int whence); CORE_API ErrorOr isatty(int fd); CORE_API ErrorOr link(StringView old_path, StringView new_path); CORE_API ErrorOr symlink(StringView target, StringView link_path); CORE_API ErrorOr mkdir(StringView path, mode_t); CORE_API ErrorOr chdir(StringView path); CORE_API ErrorOr rmdir(StringView path); CORE_API ErrorOr mkstemp(Span pattern); CORE_API ErrorOr fchmod(int fd, mode_t mode); CORE_API ErrorOr rename(StringView old_path, StringView new_path); CORE_API ErrorOr unlink(StringView path); CORE_API ErrorOr utimensat(int fd, StringView path, struct timespec const times[2], int flag); CORE_API ErrorOr> pipe2(int flags); CORE_API ErrorOr socket(int domain, int type, int protocol); CORE_API ErrorOr bind(int sockfd, struct sockaddr const*, socklen_t); CORE_API ErrorOr listen(int sockfd, int backlog); ErrorOr accept(int sockfd, struct sockaddr*, socklen_t*); ErrorOr connect(int sockfd, struct sockaddr const*, socklen_t); CORE_API ErrorOr send(int sockfd, ReadonlyBytes, int flags); ErrorOr sendmsg(int sockfd, const struct msghdr*, int flags); ErrorOr sendto(int sockfd, ReadonlyBytes, int flags, struct sockaddr const*, socklen_t); ErrorOr recv(int sockfd, Bytes, int flags); ErrorOr recvmsg(int sockfd, struct msghdr*, int flags); ErrorOr recvfrom(int sockfd, Bytes, int flags, struct sockaddr*, socklen_t*); ErrorOr getsockopt(int sockfd, int level, int option, void* value, socklen_t* value_size); CORE_API ErrorOr setsockopt(int sockfd, int level, int option, void const* value, socklen_t value_size); ErrorOr getsockname(int sockfd, struct sockaddr*, socklen_t*); ErrorOr getpeername(int sockfd, struct sockaddr*, socklen_t*); CORE_API ErrorOr socketpair(int domain, int type, int protocol, int sv[2]); CORE_API ErrorOr access(StringView pathname, int mode, int flags = 0); ErrorOr readlink(StringView pathname); CORE_API ErrorOr poll(Span, int timeout); CORE_API ErrorOr kill(pid_t, int signal); #if !defined(AK_OS_WINDOWS) CORE_API ErrorOr chown(StringView pathname, uid_t uid, gid_t gid); ErrorOr posix_spawn(StringView path, posix_spawn_file_actions_t const* file_actions, posix_spawnattr_t const* attr, char* const arguments[], char* const envp[]); ErrorOr posix_spawnp(StringView path, posix_spawn_file_actions_t* const file_actions, posix_spawnattr_t* const attr, char* const arguments[], char* const envp[]); struct WaitPidResult { pid_t pid; int status; }; CORE_API ErrorOr waitpid(pid_t waitee, int options = 0); CORE_API ErrorOr fchown(int fd, uid_t, gid_t); #endif ErrorOr getaddrinfo(char const* nodename, char const* servname, struct addrinfo const& hints); CORE_API unsigned hardware_concurrency(); CORE_API u64 physical_memory_bytes(); CORE_API ErrorOr current_executable_path(); #if !defined(AK_OS_WINDOWS) ErrorOr get_resource_limits(int resource); CORE_API ErrorOr set_resource_limits(int resource, rlim_t limit); #endif CORE_API int getpid(); CORE_API bool is_socket(int fd); CORE_API ErrorOr sleep_ms(u32 milliseconds); CORE_API ErrorOr set_close_on_exec(int fd, bool enabled); CORE_API ErrorOr transfer_file_through_socket(int source_fd, int target_fd, size_t source_offset, size_t source_length); }