Convert auth-client to libevent
This commit is contained in:
2
Makefile
2
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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
32
crypto.cc
32
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_);
|
||||
}
|
||||
|
||||
20
crypto.h
20
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_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user