From 0c1630c24dae7dc28e0c5293c2d48ed372767dea Mon Sep 17 00:00:00 2001 From: lxsang Date: Thu, 6 Aug 2020 23:17:07 +0200 Subject: [PATCH] refactory code, fix seg error --- Makefile.am | 2 +- bst.c | 102 ---------------------------------------------------- bst.h | 19 ---------- tunnel.c | 29 ++++++++++----- 4 files changed, 21 insertions(+), 131 deletions(-) delete mode 100644 bst.c delete mode 100644 bst.h diff --git a/Makefile.am b/Makefile.am index 2d1e7ca..d74e995 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,6 +14,6 @@ AM_CPPFLAGS += -W -Wall -g -std=c99 -fPIC lib_LTLIBRARIES = tunnel.la tunnel_la_LDFLAGS = -module -avoid-version -shared -tunnel_la_SOURCES = tunnel.c bst.c +tunnel_la_SOURCES = tunnel.c EXTRA_DIST = README.md \ No newline at end of file diff --git a/bst.c b/bst.c deleted file mode 100644 index c6d0b63..0000000 --- a/bst.c +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include - -#include "bst.h" - -void bst_free(bst_node_t* root) -{ - if(root != NULL) - { - bst_free(root->left); - bst_free(root->right); - free(root); - } -} - -bst_node_t* bst_insert(bst_node_t* root, int key, void* data) -{ - if(root == NULL) - { - root = malloc(sizeof(bst_node_t)); - root->key = key; - root->data = data; - root->left = root->right = NULL; - } - else if(key < root->key) - root->left = bst_insert(root->left, key, data); - else if(key > root->key) - root->right = bst_insert(root->right, key, data); - else - root->data = data; - return root; -} - -bst_node_t* bst_find_min(bst_node_t* root) -{ - if(root == NULL) - return NULL; - else if(root->left == NULL) - return root; - else - return bst_find_min(root->left); -} - -bst_node_t* bst_find_max(bst_node_t* root) -{ - if(root == NULL) - return NULL; - else if(root->right == NULL) - return root; - else - return bst_find_max(root->right); -} - -bst_node_t* bst_find(bst_node_t* root, int x) -{ - if(root == NULL) - return NULL; - else if(x < root->key) - return bst_find(root->left, x); - else if(x > root->key) - return bst_find(root->right, x); - else - return root; -} - - -bst_node_t* bst_delete(bst_node_t* root, int x) -{ - bst_node_t* temp; - if(root == NULL) - return NULL; - else if(x < root->key) - root->left = bst_delete(root->left, x); - else if(x > root->key) - root->right = bst_delete(root->right, x); - else if(root->left && root->right) - { - temp = bst_find_min(root->right); - root->key = temp->key; - root->data = temp->data; - root->right = bst_delete(root->right, root->key); - } - else - { - temp = root; - if(root->left == NULL) - root = root->right; - else if(root->right == NULL) - root = root->left; - free(temp); - } - return root; -} - -void bst_for_each(bst_node_t* root, void (*callback)(bst_node_t*, void **, int), void** args, int argc) -{ - if(root == NULL) - return; - bst_for_each(root->left, callback, args, argc); - callback(root, args, argc); - bst_for_each(root->right, callback, args, argc); -} \ No newline at end of file diff --git a/bst.h b/bst.h deleted file mode 100644 index f8c5be5..0000000 --- a/bst.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef BST_H -#define BST_H 1 - -typedef struct _tree_node -{ - int key; - void* data; - struct _tree_node* left; - struct _tree_node* right; -} bst_node_t; - -void bst_free(bst_node_t* root); -bst_node_t* bst_insert(bst_node_t* root, int key, void* data); -bst_node_t* bst_find_min(bst_node_t* root); -bst_node_t* bst_find_max(bst_node_t* root); -bst_node_t* bst_find(bst_node_t* root, int x); -bst_node_t* bst_delete(bst_node_t* root, int x); -void bst_for_each(bst_node_t* root, void (*callback)(bst_node_t*, void **, int), void** args, int argc); -#endif \ No newline at end of file diff --git a/tunnel.c b/tunnel.c index 7a1019b..ce04b55 100644 --- a/tunnel.c +++ b/tunnel.c @@ -12,7 +12,7 @@ #include #include -#include "bst.h" +#include #define MAX_CHANNEL_PATH 108 #define MAX_CHANNEL_NAME 64 #define HOT_LINE_SOCKET "antd_hotline.sock" @@ -28,6 +28,7 @@ #define CHANNEL_OPEN (uint8_t)0x4 #define CHANNEL_CLOSE (uint8_t)0x5 #define CHANNEL_DATA (uint8_t)0x6 +#define CHANNEL_CTRL (uint8_t)0x7 //#define CHANNEL_LIST (uint8_t)0x7 typedef struct { int sock; @@ -177,6 +178,7 @@ static uint8_t* msg_read_payload(int fd, int* size) static int msg_read(int fd, antd_tunnel_msg_t* msg) { + msg->data = NULL; if(msg_check_number(fd, MSG_MAGIC_BEGIN) == -1) { ERROR("Unable to check begin magic number on socket: %d", fd); @@ -460,12 +462,12 @@ static void monitor_hotline(int listen_fd) // get channel name if(msg.header.size > MAX_CHANNEL_NAME) { - if(msg.data) - free(msg.data); msg.header.type = CHANNEL_ERROR; (void) snprintf(buff, MAX_CHANNEL_NAME, "Channel name exceeds %d bytes", MAX_CHANNEL_NAME); LOG("%s", buff); msg.header.size = strlen(buff); + if(msg.data) + free(msg.data); msg.data = (uint8_t*)buff; if(msg_write(fd, &msg) == -1) { @@ -478,6 +480,8 @@ static void monitor_hotline(int listen_fd) buff[msg.header.size] = '\0'; LOG("Open a new channel: %s (%d)", buff, fd); channel_open(fd, buff); + if(msg.data) + free(msg.data); } break; @@ -485,6 +489,8 @@ static void monitor_hotline(int listen_fd) msg.header.type = CHANNEL_ERROR; (void) snprintf(buff, MAX_CHANNEL_NAME, "Unsupported msg type %d in hotline", (int)msg.header.type); msg.header.size = strlen(buff); + if(msg.data) + free(msg.data); msg.data = (uint8_t*)buff; LOG("%s", buff); if(msg_write(fd, &msg) == -1) @@ -515,7 +521,7 @@ static void handle_channel(bst_node_t* node, void** args, int argc) node->data = NULL; return; } - LOG("Got new data on channel %s (%d)", channel->name, channel->sock); + //LOG("Got new data on channel %s (%d)", channel->name, channel->sock); // handle msg read if(msg_read(channel->sock, &msg) == -1) { @@ -528,13 +534,10 @@ static void handle_channel(bst_node_t* node, void** args, int argc) case CHANNEL_ERROR: case CHANNEL_DATA: case CHANNEL_UNSUBSCRIBE: + case CHANNEL_CTRL: // forward message to the correct client in the channel msg.header.channel_id = node->key; client = bst_find(channel->subscribers, msg.header.client_id); - if(msg.header.type == CHANNEL_UNSUBSCRIBE) - { - channel->subscribers = bst_delete(channel->subscribers, msg.header.client_id); - } if(client != NULL) { rq = (antd_client_t*) client->data; @@ -547,18 +550,25 @@ static void handle_channel(bst_node_t* node, void** args, int argc) { ERROR("Unable to find client %d to write on channel %s", msg.header.client_id, channel->name); } + if(msg.header.type == CHANNEL_UNSUBSCRIBE) + { + channel->subscribers = bst_delete(channel->subscribers, msg.header.client_id); + } break; - + case CHANNEL_CLOSE: // close the current channel channel_close(channel); node->data = NULL; list_put_ptr(channel_list, node); break; + default: LOG("Message type %d is not supported in client-application communication", msg.header.type); break; } + if(msg.data) + free(msg.data); } } static void set_sock_fd(bst_node_t* node, void** args, int argc) @@ -701,6 +711,7 @@ static void process_client_message(antd_tunnel_msg_t* msg, antd_client_t* client case CHANNEL_OK: case CHANNEL_ERROR: case CHANNEL_DATA: + case CHANNEL_CTRL: node = bst_find(g_tunnel.channels, msg->header.channel_id); if(node) {