From 14cfbb03724e2e964df4a12e25279d5e64fed10c Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sat, 7 Feb 2015 17:07:31 +0100 Subject: [PATCH] Convert auth-client to libevent --- Makefile | 2 +- auth-client.cc | 17 ++--------------- crypto.cc | 32 ++++++++++++++++++++++++++++++-- crypto.h | 20 ++++++++++++++++---- 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 856b2df..deef3c2 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ all: auth-client auth-server gen-key gen-keypair -%.o: %.cc +%.o: %.cc *.h g++ -I/usr/local/include -std=c++11 -c -o $@ $< auth-client: auth-client.o crypto.o tlv.o diff --git a/auth-client.cc b/auth-client.cc index 883466a..8d4ab5e 100644 --- a/auth-client.cc +++ b/auth-client.cc @@ -67,19 +67,6 @@ int main(int argc, char *argv[]) { server_public_key_file >> server_public_key; } - int fd; - { - struct addrinfo* res; - int ret = getaddrinfo(server_address.c_str(), server_port.c_str(), NULL, &res); - if (ret) { - std::cerr << "Failed to resolve server_address: " << gai_strerror(ret) << std::endl; - return 1; - } - fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); - if (connect(fd, (struct sockaddr*)res->ai_addr, res->ai_addrlen)) { - perror("connect"); - return 1; - } - freeaddrinfo(res); - } + auto client = CryptoPubClient::FromHostname(server_address, server_port); + client->Loop(); } diff --git a/crypto.cc b/crypto.cc index a7d9736..90c01a3 100644 --- a/crypto.cc +++ b/crypto.cc @@ -28,7 +28,7 @@ void CryptoBase::GenKeyPair(std::string* secret_key, std::string* public_key) { } -CryptoPubServer::CryptoPubServer(const std::string secret_key) +CryptoPubServer::CryptoPubServer(const std::string& secret_key) : secret_key_(secret_key), event_base_(event_base_new()) { struct sockaddr_in6 server_addr = {0}; @@ -66,7 +66,7 @@ void CryptoPubServer::Loop() { } -CryptoPubServerConnection::CryptoPubServerConnection(struct bufferevent* bev, const std::string secret_key) +CryptoPubServerConnection::CryptoPubServerConnection(struct bufferevent* bev, const std::string& secret_key) : bev_(bev), secret_key_(secret_key), state_(AWAITING_HANDSHAKE) { @@ -89,3 +89,31 @@ void CryptoPubServerConnection::OnError(struct bufferevent* bev, const short wha auto this_ = (CryptoPubServerConnection*)this__; delete this_; } + + +CryptoPubClient::CryptoPubClient(struct sockaddr* addr, socklen_t addrlen) + : event_base_(event_base_new()), + bev_(bufferevent_socket_new(event_base_, -1, BEV_OPT_CLOSE_ON_FREE)) { + bufferevent_socket_connect(bev_, addr, addrlen); +} + +CryptoPubClient::~CryptoPubClient() { + bufferevent_free(bev_); + event_base_free(event_base_); +} + +CryptoPubClient* CryptoPubClient::FromHostname(const std::string& server_address, const std::string& server_port) { + struct addrinfo* res; + int gai_ret = getaddrinfo(server_address.c_str(), server_port.c_str(), NULL, &res); + if (gai_ret) { + std::cerr << "Failed to resolve server_address: " << gai_strerror(gai_ret) << std::endl; + return nullptr; + } + auto ret = new CryptoPubClient((struct sockaddr*)res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); + return ret; +} + +void CryptoPubClient::Loop() { + event_base_dispatch(event_base_); +} diff --git a/crypto.h b/crypto.h index 69d38cd..6ed161b 100644 --- a/crypto.h +++ b/crypto.h @@ -14,7 +14,7 @@ class CryptoBase { class CryptoPubServerConnection : public CryptoBase { public: - CryptoPubServerConnection(struct bufferevent* bev, const std::string secret_key); + CryptoPubServerConnection(struct bufferevent* bev, const std::string& secret_key); ~CryptoPubServerConnection(); static void OnReadable(struct bufferevent* bev, void* this__); static void OnError(struct bufferevent* bev, const short what, void* this__); @@ -33,14 +33,26 @@ class CryptoPubServerConnection : public CryptoBase { class CryptoPubServer : public CryptoBase { public: - CryptoPubServer(const std::string secret_key); + CryptoPubServer(const std::string& secret_key); ~CryptoPubServer(); static void OnNewConn(struct evconnlistener* listener, int fd, struct sockaddr* client_addr, int client_addrlen, void* this__); void Loop(); private: - struct event_base *event_base_; - struct evconnlistener *listener_; + struct event_base* event_base_; + struct evconnlistener* listener_; const std::string secret_key_; }; + +class CryptoPubClient : public CryptoBase { + public: + CryptoPubClient(struct sockaddr* addr, socklen_t addrlen); + ~CryptoPubClient(); + static CryptoPubClient* FromHostname(const std::string& server_address, const std::string& server_port); + void Loop(); + + private: + struct event_base* event_base_; + struct bufferevent* bev_; +};