From e116b940b2367b80b46feb85c155e51e5f8aaa26 Mon Sep 17 00:00:00 2001
From: Lorenz Stechauner <lorenz.stechauner@necronda.net>
Date: Fri, 11 Dec 2020 20:34:12 +0100
Subject: [PATCH] Set timeout for client

---
 src/client.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/client.c b/src/client.c
index 8cd8e3f..8c04bd8 100644
--- a/src/client.c
+++ b/src/client.c
@@ -66,6 +66,14 @@ int client_connection_handler(sock *client) {
     clock_gettime(CLOCK_MONOTONIC, &begin);
     print("Connection accepted from %s (%s) [%s]", client_addr_str, client_addr_str, "N/A");
 
+    struct timeval timeout = {.tv_sec = 3600, .tv_usec = 0};
+    if (setsockopt(client->socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) goto set_timeout_err;
+    if (setsockopt(client->socket, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) < 0) {
+        set_timeout_err:
+        print(ERR_STR "Unable to set timeout for socket: %s" CLR_STR, strerror(errno));
+        return 1;
+    }
+
     if (client->enc) {
         client->ssl = SSL_new(client->ctx);
         SSL_set_fd(client->ssl, client->socket);
@@ -79,8 +87,9 @@ int client_connection_handler(sock *client) {
     }
 
     req_num = 0;
-    while (keep_alive && req_num < REQ_PER_CONNECTION) {
-        client_request_handler(client, req_num++);
+    ret = 0;
+    while (ret == 0 && keep_alive && req_num < REQ_PER_CONNECTION) {
+        ret = client_request_handler(client, req_num++);
         log_prefix = log_conn_prefix;
     }