1 #pragma once 2 3 /* NOTE: IIRC, wak@ is working on exposing some of this in stdplus, so we can 4 * transition when that's ready. 5 * 6 * Copied some from gpioplus to enable unit-testing of lpc nuvoton and later 7 * other pieces. 8 */ 9 10 #include <netdb.h> 11 #include <poll.h> 12 #include <sys/mman.h> 13 #include <sys/socket.h> 14 #include <sys/types.h> 15 16 #include <cinttypes> 17 #include <cstddef> 18 #include <cstdint> 19 20 namespace internal 21 { 22 23 /** 24 * @class Sys 25 * @brief Overridable direct syscall interface 26 */ 27 class Sys 28 { 29 public: 30 virtual ~Sys() = default; 31 32 virtual int open(const char* pathname, int flags) const = 0; 33 virtual int read(int fd, void* buf, std::size_t count) const = 0; 34 virtual int pread(int fd, void* buf, std::size_t count, 35 off_t offset) const = 0; 36 virtual int pwrite(int fd, const void* buf, std::size_t count, 37 off_t offset) const = 0; 38 virtual int close(int fd) const = 0; 39 virtual void* mmap(void* addr, std::size_t length, int prot, int flags, 40 int fd, off_t offset) const = 0; 41 virtual int munmap(void* addr, std::size_t length) const = 0; 42 virtual int getpagesize() const = 0; 43 virtual int ioctl(int fd, unsigned long request, void* param) const = 0; 44 virtual int poll(struct pollfd* fds, nfds_t nfds, int timeout) const = 0; 45 virtual int socket(int domain, int type, int protocol) const = 0; 46 virtual int connect(int sockfd, const struct sockaddr* addr, 47 socklen_t addrlen) const = 0; 48 virtual ssize_t sendfile(int out_fd, int in_fd, off_t* offset, 49 size_t count) const = 0; 50 virtual int getaddrinfo(const char* node, const char* service, 51 const struct addrinfo* hints, 52 struct addrinfo** res) const = 0; 53 virtual void freeaddrinfo(struct addrinfo* res) const = 0; 54 virtual std::int64_t getSize(const char* pathname) const = 0; 55 }; 56 57 /** 58 * @class SysImpl 59 * @brief syscall concrete implementation 60 * @details Passes through all calls to the normal linux syscalls 61 */ 62 class SysImpl : public Sys 63 { 64 public: 65 int open(const char* pathname, int flags) const override; 66 int read(int fd, void* buf, std::size_t count) const override; 67 int pread(int fd, void* buf, std::size_t count, 68 off_t offset) const override; 69 int pwrite(int fd, const void* buf, std::size_t count, 70 off_t offset) const override; 71 int close(int fd) const override; 72 void* mmap(void* addr, std::size_t length, int prot, int flags, int fd, 73 off_t offset) const override; 74 int munmap(void* addr, std::size_t length) const override; 75 int getpagesize() const override; 76 int ioctl(int fd, unsigned long request, void* param) const override; 77 int poll(struct pollfd* fds, nfds_t nfds, int timeout) const override; 78 int socket(int domain, int type, int protocol) const override; 79 int connect(int sockfd, const struct sockaddr* addr, 80 socklen_t addrlen) const override; 81 ssize_t sendfile(int out_fd, int in_fd, off_t* offset, 82 size_t count) const override; 83 int getaddrinfo(const char* node, const char* service, 84 const struct addrinfo* hints, 85 struct addrinfo** res) const override; 86 void freeaddrinfo(struct addrinfo* res) const override; 87 /* returns 0 on failure, or if the file is zero bytes. */ 88 std::int64_t getSize(const char* pathname) const override; 89 }; 90 91 /** @brief Default instantiation of sys */ 92 extern SysImpl sys_impl; 93 94 } // namespace internal 95