diff --git a/include/exceptions/socket_error.h b/include/exceptions/socket_error.h new file mode 100644 index 0000000000000000000000000000000000000000..91e8769c5d2ec1d62acea53eb945b7d71d227d4c --- /dev/null +++ b/include/exceptions/socket_error.h @@ -0,0 +1,20 @@ +/* + * File: socket_error.h + * Author: Eckl Máté <ecklm94@gmail.com> + * + * Created on 2016. május 27., 10:30 + */ + +#include <string> +#include <stdexcept> + +#ifndef SOCKET_ERROR_H +#define SOCKET_ERROR_H + +class socket_error: public std::runtime_error +{ +public: + explicit socket_error(const std::string& msg): std::runtime_error(msg) {} +}; + +#endif /* SOCKET_ERROR_H */ diff --git a/include/udp_socket_wp.h b/include/udp_socket_wp.h index 35f957b394d201a194513374a3f1e2977a42072b..1e5b7b62f198ce05345eae6bbbb2f9e6e719cbbe 100644 --- a/include/udp_socket_wp.h +++ b/include/udp_socket_wp.h @@ -25,6 +25,7 @@ protected: /** * Creates a socket and stores it's file descriptor to fd. * @param __domain The domain in which the socket should be created + * @throws socket_error if something goes wrong. */ void create_socket(int __domain = -1); public: @@ -33,7 +34,7 @@ public: * Creates a new SOCK_DGRAM socket in given domain. * @param __domain Address family of the socket */ - explicit udp_socket_wp(int __domain) { create_socket(__domain); } + explicit udp_socket_wp(int __domain): fd(-1), domain(-1) { create_socket(__domain); } /** * Sets the domain of the socket. @@ -44,6 +45,7 @@ public: /** * Wrapper for setsockopt() function. * @see setsockopt() + * @throws socket_error if setsockopt fails */ void setsockopt_wp (int __level, int __optname, const void *__optval, socklen_t __optlen); @@ -51,6 +53,7 @@ public: /** * Wrapper for bind() function. * @see bind() + * @throws socket_error if bind fails */ void bind_wp(const struct sockaddr *__addr, size_t __len); @@ -64,6 +67,8 @@ public: * Wrapper for recvfrom() function. Reads from the socket to a UDP packet. * @see recvfrom() * @return The UDP packet read form the socket + * @throw const char* exception if there is an error while receiving the packet. + * It contains the cause of the error. */ udp_packet_wp recvfrom_wp(struct sockaddr *sender_address, socklen_t *sender_address_len); diff --git a/main.cpp b/main.cpp index fabae055bf431b53fddef9d15c143ca670c7a4cb..0431d4e54525a70d0354743b8115c6403e579398 100644 --- a/main.cpp +++ b/main.cpp @@ -20,6 +20,7 @@ #include "include/logger.h" #include "include/IPC_US_communicator.h" #include "include/command.h" +#include "include/exceptions/socket_error.h" #define COMM_SOCK_PATH "/var/run/ecklm-dns/" #define RUNNING_USER "dnsuser" @@ -137,7 +138,7 @@ int main(int argc, char *argv[]) } catch(const char*) { log_on_demand(LOG_ERR, - "Answer not received within timeout time. " + "Answer not received within timeout. " "Server may have already been killed."); } } @@ -164,7 +165,13 @@ int main(int argc, char *argv[]) server_address.sin6_addr = in6_addr_any; server_address.sin6_port = htons(port); - server.init(general_sockaddr_wp((sockaddr *) &server_address, sizeof(server_address))); + try { + server.init(general_sockaddr_wp((sockaddr *) &server_address, sizeof(server_address))); + } + catch (socket_error err) { + log_on_demand(LOG_ERR, err.what()); + exit(EXIT_FAILURE); + } if(verbose) { static char addr[INET6_ADDRSTRLEN]; @@ -189,7 +196,7 @@ int main(int argc, char *argv[]) else comm_link.send_data("nothing has happened"); } - catch(const char*) { } + catch(const char*) {} } // ---------------- SERVE END ------------------------- diff --git a/src/IPC_US_communicator.cpp b/src/IPC_US_communicator.cpp index 35973fe83d7626ddb67b04d995bd511ab9aa9f67..95bffef4114feed0b56be7f82d8eedf806366d4f 100644 --- a/src/IPC_US_communicator.cpp +++ b/src/IPC_US_communicator.cpp @@ -11,8 +11,18 @@ #include <unistd.h> #include "../include/IPC_US_communicator.h" +#include "../include/exceptions/socket_error.h" +#include "../include/logger.h" -IPC_US_communicator::IPC_US_communicator(std::string socket_path, const bool master): server(master), comm_sock(AF_UNIX) { +extern logger log_on_demand; + +IPC_US_communicator::IPC_US_communicator(std::string socket_path, const bool master): server(master) { + try { + comm_sock.set_domain(AF_UNIX); + } + catch(socket_error err) { + log_on_demand(LOG_ERR, err.what()); + } std::string master_sock_path = socket_path + "master.sock"; std::string slave_sock_path = socket_path + "slave.sock"; @@ -26,14 +36,24 @@ IPC_US_communicator::IPC_US_communicator(std::string socket_path, const bool mas this->controller_sockaddr.set_sockaddr((sockaddr*) &ipc, sizeof(ipc)); timeval timeout = { 5, 0 }; - comm_sock.setsockopt_wp(SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); - if(master) - { - comm_sock.bind_wp(server_sockaddr); + try { + comm_sock.setsockopt_wp(SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); } - else - { - comm_sock.bind_wp(controller_sockaddr); + catch(socket_error err) { + log_on_demand(LOG_ERR, "Setting timeout for comm_link socket failed: %s.", err.what()); + } + try { + if(master) + { + comm_sock.bind_wp(server_sockaddr); + } + else + { + comm_sock.bind_wp(controller_sockaddr); + } + } + catch(socket_error err) { + log_on_demand(LOG_ERR, "bind: %s.", err.what()); } } diff --git a/src/dns_message.cpp b/src/dns_message.cpp index b7ccc7a682a7bc5e7e36d230209eea6b6bd52ce3..2899ef6684bf6279f75ca039db9d20f3aa14e6d3 100644 --- a/src/dns_message.cpp +++ b/src/dns_message.cpp @@ -89,7 +89,7 @@ void operator<<(udp_packet_wp &dst_packet, const dns_message_em &msg) { dns_additional_size; if(MAX_UDP_PACKET_SIZE_BYTES < full_msg_size) { - // May throw some exception + // Elvileg nem fordulhat elő... return; } diff --git a/src/udp_packet_wp.cpp b/src/udp_packet_wp.cpp index d0580026efde166cd3fa01e0f8fd4f29af6b3701..81e62f90457250520ac71c711de3ad183531c256 100644 --- a/src/udp_packet_wp.cpp +++ b/src/udp_packet_wp.cpp @@ -31,8 +31,7 @@ udp_packet_wp::~udp_packet_wp() { } void udp_packet_wp::set_buf_len(const ssize_t new_buf_len) { - if(new_buf_len>MAX_UDP_PACKET_SIZE_BYTES) { - // May throw some exception... + if(new_buf_len > MAX_UDP_PACKET_SIZE_BYTES) { buf_len = MAX_UDP_PACKET_SIZE_BYTES; } else if(new_buf_len < 0) diff --git a/src/udp_socket_wp.cpp b/src/udp_socket_wp.cpp index 6d2e0fca5d04007e76f0dfd536084135087408f1..30c184a425d559dbc5fe6fc008ba4fab94616f55 100644 --- a/src/udp_socket_wp.cpp +++ b/src/udp_socket_wp.cpp @@ -6,35 +6,34 @@ #include "../include/udp_socket_wp.h" #include "../include/dns_message.h" #include "../include/logger.h" +#include "../include/exceptions/socket_error.h" extern logger log_on_demand; extern bool verbose; void udp_socket_wp::create_socket(int __domain) { - if(domain < 0 || fd < 0) + if(__domain < 0 || fd > 0) { - // May throw some exception... + throw socket_error("Invalid domain or socket has already been initialized."); } if(__domain >= 0) domain = __domain; if((fd = socket(__domain, SOCK_DGRAM, 0)) < 0) { - // May throw some exception... + throw socket_error(strerror(errno)); } } void udp_socket_wp::setsockopt_wp(int __level, int __optname, const void* __optval, socklen_t __optlen) { if (setsockopt(fd, __level, __optname, __optval, __optlen) < 0) { - // May throw some exception - PERROR_ON_DEMAND("setsockopt"); + throw socket_error(strerror(errno)); } } void udp_socket_wp::bind_wp(const struct sockaddr* __addr, size_t __len) { if (bind(fd, __addr, __len) < 0) { - // May throw some exception - PERROR_ON_DEMAND("bind"); + throw socket_error(strerror(errno)); } }