William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 1 | #pragma once |
| 2 | #include <cstddef> |
| 3 | #include <fcntl.h> |
William A. Kennington III | 1151c6d | 2022-02-08 15:11:12 -0800 | [diff] [blame] | 4 | #include <optional> |
Patrick Williams | 68975b9 | 2022-04-27 16:00:26 -0500 | [diff] [blame] | 5 | #include <span> |
William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 6 | #include <stdplus/flags.hpp> |
William A. Kennington III | 891e6a3 | 2022-05-17 16:35:03 -0700 | [diff] [blame^] | 7 | #include <sys/mman.h> |
William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 8 | #include <sys/socket.h> |
William A. Kennington III | 1151c6d | 2022-02-08 15:11:12 -0800 | [diff] [blame] | 9 | #include <tuple> |
William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 10 | |
| 11 | namespace stdplus |
| 12 | { |
| 13 | namespace fd |
| 14 | { |
| 15 | |
| 16 | enum class RecvFlag : int |
| 17 | { |
| 18 | DontWait = MSG_DONTWAIT, |
| 19 | ErrQueue = MSG_ERRQUEUE, |
| 20 | OutOfBounds = MSG_OOB, |
| 21 | Peek = MSG_PEEK, |
| 22 | Trunc = MSG_TRUNC, |
| 23 | WaitAll = MSG_WAITALL, |
| 24 | }; |
| 25 | using RecvFlags = BitFlags<int, RecvFlag>; |
| 26 | |
| 27 | enum class SendFlag : int |
| 28 | { |
| 29 | Confirm = MSG_CONFIRM, |
| 30 | DontRoute = MSG_DONTROUTE, |
| 31 | DontWait = MSG_DONTWAIT, |
| 32 | EndOfRecord = MSG_EOR, |
| 33 | More = MSG_MORE, |
| 34 | NoSignal = MSG_NOSIGNAL, |
| 35 | OutOfBounds = MSG_OOB, |
| 36 | }; |
| 37 | using SendFlags = BitFlags<int, SendFlag>; |
| 38 | |
| 39 | enum class Whence : int |
| 40 | { |
| 41 | Set = SEEK_SET, |
| 42 | Cur = SEEK_CUR, |
| 43 | End = SEEK_END, |
| 44 | }; |
| 45 | |
| 46 | enum class SockLevel : int |
| 47 | { |
| 48 | Socket = SOL_SOCKET, |
| 49 | }; |
| 50 | |
| 51 | enum class SockOpt : int |
| 52 | { |
| 53 | Debug = SO_DEBUG, |
| 54 | Broadcast = SO_BROADCAST, |
| 55 | ReuseAddr = SO_REUSEADDR, |
| 56 | KeepAlive = SO_KEEPALIVE, |
| 57 | Linger = SO_LINGER, |
| 58 | OOBInline = SO_OOBINLINE, |
| 59 | SendBuf = SO_SNDBUF, |
| 60 | RecvBuf = SO_RCVBUF, |
| 61 | DontRoute = SO_DONTROUTE, |
| 62 | RecvLowWait = SO_RCVLOWAT, |
| 63 | RecvTimeout = SO_RCVTIMEO, |
| 64 | SendLowWait = SO_SNDLOWAT, |
| 65 | SendTimeout = SO_SNDTIMEO, |
| 66 | }; |
| 67 | |
| 68 | enum class FdFlag : int |
| 69 | { |
| 70 | CloseOnExec = FD_CLOEXEC, |
| 71 | }; |
| 72 | using FdFlags = BitFlags<int, FdFlag>; |
| 73 | |
| 74 | enum class FileFlag : int |
| 75 | { |
| 76 | Append = O_APPEND, |
| 77 | Async = O_ASYNC, |
| 78 | Direct = O_DIRECT, |
| 79 | NoAtime = O_NOATIME, |
| 80 | NonBlock = O_NONBLOCK, |
| 81 | }; |
| 82 | using FileFlags = BitFlags<int, FileFlag>; |
| 83 | |
William A. Kennington III | 891e6a3 | 2022-05-17 16:35:03 -0700 | [diff] [blame^] | 84 | enum class ProtFlag : int |
| 85 | { |
| 86 | Exec = PROT_EXEC, |
| 87 | Read = PROT_READ, |
| 88 | Write = PROT_WRITE, |
| 89 | }; |
| 90 | using ProtFlags = BitFlags<int, ProtFlag>; |
| 91 | |
| 92 | enum class MMapAccess : int |
| 93 | { |
| 94 | Shared = MAP_SHARED, |
| 95 | Private = MAP_PRIVATE, |
| 96 | }; |
| 97 | |
| 98 | enum class MMapFlag : int |
| 99 | { |
| 100 | }; |
| 101 | |
| 102 | class MMapFlags : public BitFlags<int, MMapFlag> |
| 103 | { |
| 104 | public: |
| 105 | inline MMapFlags(MMapAccess access) : |
| 106 | BitFlags<int, MMapFlag>(static_cast<int>(access)) |
| 107 | { |
| 108 | } |
| 109 | |
| 110 | inline MMapFlags(BitFlags<int, MMapFlag> flags) : |
| 111 | BitFlags<int, MMapFlag>(flags) |
| 112 | { |
| 113 | } |
| 114 | }; |
| 115 | |
| 116 | class MMap; |
| 117 | |
William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 118 | class Fd |
| 119 | { |
| 120 | public: |
| 121 | virtual ~Fd() = default; |
| 122 | |
Patrick Williams | 68975b9 | 2022-04-27 16:00:26 -0500 | [diff] [blame] | 123 | virtual std::span<std::byte> read(std::span<std::byte> buf) = 0; |
| 124 | virtual std::span<std::byte> recv(std::span<std::byte> buf, |
| 125 | RecvFlags flags) = 0; |
| 126 | virtual std::span<const std::byte> |
| 127 | write(std::span<const std::byte> data) = 0; |
| 128 | virtual std::span<const std::byte> send(std::span<const std::byte> data, |
| 129 | SendFlags flags) = 0; |
William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 130 | virtual size_t lseek(off_t offset, Whence whence) = 0; |
| 131 | virtual void truncate(off_t size) = 0; |
Patrick Williams | 68975b9 | 2022-04-27 16:00:26 -0500 | [diff] [blame] | 132 | virtual void bind(std::span<const std::byte> sockaddr) = 0; |
William A. Kennington III | 1151c6d | 2022-02-08 15:11:12 -0800 | [diff] [blame] | 133 | virtual void listen(int backlog) = 0; |
Patrick Williams | 68975b9 | 2022-04-27 16:00:26 -0500 | [diff] [blame] | 134 | virtual std::tuple<std::optional<int>, std::span<std::byte>> |
| 135 | accept(std::span<std::byte> sockaddr) = 0; |
William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 136 | virtual void setsockopt(SockLevel level, SockOpt optname, |
Patrick Williams | 68975b9 | 2022-04-27 16:00:26 -0500 | [diff] [blame] | 137 | std::span<const std::byte> opt) = 0; |
William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 138 | virtual int ioctl(unsigned long id, void* data) = 0; |
| 139 | virtual int constIoctl(unsigned long id, void* data) const = 0; |
| 140 | virtual void fcntlSetfd(FdFlags flags) = 0; |
| 141 | virtual FdFlags fcntlGetfd() const = 0; |
| 142 | virtual void fcntlSetfl(FileFlags flags) = 0; |
| 143 | virtual FileFlags fcntlGetfl() const = 0; |
William A. Kennington III | 891e6a3 | 2022-05-17 16:35:03 -0700 | [diff] [blame^] | 144 | |
| 145 | protected: |
| 146 | virtual std::span<std::byte> mmap(std::span<std::byte> window, |
| 147 | ProtFlags prot, MMapFlags flags, |
| 148 | off_t offset) = 0; |
| 149 | virtual void munmap(std::span<std::byte> window) = 0; |
| 150 | friend class MMap; |
William A. Kennington III | eac9d47 | 2020-08-03 13:57:14 -0700 | [diff] [blame] | 151 | }; |
| 152 | |
| 153 | } // namespace fd |
| 154 | |
| 155 | using fd::Fd; |
| 156 | |
| 157 | } // namespace stdplus |