Convert auth-client to libevent

This commit is contained in:
Ian Gulliver
2015-02-07 17:07:31 +01:00
parent 88c3c69e52
commit 14cfbb0372
4 changed files with 49 additions and 22 deletions

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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_);
}

View File

@@ -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_;
};