From 2d21bdde867aa8d3a155c9d04276ab959c31d096 Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Fri, 25 Sep 2020 11:09:03 +0000
Subject: [PATCH] bugs-4415

---
 dap-sdk/net/core/dap_events_socket.c         |  2 +-
 dap-sdk/net/core/dap_server.c                |  2 +-
 dap-sdk/net/core/dap_worker.c                | 37 +++++++++++---------
 dap-sdk/net/core/include/dap_events_socket.h |  1 +
 4 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c
index b84098efff..4ede03d902 100644
--- a/dap-sdk/net/core/dap_events_socket.c
+++ b/dap-sdk/net/core/dap_events_socket.c
@@ -748,7 +748,7 @@ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *sc, bool a_is_r
 
     sc->ev.events = events;
 
-    if ((!sc->server && sc->worker) || (sc->worker && sc->server->type != DAP_SERVER_UDP))
+    if (sc->worker && sc->type != DESCRIPTOR_TYPE_SOCKET_UDP)
         if ( epoll_ctl(sc->worker->epoll_fd, EPOLL_CTL_MOD, sc->socket, &sc->ev) ){
             int l_errno = errno;
             char l_errbuf[128];
diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c
index e57d203d23..504f027fc7 100644
--- a/dap-sdk/net/core/dap_server.c
+++ b/dap-sdk/net/core/dap_server.c
@@ -185,7 +185,7 @@ dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16
         l_server->es_listeners = dap_list_append(l_server->es_listeners, l_es);
 
         if (l_es) {
-            l_es->type = l_server->type == DAP_SERVER_TCP ? DESCRIPTOR_TYPE_SOCKET_LISTENING : DESCRIPTOR_TYPE_SOCKET;
+            l_es->type = l_server->type == DAP_SERVER_TCP ? DESCRIPTOR_TYPE_SOCKET_LISTENING : DESCRIPTOR_TYPE_SOCKET_UDP;
 #ifdef DAP_EVENTS_CAPS_EPOLL
             // Prepare for multi thread listening
             l_es->ev_base_flags  = EPOLLET| EPOLLIN | EPOLLEXCLUSIVE;
diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c
index f872bacc4a..affb812410 100644
--- a/dap-sdk/net/core/dap_worker.c
+++ b/dap-sdk/net/core/dap_worker.c
@@ -193,17 +193,20 @@ void *dap_worker_thread(void *arg)
                     break;
                     case DESCRIPTOR_TYPE_SOCKET:
                         l_must_read_smth = true;
-                        if (!l_cur->server || l_cur->server->type == DAP_SERVER_TCP) {
-                            l_bytes_read = recv(l_cur->fd, (char *) (l_cur->buf_in + l_cur->buf_in_size),
-                                                sizeof(l_cur->buf_in) - l_cur->buf_in_size, 0);
-                        } else if (l_cur->server && l_cur->server->type == DAP_SERVER_UDP) {
-                            socklen_t l_size = sizeof(l_cur->remote_addr);
-                            l_bytes_read = recvfrom(l_cur->fd, (char *) (l_cur->buf_in + l_cur->buf_in_size),
-                                                    sizeof(l_cur->buf_in) - l_cur->buf_in_size, 0,
-                                                    (struct sockaddr *)&l_cur->remote_addr, &l_size);
-                        }
+                        l_bytes_read = recv(l_cur->fd, (char *) (l_cur->buf_in + l_cur->buf_in_size),
+                                            sizeof(l_cur->buf_in) - l_cur->buf_in_size, 0);
                         l_errno = errno;
                     break;
+                    case DESCRIPTOR_TYPE_SOCKET_UDP: {
+                        l_must_read_smth = true;
+                        socklen_t l_size = sizeof(l_cur->remote_addr);
+                        l_bytes_read = recvfrom(l_cur->fd, (char *) (l_cur->buf_in + l_cur->buf_in_size),
+                                                sizeof(l_cur->buf_in) - l_cur->buf_in_size, 0,
+                                                (struct sockaddr *)&l_cur->remote_addr, &l_size);
+
+                        l_errno = errno;
+                    }
+                    break;
                     case DESCRIPTOR_TYPE_SOCKET_LISTENING:
                         // Accept connection
                         if ( l_cur->callbacks.accept_callback){
@@ -311,14 +314,14 @@ void *dap_worker_thread(void *arg)
                 int l_errno;
                 switch (l_cur->type){
                     case DESCRIPTOR_TYPE_SOCKET:
-                        if (!l_cur->server || l_cur->server->type == DAP_SERVER_TCP) {
-                            l_bytes_sent = send(l_cur->socket, (const char *)l_cur->buf_out,
-                                                l_cur->buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL);
-                        } else if (l_cur->server && l_cur->server->type == DAP_SERVER_UDP) {
-                            l_bytes_sent = sendto(l_cur->socket, (const char *)l_cur->buf_out,
-                                                  l_cur->buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL,
-                                                  (struct sockaddr *)&l_cur->remote_addr, sizeof(l_cur->remote_addr));
-                        }
+                        l_bytes_sent = send(l_cur->socket, (const char *)l_cur->buf_out,
+                                            l_cur->buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL);
+                        l_errno = errno;
+                    break;
+                    case DESCRIPTOR_TYPE_SOCKET_UDP:
+                        l_bytes_sent = sendto(l_cur->socket, (const char *)l_cur->buf_out,
+                                              l_cur->buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL,
+                                              (struct sockaddr *)&l_cur->remote_addr, sizeof(l_cur->remote_addr));
                         l_errno = errno;
                     break;
                     case DESCRIPTOR_TYPE_PIPE:
diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h
index bfbde1ad1d..474c26ad4c 100644
--- a/dap-sdk/net/core/include/dap_events_socket.h
+++ b/dap-sdk/net/core/include/dap_events_socket.h
@@ -111,6 +111,7 @@ typedef struct dap_events_socket_callbacks {
 
 typedef enum {
     DESCRIPTOR_TYPE_SOCKET = 0,
+    DESCRIPTOR_TYPE_SOCKET_UDP,
     DESCRIPTOR_TYPE_SOCKET_LISTENING,
     DESCRIPTOR_TYPE_QUEUE,
     DESCRIPTOR_TYPE_PIPE,
-- 
GitLab