xref: /openbmc/phosphor-ipmi-flash/internal/sys.hpp (revision ded66d0f7317f6e43a5301da6c3d9dda80b17250)
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 #include <system_error>
20 
21 namespace internal
22 {
23 
24 /**
25  * @class Sys
26  * @brief Overridable direct syscall interface
27  */
28 class Sys
29 {
30   public:
31     virtual ~Sys() = default;
32 
33     virtual int open(const char* pathname, int flags) const = 0;
34     virtual int read(int fd, void* buf, std::size_t count) const = 0;
35     virtual int pread(int fd, void* buf, std::size_t count,
36                       off_t offset) const = 0;
37     virtual int pwrite(int fd, const void* buf, std::size_t count,
38                        off_t offset) const = 0;
39     virtual int close(int fd) const = 0;
40     virtual void* mmap(void* addr, std::size_t length, int prot, int flags,
41                        int fd, off_t offset) const = 0;
42     virtual int munmap(void* addr, std::size_t length) const = 0;
43     virtual int getpagesize() const = 0;
44     virtual int ioctl(int fd, unsigned long request, void* param) const = 0;
45     virtual int poll(struct pollfd* fds, nfds_t nfds, int timeout) const = 0;
46     virtual int socket(int domain, int type, int protocol) const = 0;
47     virtual int connect(int sockfd, const struct sockaddr* addr,
48                         socklen_t addrlen) const = 0;
49     virtual ssize_t sendfile(int out_fd, int in_fd, off_t* offset,
50                              size_t count) const = 0;
51     virtual int getaddrinfo(const char* node, const char* service,
52                             const struct addrinfo* hints,
53                             struct addrinfo** res) const = 0;
54     virtual void freeaddrinfo(struct addrinfo* res) const = 0;
55     virtual std::int64_t getSize(const char* pathname) const = 0;
56 };
57 
58 /**
59  * @class SysImpl
60  * @brief syscall concrete implementation
61  * @details Passes through all calls to the normal linux syscalls
62  */
63 class SysImpl : public Sys
64 {
65   public:
66     int open(const char* pathname, int flags) const override;
67     int read(int fd, void* buf, std::size_t count) const override;
68     int pread(int fd, void* buf, std::size_t count,
69               off_t offset) const override;
70     int pwrite(int fd, const void* buf, std::size_t count,
71                off_t offset) const override;
72     int close(int fd) const override;
73     void* mmap(void* addr, std::size_t length, int prot, int flags, int fd,
74                off_t offset) const override;
75     int munmap(void* addr, std::size_t length) const override;
76     int getpagesize() const override;
77     int ioctl(int fd, unsigned long request, void* param) const override;
78     int poll(struct pollfd* fds, nfds_t nfds, int timeout) const override;
79     int socket(int domain, int type, int protocol) const override;
80     int connect(int sockfd, const struct sockaddr* addr,
81                 socklen_t addrlen) const override;
82     ssize_t sendfile(int out_fd, int in_fd, off_t* offset,
83                      size_t count) const override;
84     int getaddrinfo(const char* node, const char* service,
85                     const struct addrinfo* hints,
86                     struct addrinfo** res) const override;
87     void freeaddrinfo(struct addrinfo* res) const override;
88     /* returns 0 on failure, or if the file is zero bytes. */
89     std::int64_t getSize(const char* pathname) const override;
90 };
91 
92 inline std::system_error errnoException(const std::string& message)
93 {
94     return std::system_error(errno, std::generic_category(), message);
95 }
96 
97 /** @brief Default instantiation of sys */
98 extern SysImpl sys_impl;
99 
100 } // namespace internal
101