From 04d1c5e25e35549abba80c0495ec7cfd8c5544a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eckl=2C=20M=C3=A1t=C3=A9?= <ecklm94@gmail.com>
Date: Fri, 27 May 2016 10:26:47 +0200
Subject: [PATCH] Recvfrom exeptiont dob, ha hiba van (#11)

---
 main.cpp                    | 24 +++++++++++++++++-------
 src/IPC_US_communicator.cpp |  4 ----
 src/dns_server.cpp          |  8 +++++---
 src/udp_socket_wp.cpp       |  9 ++-------
 4 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/main.cpp b/main.cpp
index 0071412..fabae05 100644
--- a/main.cpp
+++ b/main.cpp
@@ -132,7 +132,14 @@ int main(int argc, char *argv[])
 		for(command c : command_list)
 		{
 			comm_link.send_data(get_readable_command(c));
-			log_on_demand(LOG_INFO, "Answer received: %s", comm_link.recv_data().c_str());
+			try {
+				log_on_demand(LOG_INFO, "Answer received: %s", comm_link.recv_data().c_str());
+			}
+			catch(const char*) {
+				log_on_demand(LOG_ERR, 
+						"Answer not received within timeout time. "
+						"Server may have already been killed.");
+			}
 		}
 		exit(EXIT_SUCCESS);
 	}
@@ -173,13 +180,16 @@ int main(int argc, char *argv[])
 	bool stop = false;
 	while(!stop)
 	{
-		if(comm_link.recv_data() == "kill")
-		{
-			comm_link.send_data("go to hell!");
-			stop = true;
+		try {
+			if(comm_link.recv_data() == "kill")
+			{
+				comm_link.send_data("go to hell!");
+				stop = true;
+			}
+			else
+				comm_link.send_data("nothing has happened");
 		}
-		else
-			comm_link.send_data("nothing has happened");
+		catch(const char*) { }
 	}
 // ---------------- SERVE END -------------------------
 
diff --git a/src/IPC_US_communicator.cpp b/src/IPC_US_communicator.cpp
index 4f552a1..35973fe 100644
--- a/src/IPC_US_communicator.cpp
+++ b/src/IPC_US_communicator.cpp
@@ -43,10 +43,6 @@ IPC_US_communicator::~IPC_US_communicator() {
 
 std::string IPC_US_communicator::recv_data() {
 	udp_packet_wp data = comm_sock.recvfrom_wp(NULL, NULL);
-	if(data.get_buf() == 0)
-	{
-		// May throw some exception...
-	}
 	return data.get_buf();
 }
 
diff --git a/src/dns_server.cpp b/src/dns_server.cpp
index d06c37c..e4598cf 100644
--- a/src/dns_server.cpp
+++ b/src/dns_server.cpp
@@ -77,9 +77,11 @@ void dns_server::serve_one_request() {
 	struct sockaddr_in6 sender;
 	socklen_t slen = sizeof(sender);
 	dns_message_em query;
-	udp_packet_wp received_packet = this->socket.recvfrom_wp((sockaddr*) &sender, &slen);
-	if(received_packet.get_buf_len() <= 0)
-		return;
+	udp_packet_wp received_packet;
+	try {
+		received_packet = this->socket.recvfrom_wp((sockaddr*) &sender, &slen);
+	}
+	catch(const char*) { return; }
 	try {
 		received_packet>>query;
 	}
diff --git a/src/udp_socket_wp.cpp b/src/udp_socket_wp.cpp
index 7a76db5..6d2e0fc 100644
--- a/src/udp_socket_wp.cpp
+++ b/src/udp_socket_wp.cpp
@@ -48,13 +48,8 @@ udp_packet_wp udp_socket_wp::recvfrom_wp(sockaddr *sender_address, socklen_t* se
 	ssize_t len;
 	if((len = recvfrom(fd, buf, MAX_UDP_PACKET_SIZE_BYTES, MSG_WAITFORONE,
 			     sender_address, sender_address_len)) < 0)
-	{
-		if(verbose)
-			PERROR_ON_DEMAND("recvfrom");
-		msg.set_buf(NULL, 0);
-	}
-	else
-		msg.set_buf(buf, len);
+		throw strerror(errno);
+	msg.set_buf(buf, len);
 	msg.address.set_sockaddr(sender_address, (sender_address_len != NULL) ? *sender_address_len : 0);
 	return msg;
 }
-- 
GitLab