From 0e0a3eab8b0d88b0023a2f66c49a62901d7ef851 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sat, 7 Feb 2015 16:18:07 -0800 Subject: [PATCH] Shutdown messages and sigint handling. --- auth-client.cc | 4 ++++ auth-server.cc | 4 ++++ crypto.cc | 12 ++++++++++++ crypto.h | 3 +++ 4 files changed, 23 insertions(+) diff --git a/auth-client.cc b/auth-client.cc index 1567c68..e015de2 100644 --- a/auth-client.cc +++ b/auth-client.cc @@ -1,6 +1,8 @@ #include #include +#include + #include "crypto.h" static const struct option long_options[] = { @@ -52,4 +54,6 @@ int main(int argc, char *argv[]) { auto client = CryptoPubClient::FromHostname(server_address, server_port, secret_key, server_public_key, channel_bitrates); client->Loop(); + + std::cerr << "Shutting down" << std::endl; } diff --git a/auth-server.cc b/auth-server.cc index dd56baa..31528b4 100644 --- a/auth-server.cc +++ b/auth-server.cc @@ -1,5 +1,7 @@ #include +#include + #include "crypto.h" static const struct option long_options[] = { @@ -24,4 +26,6 @@ int main(int argc, char *argv[]) { CryptoPubServer server(secret_key); server.Loop(); + + std::cerr << "Shutting down" << std::endl; } diff --git a/crypto.cc b/crypto.cc index fb1fd69..18088eb 100644 --- a/crypto.cc +++ b/crypto.cc @@ -218,6 +218,9 @@ void CryptoPubConnBase::OnReadable() { CryptoPubServer::CryptoPubServer(const std::string& secret_key) : secret_key_(secret_key), event_base_(event_base_new()) { + auto signal_event = evsignal_new(event_base_, SIGINT, &CryptoPubServer::Shutdown_, this); + event_add(signal_event, NULL); + assert(secret_key_.length() == crypto_box_SECRETKEYBYTES); struct sockaddr_in6 server_addr = {0}; @@ -258,6 +261,15 @@ void CryptoPubServer::Loop() { event_base_dispatch(event_base_); } +void CryptoPubServer::Shutdown_(evutil_socket_t sig, short events, void *this__) { + auto this_ = (CryptoPubServer*)this__; + this_->Shutdown(); +} + +void CryptoPubServer::Shutdown() { + event_base_loopexit(event_base_, NULL); +} + CryptoPubServerConnection::CryptoPubServerConnection(struct bufferevent* bev, const std::string& secret_key) : CryptoPubConnBase(secret_key) { diff --git a/crypto.h b/crypto.h index 43d2311..5083643 100644 --- a/crypto.h +++ b/crypto.h @@ -61,8 +61,11 @@ class CryptoPubServer : public CryptoBase { CryptoPubServer(const std::string& secret_key); ~CryptoPubServer(); void Loop(); + void Shutdown(); private: + static void Shutdown_(evutil_socket_t sig, short events, void *this__); + static void OnNewConn_(struct evconnlistener* listener, int fd, struct sockaddr* client_addr, int client_addrlen, void* this__); void OnNewConn(int fd, struct sockaddr* client_addr, int client_addrlen);