summaryrefslogtreecommitdiffstats
path: root/src/Net/ServerConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Net/ServerConnection.cpp')
-rw-r--r--src/Net/ServerConnection.cpp56
1 files changed, 9 insertions, 47 deletions
diff --git a/src/Net/ServerConnection.cpp b/src/Net/ServerConnection.cpp
index 4ad6215..4f1c78c 100644
--- a/src/Net/ServerConnection.cpp
+++ b/src/Net/ServerConnection.cpp
@@ -57,65 +57,27 @@ void ServerConnection::connectionHeaderReceiveHandler(const void *data, unsigned
enterReceiveLoop();
}
-void ServerConnection::listen(const IPAddress &address) throw(ConnectionException) {
- const int kx_list[] = {GNUTLS_KX_ANON_DH, 0};
-
- if(isConnected())
- disconnect();
-
- int listen_sock = socket(PF_INET, SOCK_STREAM, 0);
- if(listen_sock < 0)
- throw ConnectionException("socket()", std::strerror(errno));
-
- peer = new IPAddress(address);
-
- if(bind(listen_sock, peer->getSockAddr(), peer->getSockAddrLength()) < 0) {
- close(listen_sock);
- delete peer;
-
- throw ConnectionException("bind()", std::strerror(errno));
- }
-
- if(::listen(listen_sock, 1024) < 0) {
- close(listen_sock);
- delete peer;
-
- throw ConnectionException("listen()", std::strerror(errno));
- }
+ServerConnection::ServerConnection(int sock0, const IPAddress &address, gnutls_dh_params_t dh_params)
+: daemon(false) {
+ sock = sock0;
- struct sockaddr_in sa;
- socklen_t addrlen = sizeof(sa);
+ gnutls_anon_allocate_server_credentials(&anoncred);
- sock = accept(listen_sock, reinterpret_cast<struct sockaddr*>(&sa), &addrlen);
- if(sock < 0) {
- close(listen_sock);
- delete peer;
-
- throw ConnectionException("accept()", std::strerror(errno));
- }
- close(listen_sock);
+ gnutls_anon_set_server_dh_params(anoncred, dh_params);
- // Set non-blocking flag
- int flags = fcntl(sock, F_GETFL, 0);
-
- if(flags < 0) {
- close(sock);
-
- throw ConnectionException("fcntl()", std::strerror(errno));
- }
-
- fcntl(sock, F_SETFL, flags | O_NONBLOCK);
-
- *peer = IPAddress(address);
+ peer = new IPAddress(address);
gnutls_init(&session, GNUTLS_SERVER);
gnutls_set_default_priority(session);
+
+ const int kx_list[] = {GNUTLS_KX_ANON_DH, 0};
gnutls_kx_set_priority(session, kx_list);
gnutls_credentials_set(session, GNUTLS_CRD_ANON, anoncred);
+ gnutls_transport_set_lowat(session, 0);
gnutls_transport_set_ptr(session, reinterpret_cast<gnutls_transport_ptr_t>(sock));
handshake();