From 98ba9fd332c2eba4d9a4916efda4db43bb9df7ac Mon Sep 17 00:00:00 2001
From: Benny Baumann <BenBE@geshi.org>
Date: Sun, 3 Jan 2021 16:25:25 +0100
Subject: [PATCH] chg: Use auto_fd as early as possible

---
 src/net/tcp_server_socket.cpp | 37 +++++++++++++++++++++--------------
 src/net/tcp_server_socket.hpp |  2 +-
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/src/net/tcp_server_socket.cpp b/src/net/tcp_server_socket.cpp
index 7a555c2..0af3789 100644
--- a/src/net/tcp_server_socket.cpp
+++ b/src/net/tcp_server_socket.cpp
@@ -4,53 +4,60 @@
  *  Created on: 02.01.2021
  *      Author: doralitze
  */
-
 #include "net/tcp_server_socket.hpp"
 
-#include <arpa/inet.h>
-#include <unistd.h>
 #include <fcntl.h>
-#include <functional>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
+
+#include <arpa/inet.h>
+
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <netinet/in.h>
 
+#include <functional>
+
 #include "macros.hpp"
+#include "net/socketaddress.hpp"
 
 
 namespace rmrf::net {
 
 tcp_server_socket::tcp_server_socket(uint16_t port, incoming_client_listener_type client_listener_) :
 		ss{nullptr}, client_listener(client_listener_), number_of_connected_clients(0) {
-	auto raw_socket_fd = socket(AF_INET, SOCK_STREAM, 0);
-	if(raw_socket_fd < 0) {
+	auto_fd raw_socket_fd{socket(AF_INET6, SOCK_STREAM, 0)};
+	if(!raw_socket_fd.valid()) {
 		// TODO implement propper error handling
 		throw netio_exception("Failed to create socket fd.");
 	}
 
-	struct sockaddr_in addr;
-	addr.sin_family = AF_INET;
-	addr.sin_port = htons(port);
-	addr.sin_addr.s_addr = INADDR_ANY; // TODO FIXME
-	if (bind(raw_socket_fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) {
+	sockaddr_in6 addr;
+	addr.sin6_family = AF_INET6;
+	addr.sin6_port = htons(port);
+	addr.sin6_addr = IN6ADDR_ANY_INIT;
+	socketaddr sa{addr};
+
+	if (bind(raw_socket_fd.get(), sa.ptr(), sa.size()) != 0) {
 		std::string msg = "Failed to bind to all addresses (FIXME)";
 		if (port < 1024) {
-			msg += "\tYou tried to bind to a port smaller than 1024. Are you root?";
+			msg += "\nYou tried to bind to a port smaller than 1024. Are you root?";
 		}
+
 		throw netio_exception(msg);
 	}
 
 	// Append the non blocking flag to the file state of the socket fd.
 	// This might be linux only. We should check that
-	fcntl(raw_socket_fd, F_SETFL, fcntl(raw_socket_fd, F_GETFL, 0) | O_NONBLOCK);
-	if (listen(raw_socket_fd, 5) == -1) {
+	fcntl(raw_socket_fd.get(), F_SETFL, fcntl(raw_socket_fd.get(), F_GETFL, 0) | O_NONBLOCK);
+	if (listen(raw_socket_fd.get(), 5) == -1) {
 		throw netio_exception("Failed to enable listening mode for raw socket");
 	}
 
-	this->ss = std::make_shared<async_server_socket>(auto_fd(raw_socket_fd));
+	this->ss = std::make_shared<async_server_socket>(std::forward<auto_fd>(raw_socket_fd));
+
 	using namespace std::placeholders;
 	this->ss->set_accept_handler(std::bind(&tcp_server_socket::await_raw_socket_incomming, this, _1, _2));
 }
diff --git a/src/net/tcp_server_socket.hpp b/src/net/tcp_server_socket.hpp
index 1c28fa4..a011b6a 100644
--- a/src/net/tcp_server_socket.hpp
+++ b/src/net/tcp_server_socket.hpp
@@ -20,7 +20,7 @@ class tcp_server_socket : public std::enable_shared_from_this<tcp_server_socket>
 public:
 	typedef std::function<void(tcp_client)> incoming_client_listener_type;
 private:
-	std::shared_ptr<async_server_socket> ss;
+	async_server_socket::self_ptr_type ss;
 	incoming_client_listener_type client_listener;
 	int number_of_connected_clients;
 public:
-- 
GitLab