Skip to content
Snippets Groups Projects
Commit 58c2a1dc authored by dnsadmin's avatar dnsadmin
Browse files

Socket wrapper exception-kezelései (#11)

parent 04d1c5e2
Branches
No related tags found
No related merge requests found
/*
* 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 */
......@@ -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);
......
......@@ -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);
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];
......
......@@ -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,7 +36,13 @@ 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 };
try {
comm_sock.setsockopt_wp(SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
}
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);
......@@ -36,6 +52,10 @@ IPC_US_communicator::IPC_US_communicator(std::string socket_path, const bool mas
comm_sock.bind_wp(controller_sockaddr);
}
}
catch(socket_error err) {
log_on_demand(LOG_ERR, "bind: %s.", err.what());
}
}
IPC_US_communicator::~IPC_US_communicator() {
comm_sock.close_socket();
......
......@@ -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;
}
......
......@@ -32,7 +32,6 @@ 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...
buf_len = MAX_UDP_PACKET_SIZE_BYTES;
}
else if(new_buf_len < 0)
......
......@@ -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));
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment