implemented socket pair
parent
d08755bc28
commit
90c84c0a74
|
@ -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} {}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue