implemented socket pair

fb-makefile
Claudius Holeksa 2022-01-08 15:43:48 +01:00
parent d08755bc28
commit 90c84c0a74
6 changed files with 65 additions and 0 deletions

View File

@ -247,6 +247,24 @@ Conveyor<Own<NetworkAddress>> UnixNetwork::parseAddress(const std::string &path,
event_port, path, port_hint, std::move(addresses))};
}
ErrorOr<SocketPair> UnixNetwork::socketPair() {
int sv[2];
int rc = ::socketpair(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
0, sv);
if (rc < 0) {
return criticalError("Failed to create");
}
SocketPair socket_pair;
socket_pair.stream[0] =
heap<UnixIoStream>(event_port, sv[0], 0, EPOLLIN | EPOLLOUT);
socket_pair.stream[1] =
heap<UnixIoStream>(event_port, sv[1], 0, EPOLLIN | EPOLLOUT);
return socket_pair;
}
UnixIoProvider::UnixIoProvider(UnixEventPort &port_ref, Own<EventPort> port)
: event_port{port_ref}, event_loop{std::move(port)}, unix_network{
port_ref} {}

View File

@ -419,6 +419,8 @@ public:
Conveyor<Own<NetworkAddress>> parseAddress(const std::string &address,
uint16_t port_hint = 0) override;
ErrorOr<SocketPair> socketPair() override;
};
class UnixIoProvider final : public IoProvider {

View File

@ -92,6 +92,11 @@ public:
virtual Conveyor<Own<IoStream>> accept() = 0;
};
class SocketPair {
public:
std::array<Own<IoStream>, 2> stream;
};
class NetworkAddress {
public:
virtual ~NetworkAddress() = default;
@ -114,6 +119,11 @@ public:
virtual Conveyor<Own<NetworkAddress>>
parseAddress(const std::string &addr, uint16_t port_hint = 0) = 0;
/**
* Creates an unnamed pair of bidirectional fds
*/
virtual ErrorOr<SocketPair> socketPair() = 0;
};
class IoProvider {

View File

@ -260,6 +260,10 @@ Conveyor<Own<NetworkAddress>> TlsNetwork::parseAddress(const std::string &addr,
});
}
ErrorOr<SocketPair> TlsNetwork::socketPair(){
return criticalError("Unimplemented");
}
std::optional<Own<TlsNetwork>> setupTlsNetwork(Network &network) {
return std::nullopt;
}

View File

@ -62,6 +62,8 @@ public:
Conveyor<Own<NetworkAddress>> parseAddress(const std::string &addr,
uint16_t port = 0) override;
ErrorOr<SocketPair> socketPair() override;
};
std::optional<Own<TlsNetwork>> setupTlsNetwork(Network &network);

29
test/io.cpp Normal file
View File

@ -0,0 +1,29 @@
#include "suite/suite.h"
#include "source/forstio/io.h"
namespace {
SAW_TEST("Io Socket Pair"){
using namespace saw;
auto err_or_aio = setupAsyncIo();
SAW_EXPECT(!err_or_aio.isError(), "Async Io setup failed");
AsyncIoContext& aio = err_or_aio.value();
WaitScope wait_scope{aio.event_loop};
SAW_EXPECT(aio.io, "Faulty async io context created");
auto err_or_sp = aio.io->network().socketPair();
SAW_EXPECT(!err_or_sp.isError(), "Couldn't create socket pair");
SocketPair& sp = err_or_sp.value();
uint8_t buffer_out[3] = {1,2,3};
sp.stream[0]->write(buffer_out,3);
uint8_t buffer_in[3];
sp.stream[1]->read(buffer_in, 3);
SAW_EXPECT(buffer_in[0] == 1, "Element 1 failed");
SAW_EXPECT(buffer_in[1] == 2, "Element 2 failed");
SAW_EXPECT(buffer_in[2] == 3, "Element 3 failed");
}
}