mirror of https://github.com/oxen-io/lokinet
don't make tcp event code epoll specific
This commit is contained in:
parent
957a5ed833
commit
de17324012
|
@ -555,7 +555,7 @@ main(int argc, char *argv[])
|
|||
|
||||
// Base32Decode(rcfname, addr);
|
||||
llarp::LogInfo("Addr ", addr);
|
||||
llarp::routing::DHTMessage *msg = new llarp::routing::DHTMessage();
|
||||
|
||||
// uint64_t txid, const llarp::service::Address& addr
|
||||
// FIXME: new API?
|
||||
// msg->M.push_back(new llarp::dht::FindIntroMessage(tag, 1));
|
||||
|
|
35
llarp/ev.cpp
35
llarp/ev.cpp
|
@ -175,3 +175,38 @@ llarp_tcp_conn_close(struct llarp_tcp_conn *conn)
|
|||
// delete conn
|
||||
delete conn;
|
||||
}
|
||||
|
||||
namespace llarp
|
||||
{
|
||||
int
|
||||
tcp_serv::read(void *, size_t)
|
||||
{
|
||||
int new_fd = ::accept(fd, nullptr, nullptr);
|
||||
if(new_fd == -1)
|
||||
{
|
||||
llarp::LogError("failed to accept on ", fd, ":", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
llarp_tcp_conn *conn = new llarp_tcp_conn;
|
||||
// zero out callbacks
|
||||
conn->tick = nullptr;
|
||||
conn->closed = nullptr;
|
||||
conn->read = nullptr;
|
||||
// build handler
|
||||
llarp::tcp_conn *connimpl = new tcp_conn(new_fd, conn);
|
||||
conn->impl = connimpl;
|
||||
conn->loop = loop;
|
||||
if(loop->add_ev(connimpl, true))
|
||||
{
|
||||
// call callback
|
||||
if(tcp->accepted)
|
||||
tcp->accepted(tcp, conn);
|
||||
return 0;
|
||||
}
|
||||
// cleanup error
|
||||
delete conn;
|
||||
delete connimpl;
|
||||
return -1;
|
||||
}
|
||||
} // namespace llarp
|
68
llarp/ev.hpp
68
llarp/ev.hpp
|
@ -212,6 +212,74 @@ namespace llarp
|
|||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
struct tcp_conn : public ev_io
|
||||
{
|
||||
llarp_tcp_conn* tcp;
|
||||
tcp_conn(int fd, llarp_tcp_conn* conn)
|
||||
: ev_io(fd, new LosslessWriteQueue_t()), tcp(conn)
|
||||
{
|
||||
}
|
||||
|
||||
virtual int
|
||||
do_write(const void* buf, size_t sz)
|
||||
{
|
||||
return ::send(fd, buf, sz, MSG_NOSIGNAL); // ignore sigpipe
|
||||
}
|
||||
|
||||
int
|
||||
read(void* buf, size_t sz)
|
||||
{
|
||||
ssize_t amount = ::read(fd, buf, sz);
|
||||
if(amount > 0)
|
||||
{
|
||||
if(tcp->read)
|
||||
tcp->read(tcp, buf, amount);
|
||||
}
|
||||
else
|
||||
{
|
||||
// error
|
||||
llarp_tcp_conn_close(tcp);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
tick()
|
||||
{
|
||||
if(tcp->tick)
|
||||
tcp->tick(tcp);
|
||||
}
|
||||
|
||||
int
|
||||
sendto(const sockaddr*, const void*, size_t)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
struct tcp_serv : public ev_io
|
||||
{
|
||||
llarp_ev_loop* loop;
|
||||
llarp_tcp_acceptor* tcp;
|
||||
tcp_serv(llarp_ev_loop* l, int fd, llarp_tcp_acceptor* t)
|
||||
: ev_io(fd), loop(l), tcp(t)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
tick()
|
||||
{
|
||||
if(tcp->tick)
|
||||
tcp->tick(tcp);
|
||||
}
|
||||
|
||||
/// actually does accept() :^)
|
||||
virtual int
|
||||
read(void*, size_t);
|
||||
};
|
||||
|
||||
}; // namespace llarp
|
||||
|
||||
struct llarp_ev_loop
|
||||
|
|
|
@ -18,104 +18,6 @@
|
|||
|
||||
namespace llarp
|
||||
{
|
||||
struct tcp_conn : public ev_io
|
||||
{
|
||||
llarp_tcp_conn* tcp;
|
||||
tcp_conn(int fd, llarp_tcp_conn* conn)
|
||||
: ev_io(fd, new LosslessWriteQueue_t()), tcp(conn)
|
||||
{
|
||||
}
|
||||
|
||||
virtual int
|
||||
do_write(const void* buf, size_t sz)
|
||||
{
|
||||
return ::send(fd, buf, sz, MSG_NOSIGNAL); // ignore sigpipe
|
||||
}
|
||||
|
||||
int
|
||||
read(void* buf, size_t sz)
|
||||
{
|
||||
ssize_t amount = ::read(fd, buf, sz);
|
||||
if(amount > 0)
|
||||
{
|
||||
if(tcp->read)
|
||||
tcp->read(tcp, buf, amount);
|
||||
}
|
||||
else
|
||||
{
|
||||
// error
|
||||
llarp_tcp_conn_close(tcp);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
tick()
|
||||
{
|
||||
if(tcp->tick)
|
||||
tcp->tick(tcp);
|
||||
}
|
||||
|
||||
int
|
||||
sendto(const sockaddr*, const void*, size_t)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
struct tcp_serv : public ev_io
|
||||
{
|
||||
llarp_ev_loop* loop;
|
||||
llarp_tcp_acceptor* tcp;
|
||||
tcp_serv(llarp_ev_loop* l, int fd, llarp_tcp_acceptor* t)
|
||||
: ev_io(fd), loop(l), tcp(t)
|
||||
{
|
||||
// TODO: handle fail
|
||||
assert(listen(fd, 5) != -1);
|
||||
}
|
||||
|
||||
void
|
||||
tick()
|
||||
{
|
||||
if(tcp->tick)
|
||||
tcp->tick(tcp);
|
||||
}
|
||||
|
||||
/// actually does accept() :^)
|
||||
int
|
||||
read(void*, size_t)
|
||||
{
|
||||
int new_fd = ::accept(fd, nullptr, nullptr);
|
||||
if(new_fd == -1)
|
||||
{
|
||||
llarp::LogError("failed to accept on ", fd, ":", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
llarp_tcp_conn* conn = new llarp_tcp_conn;
|
||||
// zero out callbacks
|
||||
conn->tick = nullptr;
|
||||
conn->closed = nullptr;
|
||||
conn->read = nullptr;
|
||||
// build handler
|
||||
llarp::tcp_conn* connimpl = new tcp_conn(new_fd, conn);
|
||||
conn->impl = connimpl;
|
||||
conn->loop = loop;
|
||||
if(loop->add_ev(connimpl, true))
|
||||
{
|
||||
// call callback
|
||||
if(tcp->accepted)
|
||||
tcp->accepted(tcp, conn);
|
||||
return 0;
|
||||
}
|
||||
// cleanup error
|
||||
delete conn;
|
||||
delete connimpl;
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
struct udp_listener : public ev_io
|
||||
{
|
||||
llarp_udp_io* udp;
|
||||
|
@ -425,7 +327,12 @@ struct llarp_epoll_loop : public llarp_ev_loop
|
|||
{
|
||||
sz = sizeof(sockaddr_un);
|
||||
}
|
||||
if(bind(fd, bindaddr, sz) == -1)
|
||||
if(::bind(fd, bindaddr, sz) == -1)
|
||||
{
|
||||
::close(fd);
|
||||
return nullptr;
|
||||
}
|
||||
if(::listen(fd, 5) == -1)
|
||||
{
|
||||
::close(fd);
|
||||
return nullptr;
|
||||
|
|
Loading…
Reference in New Issue