blob: 4d9553d2273895e4edda8644efc9ce6b8a986f9e [file] [log] [blame]
William A. Kennington IIIeac9d472020-08-03 13:57:14 -07001#pragma once
2#include <cstddef>
3#include <fcntl.h>
William A. Kennington III1151c6d2022-02-08 15:11:12 -08004#include <optional>
Patrick Williams68975b92022-04-27 16:00:26 -05005#include <span>
William A. Kennington IIIeac9d472020-08-03 13:57:14 -07006#include <stdplus/flags.hpp>
William A. Kennington III891e6a32022-05-17 16:35:03 -07007#include <sys/mman.h>
William A. Kennington IIIeac9d472020-08-03 13:57:14 -07008#include <sys/socket.h>
William A. Kennington III1151c6d2022-02-08 15:11:12 -08009#include <tuple>
William A. Kennington IIIeac9d472020-08-03 13:57:14 -070010
11namespace stdplus
12{
13namespace fd
14{
15
16enum 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};
25using RecvFlags = BitFlags<int, RecvFlag>;
26
27enum 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};
37using SendFlags = BitFlags<int, SendFlag>;
38
39enum class Whence : int
40{
41 Set = SEEK_SET,
42 Cur = SEEK_CUR,
43 End = SEEK_END,
44};
45
46enum class SockLevel : int
47{
48 Socket = SOL_SOCKET,
49};
50
51enum 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
68enum class FdFlag : int
69{
70 CloseOnExec = FD_CLOEXEC,
71};
72using FdFlags = BitFlags<int, FdFlag>;
73
74enum 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};
82using FileFlags = BitFlags<int, FileFlag>;
83
William A. Kennington III891e6a32022-05-17 16:35:03 -070084enum class ProtFlag : int
85{
86 Exec = PROT_EXEC,
87 Read = PROT_READ,
88 Write = PROT_WRITE,
89};
90using ProtFlags = BitFlags<int, ProtFlag>;
91
92enum class MMapAccess : int
93{
94 Shared = MAP_SHARED,
95 Private = MAP_PRIVATE,
96};
97
98enum class MMapFlag : int
99{
100};
101
102class 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
116class MMap;
117
William A. Kennington IIIeac9d472020-08-03 13:57:14 -0700118class Fd
119{
120 public:
121 virtual ~Fd() = default;
122
Patrick Williams68975b92022-04-27 16:00:26 -0500123 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 IIIeac9d472020-08-03 13:57:14 -0700130 virtual size_t lseek(off_t offset, Whence whence) = 0;
131 virtual void truncate(off_t size) = 0;
Patrick Williams68975b92022-04-27 16:00:26 -0500132 virtual void bind(std::span<const std::byte> sockaddr) = 0;
William A. Kennington III1151c6d2022-02-08 15:11:12 -0800133 virtual void listen(int backlog) = 0;
Patrick Williams68975b92022-04-27 16:00:26 -0500134 virtual std::tuple<std::optional<int>, std::span<std::byte>>
135 accept(std::span<std::byte> sockaddr) = 0;
William A. Kennington IIIeac9d472020-08-03 13:57:14 -0700136 virtual void setsockopt(SockLevel level, SockOpt optname,
Patrick Williams68975b92022-04-27 16:00:26 -0500137 std::span<const std::byte> opt) = 0;
William A. Kennington IIIeac9d472020-08-03 13:57:14 -0700138 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 III891e6a32022-05-17 16:35:03 -0700144
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 IIIeac9d472020-08-03 13:57:14 -0700151};
152
153} // namespace fd
154
155using fd::Fd;
156
157} // namespace stdplus