summaryrefslogtreecommitdiff
path: root/nDPIsrvd.c
diff options
context:
space:
mode:
Diffstat (limited to 'nDPIsrvd.c')
-rw-r--r--nDPIsrvd.c112
1 files changed, 57 insertions, 55 deletions
diff --git a/nDPIsrvd.c b/nDPIsrvd.c
index 437ef5616..424419c9e 100644
--- a/nDPIsrvd.c
+++ b/nDPIsrvd.c
@@ -108,6 +108,7 @@ static int fcntl_add_flags(int fd, int flags);
static int fcntl_del_flags(int fd, int flags);
static int add_in_event_fd(int epollfd, int fd);
static int add_in_event(int epollfd, struct remote_desc * const remote);
+static int del_event(int epollfd, int fd);
static int del_out_event(int epollfd, struct remote_desc * const remote);
static void disconnect_client(int epollfd, struct remote_desc * const current);
static int drain_write_buffers_blocking(struct remote_desc * const remote);
@@ -120,6 +121,7 @@ static void nDPIsrvd_buffer_array_copy(void * dst, const void * src)
buf_dst->buf.ptr.raw = NULL;
if (nDPIsrvd_buffer_init(&buf_dst->buf, buf_src->buf.used) != 0)
{
+ logger(1, "Additional write buffer init failed, size: %zu bytes", buf_src->buf.used);
return;
}
@@ -590,6 +592,7 @@ static struct remote_desc * get_remote_descriptor(enum sock_type type, int remot
{
if (remotes.desc_used == remotes.desc_size)
{
+ logger(1, "Max number of connections reached: %llu", remotes.desc_used);
return NULL;
}
@@ -608,6 +611,7 @@ static struct remote_desc * get_remote_descriptor(enum sock_type type, int remot
if (nDPIsrvd_json_buffer_init(&remotes.desc[i].event_collector_un.main_read_buffer,
max_buffer_size) != 0)
{
+ logger(1, "Read/JSON buffer init failed, size: %zu bytes", max_buffer_size);
return NULL;
}
break;
@@ -626,11 +630,13 @@ static struct remote_desc * get_remote_descriptor(enum sock_type type, int remot
utarray_new(*additional_write_buffers, &nDPIsrvd_buffer_array_icd);
if (*additional_write_buffers == NULL)
{
+ logger(1, "%s", "Could not create additional write buffers");
return NULL;
}
}
if (write_buffer != NULL && nDPIsrvd_buffer_init(&write_buffer->buf, max_buffer_size) != 0)
{
+ logger(1, "Write buffer init failed, size: %zu bytes", max_buffer_size);
return NULL;
}
@@ -640,35 +646,71 @@ static struct remote_desc * get_remote_descriptor(enum sock_type type, int remot
}
}
+ logger(1, "%s", "BUG: Unknown error while finding the remote descriptor");
return NULL;
}
-static void free_remotes(void)
+static void free_remote(int epollfd, struct remote_desc * remote)
{
- for (size_t i = 0; i < remotes.desc_size; ++i)
+ if (remote->fd > -1)
{
- switch (remotes.desc[i].sock_type)
+ errno = 0;
+ del_event(epollfd, remote->fd);
+ if (errno != 0)
+ {
+ logger_nDPIsrvd(remote, "Could not delete event from epoll for connection", ": %s", strerror(errno));
+ }
+ errno = 0;
+ close(remote->fd);
+
+ switch (remote->sock_type)
{
case COLLECTOR_UN:
- nDPIsrvd_json_buffer_free(&remotes.desc[i].event_collector_un.main_read_buffer);
+ if (errno != 0)
+ {
+ logger_nDPIsrvd(remote, "Error closing collector connection", ": %s", strerror(errno));
+ }
+ nDPIsrvd_json_buffer_free(&remote->event_collector_un.main_read_buffer);
break;
case DISTRIBUTOR_UN:
- if (remotes.desc[i].event_distributor_un.additional_write_buffers != NULL)
+ if (errno != 0)
+ {
+ logger_nDPIsrvd(remote, "Error closing distributor connection", ": %s", strerror(errno));
+ }
+ if (remote->event_distributor_un.additional_write_buffers != NULL)
{
- utarray_free(remotes.desc[i].event_distributor_un.additional_write_buffers);
- remotes.desc[i].event_distributor_un.additional_write_buffers = NULL;
+ utarray_clear(remote->event_distributor_un.additional_write_buffers);
}
- nDPIsrvd_buffer_free(&remotes.desc[i].event_distributor_un.main_write_buffer.buf);
+ nDPIsrvd_buffer_free(&remote->event_distributor_un.main_write_buffer.buf);
+ remote->event_distributor_un.main_write_buffer.written = 0;
+
+ free(remote->event_distributor_un.user_name);
+ remote->event_distributor_un.user_name = NULL;
break;
case DISTRIBUTOR_IN:
- if (remotes.desc[i].event_distributor_in.additional_write_buffers != NULL)
+ if (errno != 0)
+ {
+ logger_nDPIsrvd(remote, "Error closing distributor connection", ": %s", strerror(errno));
+ }
+ if (remote->event_distributor_in.additional_write_buffers != NULL)
{
- utarray_free(remotes.desc[i].event_distributor_in.additional_write_buffers);
- remotes.desc[i].event_distributor_in.additional_write_buffers = NULL;
+ utarray_clear(remote->event_distributor_in.additional_write_buffers);
}
- nDPIsrvd_buffer_free(&remotes.desc[i].event_distributor_in.main_write_buffer.buf);
+ nDPIsrvd_buffer_free(&remote->event_distributor_in.main_write_buffer.buf);
+ remote->event_distributor_in.main_write_buffer.written = 0;
break;
}
+
+ remote->fd = -1;
+ remotes.desc_used--;
+ }
+}
+
+static void free_remotes(int epollfd)
+{
+ for (size_t i = 0; i < remotes.desc_size; ++i)
+ {
+ free_remote(epollfd, &remotes.desc[i]);
}
}
@@ -724,47 +766,9 @@ static int del_event(int epollfd, int fd)
return epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL);
}
-static void disconnect_client(int epollfd, struct remote_desc * const current)
+static void disconnect_client(int epollfd, struct remote_desc * const remote)
{
- if (current->fd > -1)
- {
- del_event(epollfd, current->fd);
- if (close(current->fd) != 0)
- {
- switch (current->sock_type)
- {
- case COLLECTOR_UN:
- logger_nDPIsrvd(current, "Error closing collector connection", ": %s", strerror(errno));
- nDPIsrvd_json_buffer_free(&current->event_collector_un.main_read_buffer);
- break;
- case DISTRIBUTOR_UN:
- logger_nDPIsrvd(current, "Error closing distributor connection", ": %s", strerror(errno));
- if (current->event_distributor_un.additional_write_buffers != NULL)
- {
- utarray_clear(current->event_distributor_un.additional_write_buffers);
- }
- nDPIsrvd_buffer_free(&current->event_distributor_un.main_write_buffer.buf);
- current->event_distributor_un.main_write_buffer.written = 0;
- break;
- case DISTRIBUTOR_IN:
- logger_nDPIsrvd(current, "Error closing distributor connection", ": %s", strerror(errno));
- if (current->event_distributor_in.additional_write_buffers != NULL)
- {
- utarray_clear(current->event_distributor_in.additional_write_buffers);
- }
- nDPIsrvd_buffer_free(&current->event_distributor_in.main_write_buffer.buf);
- current->event_distributor_in.main_write_buffer.written = 0;
- break;
- }
- }
- if (current->sock_type == DISTRIBUTOR_UN)
- {
- free(current->event_distributor_un.user_name);
- current->event_distributor_un.user_name = NULL;
- }
- current->fd = -1;
- remotes.desc_used--;
- }
+ free_remote(epollfd, remote);
}
static int nDPIsrvd_parse_options(int argc, char ** argv)
@@ -914,7 +918,6 @@ static struct remote_desc * accept_remote(int server_fd,
struct remote_desc * current = get_remote_descriptor(socktype, client_fd, NETWORK_BUFFER_MAX_SIZE);
if (current == NULL)
{
- logger(1, "Max number of connections reached: %llu", remotes.desc_used);
return NULL;
}
@@ -1433,8 +1436,7 @@ static int mainloop(int epollfd)
}
close(signalfd);
-
- free_remotes();
+ free_remotes(epollfd);
return 0;
}