From ad588fc988dbcdf44b8c96306316be4b9418d94d Mon Sep 17 00:00:00 2001 From: Nick Botticelli Date: Tue, 16 Jul 2024 03:06:08 -0700 Subject: [PATCH] Latest commit --- .github/workflows/make.yml | 15 +++++++++ Makefile | 8 ++--- README.md | 29 ++++++++++++++---- chatnode.properties | 2 +- src/chat_node.c | 35 +++------------------ src/chat_node.h | 10 +++--- src/debug.c | 45 ++++++++++++++++++++++++++- src/debug.h | 7 +++++ src/main.c | 63 +++++++++++++------------------------- src/main.h | 5 +-- src/message.c | 31 ++++++++++--------- src/message.h | 24 +++++++-------- src/receiver_handler.c | 32 +++++++++---------- src/receiver_handler.h | 8 ++--- src/sender_handler.c | 17 +++++----- src/sender_handler.h | 10 +++--- 16 files changed, 186 insertions(+), 155 deletions(-) create mode 100644 .github/workflows/make.yml diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml new file mode 100644 index 0000000..287835b --- /dev/null +++ b/.github/workflows/make.yml @@ -0,0 +1,15 @@ +name: Build with GNU Make + +on: [push, pull_request] + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-22.04] + + steps: + - uses: actions/checkout@v4.1.7 + - name: Make program + run: make diff --git a/Makefile b/Makefile index fae2476..d0d7a20 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Many thanks to Job Vranish - see https://spin.atomicobject.com/2016/08/26/makefile-c-projects/ -TARGET_EXEC := chat_node +TARGET_EXEC := chatroom-c BUILD_DIR := ./build SRC_DIRS := ./src SRCS := $(shell find $(SRC_DIRS) -name *.cpp -or -name *.c -or -name *.s) @@ -10,10 +10,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS)) CPPFLAGS := $(INC_FLAGS) -MMD -MP -Wall -Wno-unused-command-line-argument -Wno-undefined-inline LDFLAGS := -pthread -lpthread -RELEASE_FLAGS := -Ofast -DNDEBUG -fvisibility=hidden -fstack-protector-strong \ --fomit-frame-pointer -fPIE -fstack-clash-protection -fsanitize=bounds \ --fsanitize-undefined-trap-on-error -D_FORTIFY_SOURCE=3 -flto -# RELEASE_LDFLAGS := -Wl,-z,relro,-z,now,-z,noexecstack,-z,separate-code +RELEASE_FLAGS := -O3 -DNDEBUG -fvisibility=hidden -fomit-frame-pointer DEBUG_FLAGS := -O0 -g3 -fno-omit-frame-pointer -fno-common -fno-optimize-sibling-calls ASAN_FLAGS := $(DEBUG_FLAGS) -fsanitize=address,undefined @@ -23,7 +20,6 @@ TSAN_FLAGS := $(DEBUG_FLAGS) -fsanitize=thread .PHONY: all debug asan msan tsan clean all: CPPFLAGS += $(RELEASE_FLAGS) -# all: LDFLAGS += $(RELEASE_LDFLAGS) all: $(BUILD_DIR)/$(TARGET_EXEC) strip $(BUILD_DIR)/$(TARGET_EXEC) diff --git a/README.md b/README.md index 7ed1e24..399c48e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,27 @@ -# ProgAssignment-5 -Mesh chat application +# chatroom-c +chatroom-c is a multi-threaded CLI-based chat application in a mesh network design using plain C +with pthreads + sockets. -# Authors -* Mahafuj Alam (ma3755@nau.edu) -* Nicholas Botticelli (nsb96@nau.edu) +# Building +* GNU Make: +`make` # Usage Example: -`./chat_node` \ No newline at end of file +`./chatroom-c` + +Must have a `chatnode.properties` file matching the format shown in the repository. Default port is +`51966`, aka `0xCAFE`. Comment or remove the `ip` key in the properties file to host the chat room +on the desired port, otherwise, the IP + port combo is used by clients to connect to an existing +chat room by filling in the properties file correctly and running `/join` once the client is +started. + +# Authors +* Mahafuj Alam +* Nicholas Botticelli + +# Demo +An example video showing cross-network chatting using an older version with a couple visual bugs +(not affecting internal logic) can be seen in the YouTube video below. + +[![Video demo](https://img.youtube.com/vi/PTEXrJTe-WI/0.jpg)](https://www.youtube.com/watch?v=PTEXrJTe-WI) diff --git a/chatnode.properties b/chatnode.properties index 2aff3c6..2121df7 100644 --- a/chatnode.properties +++ b/chatnode.properties @@ -1,3 +1,3 @@ ip = 127.0.0.1 port = 51966 -username = Person3 \ No newline at end of file +username = Person2 \ No newline at end of file diff --git a/src/chat_node.c b/src/chat_node.c index ef6ad48..b72daaf 100644 --- a/src/chat_node.c +++ b/src/chat_node.c @@ -9,21 +9,7 @@ #include "debug.h" #include "main.h" -inline void printNodeList(Node *nodeList) { -#ifndef NDEBUG - Node *curNode = nodeList; - - // Traverse linked list until we find the node to remove - printf("===== Node list =====\n"); - while (curNode != NULL) { - printf("%p: %s:%d - %s -\t-> %p\n", curNode, curNode->ip, curNode->port, curNode->username, curNode->nextNode); - curNode = curNode->nextNode; - } - printf("=====================\n"); -#endif -} - -inline Node *createNode(char *ip, short port, char *username, bool createSocket, bool initialNode) { +Node *createNode(char *ip, short port, char *username, bool createSocket, bool initialNode) { Node *node = malloc(sizeof(Node)); node->ip = ip; node->port = port; @@ -36,7 +22,7 @@ inline Node *createNode(char *ip, short port, char *username, bool createSocket, return node; } -inline Node *acceptNode(Node **nodeList) { +Node *acceptNode(Node **nodeList) { struct sockaddr addr; socklen_t addrlen = sizeof(addr); int sock = accept((*nodeList)->sock, &addr, &addrlen); @@ -56,7 +42,7 @@ inline Node *acceptNode(Node **nodeList) { return node; } -inline void addNode(Node **nodeList, Node *node) { +void addNode(Node **nodeList, Node *node) { if (*nodeList == NULL) { // TODO *nodeList = node; // node->nextNode = NULL; @@ -81,7 +67,7 @@ inline void addNode(Node **nodeList, Node *node) { printNodeList(*nodeList); } -inline void removeNode(Node **nodeList, Node *node) { +void removeNode(Node **nodeList, Node *node) { Node *prevNode = NULL; Node *curNode = *nodeList; @@ -112,23 +98,10 @@ inline void removeNode(Node **nodeList, Node *node) { // nodeList->node = node; *nodeList = node; - // if (curNode == *nodeList) { - // // Linked list is empty - // (*nodeList)->nextNode = NULL; - // debug("Removing only node in the node list!"); - // } - // else { - // // First item is the node to remove (curNode) - // (*nodeList)->nextNode = curNode->nextNode; - // debug("Removing first node in node list!"); - // } - debug("Removing the head in node list!"); *nodeList = curNode->nextNode; } - printf("%s has left the chat room.\n", curNode->username); - // Clean up old node curNode->connected = false; free(curNode->ip); diff --git a/src/chat_node.h b/src/chat_node.h index 50b95fd..446975b 100644 --- a/src/chat_node.h +++ b/src/chat_node.h @@ -36,9 +36,9 @@ typedef struct { * @param createSocket whether to create a new socket immediately or leave null * @param initialNode whether the created node is the initial host node */ -extern inline Node *createNode(char *ip, short port, char *username, bool createSocket, bool initialNode); +extern Node *createNode(char *ip, short port, char *username, bool createSocket, bool initialNode); -extern inline void printNodeList(Node *nodeList); -extern inline Node *acceptNode(Node **nodeList); -extern inline void addNode(Node **nodeList, Node *node); -extern inline void removeNode(Node **nodeList, Node *node); +extern void printNodeList(Node *nodeList); +extern Node *acceptNode(Node **nodeList); +extern void addNode(Node **nodeList, Node *node); +extern void removeNode(Node **nodeList, Node *node); diff --git a/src/debug.c b/src/debug.c index 015fd14..7e8fe06 100644 --- a/src/debug.c +++ b/src/debug.c @@ -2,7 +2,6 @@ #include -#include "main.h" void debug_hexdump(void *data, size_t size) { #ifndef NDEBUG @@ -41,3 +40,47 @@ void debug_hexdump(void *data, size_t size) { } #endif } + +void printNodeList(Node *nodeList) { +#ifndef NDEBUG + Node *curNode = nodeList; + + // Traverse linked list until we find the node to remove + printf("===== Node list =====\n"); + while (curNode != NULL) { + printf("%p: %s:%d - %s -\t-> %p\n", curNode, curNode->ip, curNode->port, curNode->username, curNode->nextNode); + curNode = curNode->nextNode; + } + printf("=====================\n"); +#endif +} + +void debugMessage(Message message) { +#ifndef NDEBUG + MessageType messageType = getMessageType(message.header); + + printf("Message {\n"); + printf("\theader:\n"); + printf("\t\ttype = %d\n", messageType); + + switch (messageType) { + case MSG_JOIN: + printf("\tusername = %s\n", message.username); + printf("\tport = %d\n", message.port); + break; + case MSG_WELCOME: + printf("\tremoteUsername = %s\n", message.remoteUsername); + case MSG_ADD_MEMBER: + printf("\tWIP\n"); + break; + case MSG_NOTE: + printf("\tnote = %s\n", message.note); + break; + case MSG_LEAVE: + printf("\tshutdownAll = %s\n", getBit(message.header, 0) ? "true" : "false"); + break; + } + + printf("}\n"); +#endif +} diff --git a/src/debug.h b/src/debug.h index ea6ac06..7939461 100644 --- a/src/debug.h +++ b/src/debug.h @@ -11,6 +11,9 @@ #include #include +#include "chat_node.h" +#include "message.h" + #ifndef NDEBUG // debug() - maskable debug message, expanded only if symbol DEBUG is defined #define debug(M, ...) fprintf(stderr, "[DEBUG] %s:%d: " M "\n", __FILE__, __LINE__, ##__VA_ARGS__) @@ -34,3 +37,7 @@ void debug_hexdump(void *data, size_t size); + +void printNodeList(Node *nodeList); + +void debugMessage(Message message); diff --git a/src/main.c b/src/main.c index c2567f1..57176ce 100644 --- a/src/main.c +++ b/src/main.c @@ -16,38 +16,8 @@ #include "receiver_handler.h" #include "sender_handler.h" -// TODO: Move this to debug.c -extern inline void debugMessage(Message message) { -#ifndef NDEBUG - MessageType messageType = getMessageType(message.header); - - printf("Message {\n"); - printf("\theader:\n"); - printf("\t\ttype = %d\n", messageType); - - switch (messageType) { - case MSG_JOIN: - printf("\tusername = %s\n", message.username); - printf("\tport = %d\n", message.port); - break; - case MSG_WELCOME: - printf("\tremoteUsername = %s\n", message.remoteUsername); - case MSG_ADD_MEMBER: - printf("\tWIP\n"); - break; - case MSG_NOTE: - printf("\tnote = %s\n", message.note); - break; - case MSG_LEAVE: - printf("\tshutdownAll = %s\n", getBit(message.header, 0) ? "true" : "false"); - break; - } - printf("}\n"); -#endif -} - -inline Node *loadProperties() { +Node *loadProperties() { Properties *properties = property_read_properties(CONFIG_PATH); char *ip = property_get_property(properties, "ip"); @@ -84,6 +54,7 @@ void *send_handler(void *nodeListRaw) { if (cmdResult.action == ACTION_LEAVE) { // Disconnect from all other nodes + debug("Disconnecting from all other nodes..."); Node *curNode = nodeList->initialNode ? nodeList->nextNode->nextNode : nodeList->nextNode; while (curNode != NULL) { curNode->connected = false; @@ -134,8 +105,14 @@ void *receive_handler(void *recHandlerDataRaw) { } if (receiveMessage(nodeList, node, &message)) { - if (!handleClient(nodeList, node, message)) { - exit(EXIT_SUCCESS); // Quick and dirty + bool clientStatus = handleClient(nodeList, node, message); + +// // Loop through disconnected nodes and remove from list + + if (!clientStatus) { + debug("Shutting down client."); + exit(EXIT_SUCCESS); // TODO: Quick and dirty +// break; } } } @@ -152,7 +129,7 @@ void *initial_receive_handler(void *nodeRaw) { // Create unnamed network socket for server to listen on if ((node->sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { - perror("Error creating initial server socket"); + perror("Error creating initial server socket!"); exit(EXIT_FAILURE); } @@ -164,7 +141,7 @@ void *initial_receive_handler(void *nodeRaw) { // Bind socket to a port if (bind(node->sock, (struct sockaddr *) &server_address, sizeof(server_address)) == -1) { - perror("Error binding initial server socket"); + perror("Error binding initial server socket!"); exit(EXIT_FAILURE); } @@ -179,7 +156,7 @@ void *initial_receive_handler(void *nodeRaw) { // Listen for client connections (pending connections get put into a queue) if (listen(node->sock, 1) == -1) { - perror("Error listening on initial server socket"); + perror("Error listening on initial server socket!"); exit(EXIT_FAILURE); } @@ -192,14 +169,18 @@ void *initial_receive_handler(void *nodeRaw) { pthread_t receive_thread; if (pthread_create(&receive_thread, NULL, receive_handler, (void *) recHandlerData) == -1) { - perror("Error: Could not create receiver thread"); + perror("Error: Could not create receiver thread!"); exit(EXIT_FAILURE); } - // detach the thread so that we don't have to wait (join) with it to reclaim memory. + // Detach the thread so that we don't have to wait (join) with it to reclaim memory. // memory will be reclaimed when the thread finishes. - if (pthread_detach(receive_thread) == -1) { - perror("Error: Could not detach receiver thread"); + int pthreadDetachCode = pthread_detach(receive_thread); + +// free(recHandlerData); // TODO: Verify? + + if (pthreadDetachCode == -1) { + perror("Error: Could not detach receiver thread!"); exit(EXIT_FAILURE); } } @@ -211,7 +192,7 @@ int main(int argc, char *argv[]) { int result = EXIT_SUCCESS; pthread_t senderThread, initialReceiverThread; - puts("=== chat_node ===\n"); + puts("=== chatroom-c ===\n"); Node *nodeList; Node *node = loadProperties(); diff --git a/src/main.h b/src/main.h index a7b99f2..5da6aa1 100644 --- a/src/main.h +++ b/src/main.h @@ -5,10 +5,7 @@ #include "chat_node.h" #include "properties.h" -// TODO: Remove -#define SERVER_ADDR "127.0.0.1" - #define CONFIG_PATH "chatnode.properties" -extern inline Node *loadProperties(); +extern Node *loadProperties(); extern void *receive_handler(void *recHandlerDataRaw); diff --git a/src/message.c b/src/message.c index cd25d6f..28e91d9 100644 --- a/src/message.c +++ b/src/message.c @@ -26,7 +26,7 @@ inline void setMessageType(MessageHeader *messageHeader, MessageType messageType *messageHeader = (*messageHeader & ~0xE0) | ((messageType << 5) & 0xE0); } -inline Message createJoinMessage(char *username, short port, bool newJoin) { +Message createJoinMessage(char *username, short port, bool newJoin) { debug("createJoinMessage() port: %d", port); Message message; message.header = BLANK_HEADER; @@ -39,7 +39,7 @@ inline Message createJoinMessage(char *username, short port, bool newJoin) { return message; } -inline Message createWelcomeMessage(char *remoteUsername) { +Message createWelcomeMessage(char *remoteUsername) { Message message; message.header = BLANK_HEADER; setMessageType(&message.header, MSG_WELCOME); @@ -48,7 +48,7 @@ inline Message createWelcomeMessage(char *remoteUsername) { return message; } -inline Message createAddMemberMessage(Node *nodeInfo) { +Message createAddMemberMessage(Node *nodeInfo) { Message message; message.header = BLANK_HEADER; setMessageType(&message.header, MSG_ADD_MEMBER); @@ -57,7 +57,7 @@ inline Message createAddMemberMessage(Node *nodeInfo) { return message; } -inline Message createNoteMessage(char *note) { +Message createNoteMessage(char *note) { Message message; message.header = BLANK_HEADER; setMessageType(&message.header, MSG_NOTE); @@ -66,7 +66,7 @@ inline Message createNoteMessage(char *note) { return message; } -inline Message createLeaveMessage(bool shutdownAll) { +Message createLeaveMessage(bool shutdownAll) { Message message; message.header = BLANK_HEADER; setMessageType(&message.header, MSG_LEAVE); @@ -77,17 +77,17 @@ inline Message createLeaveMessage(bool shutdownAll) { return message; } -inline size_t getNodeSize(Node *node) { +size_t getNodeSize(Node *node) { size_t nodeSize = 0; nodeSize += strlen(node->ip) + 1; - nodeSize += sizeof(short); // TODO: short (port)? + nodeSize += sizeof(short); nodeSize += strlen(node->username) + 1; return nodeSize; } -inline size_t getSerializedMessageSize(Message message) { +size_t getSerializedMessageSize(Message message) { // Start at one byte for the header size_t serializedMsgLen = 1; @@ -107,6 +107,7 @@ inline size_t getSerializedMessageSize(Message message) { serializedMsgLen += strlen(message.note) + 1; break; default: + debug("Error: Invalid message type in getSerializedMessageSize()!"); break; } @@ -115,20 +116,20 @@ inline size_t getSerializedMessageSize(Message message) { return serializedMsgLen; } -inline uint8_t *serializeNode(Node *node, size_t *rawNodeLenOut) { +uint8_t *serializeNode(Node *node, size_t *rawNodeLenOut) { *rawNodeLenOut = getNodeSize(node); uint8_t *serializedNode = malloc(*rawNodeLenOut); size_t curIndex = 0; curIndex += strlen(strcpy((char *) serializedNode, node->ip)) + 1; // Copy IP - memcpy(serializedNode + curIndex, &node->port, sizeof(node->port)); // Copy port; TODO: Simply - curIndex += sizeof(short); // TODO: Use short type? + memcpy(serializedNode + curIndex, &node->port, sizeof(node->port)); // Copy port + curIndex += sizeof(short); curIndex += strlen(strcpy((char *) serializedNode + curIndex, node->username)) + 1; // Copy username return serializedNode; } -inline uint8_t *serializeMessage(Message message, size_t *rawMsgLenOut) { +uint8_t *serializeMessage(Message message, size_t *rawMsgLenOut) { uint8_t *rawMsg; size_t rawMsgIndex; *rawMsgLenOut = getSerializedMessageSize(message); @@ -163,13 +164,14 @@ inline uint8_t *serializeMessage(Message message, size_t *rawMsgLenOut) { strcpy((char *) rawMsg + rawMsgIndex, message.note); break; default: +// debug("Error: Invalid message type in serializeMessage()!"); break; } return rawMsg; } -inline Node *deserializeNode(Node *nodeList, uint8_t *rawNode) { +Node *deserializeNode(Node *nodeList, uint8_t *rawNode) { size_t rawNodeIndex = 0; // Parse IP @@ -189,12 +191,11 @@ inline Node *deserializeNode(Node *nodeList, uint8_t *rawNode) { strcpy(username, (char *) rawNode + rawNodeIndex); Node *node = createNode(ip, port, username, true, false); - // connectSocket(nodeList, node); // TODO: ? return node; } -inline Message deserializeMessage(Node *nodeList, uint8_t *rawMessage, size_t rawMessageSize) { +Message deserializeMessage(Node *nodeList, uint8_t *rawMessage, size_t rawMessageSize) { Message message; debug("Received message hexdump:"); diff --git a/src/message.h b/src/message.h index 460817d..962342b 100644 --- a/src/message.h +++ b/src/message.h @@ -3,7 +3,7 @@ #include #include -#include +#include "chat_node.h" #define BLANK_HEADER (MessageHeader) 0 @@ -82,16 +82,16 @@ extern inline void setBit(uint8_t *byteFlag, int bitNum, bool bitValue); extern inline MessageType getMessageType(MessageHeader messageHeader); extern inline void setMessageType(MessageHeader *messageHeader, MessageType messageType); -extern inline Message createJoinMessage(char *username, short port, bool newJoin); -extern inline Message createWelcomeMessage(char *username); -extern inline Message createAddMemberMessage(Node *nodeInfo); -extern inline Message createNoteMessage(char *note); -extern inline Message createLeaveMessage(bool shutdownAll); +extern Message createJoinMessage(char *username, short port, bool newJoin); +extern Message createWelcomeMessage(char *username); +extern Message createAddMemberMessage(Node *nodeInfo); +extern Message createNoteMessage(char *note); +extern Message createLeaveMessage(bool shutdownAll); -extern inline size_t getNodeSize(Node *node); -extern inline size_t getSerializedMessageSize(Message message); -extern inline uint8_t *serializeNode(Node *node, size_t *rawNodeLenOut); -extern inline uint8_t *serializeMessage(Message message, size_t *serializedMessageLenOut); +extern size_t getNodeSize(Node *node); +extern size_t getSerializedMessageSize(Message message); +extern uint8_t *serializeNode(Node *node, size_t *rawNodeLenOut); +extern uint8_t *serializeMessage(Message message, size_t *serializedMessageLenOut); -extern inline Node *deserializeNode(Node *nodeList, uint8_t *rawNode); -extern inline Message deserializeMessage(Node *nodeList, uint8_t *rawMessage, size_t rawMessageSize); +extern Node *deserializeNode(Node *nodeList, uint8_t *rawNode); +extern Message deserializeMessage(Node *nodeList, uint8_t *rawMessage, size_t rawMessageSize); diff --git a/src/receiver_handler.c b/src/receiver_handler.c index 00c1971..7ef9b15 100644 --- a/src/receiver_handler.c +++ b/src/receiver_handler.c @@ -5,23 +5,12 @@ #include #include #include -#include // TODO: Remove #include "debug.h" +#include "chat_node.h" #include "sender_handler.h" -inline void removePrompt() { - printf("\b\b"); -} - -inline void repositionCursor() { - // Remove the two command prompt characters ('> '), - // then move input cursor down, - // then print command prompt characters - printf("%s" CMD_PROMPT, ANSI_MOVE_CURSOR_DOWN); -} - -inline bool handleClient(Node *nodeList, Node *node, Message message) { +bool handleClient(Node *nodeList, Node *node, Message message) { MessageType messageType = getMessageType(message.header); switch (messageType) { @@ -53,13 +42,16 @@ inline bool handleClient(Node *nodeList, Node *node, Message message) { node->username = message.remoteUsername; printNodeList(nodeList); + printf("%s has joined the chat room.\n", node->username); + break; case MSG_ADD_MEMBER: debug("Add member received!"); Message joinMessage; - if (connectToNode(nodeList, message.nodeInfo, false, &joinMessage)) + if (connectToNode(nodeList, message.nodeInfo, false, &joinMessage)) { sendMessage(message.nodeInfo->sock, joinMessage); + } break; case MSG_NOTE: @@ -77,19 +69,24 @@ inline bool handleClient(Node *nodeList, Node *node, Message message) { // Disconnect from node (mark for removal); this prevents any more messages from being received node->connected = false; + printf("%s has left the chat room.\n", node->username); + break; + default: + debug("Error: Invalid message type received (%d)!", messageType); } - // repositionCursor(); return true; } -inline bool receiveMessage(Node *nodeList, Node *node, Message *messageOut) { +bool receiveMessage(Node *nodeList, Node *node, Message *messageOut) { uint8_t rawMessage[MAX_PAYLOAD_SIZE + 1]; ssize_t rawMessageSize = recv(node->sock, &rawMessage, sizeof(rawMessage), 0); if (rawMessageSize == -1) { + debug("rawMessageSize == -1"); if (errno == EBADF) { + debug("Error: errno == EBADF"); goto SOCKET_CLOSED; } @@ -97,10 +94,11 @@ inline bool receiveMessage(Node *nodeList, Node *node, Message *messageOut) { return false; } else if (rawMessageSize == 0) { + debug("rawMessageSize == 0"); goto SOCKET_CLOSED; } - debug("received message!"); + debug("Received message!"); // Create message from received data *messageOut = deserializeMessage(nodeList, rawMessage, rawMessageSize); diff --git a/src/receiver_handler.h b/src/receiver_handler.h index de325db..1e92fe8 100644 --- a/src/receiver_handler.h +++ b/src/receiver_handler.h @@ -6,7 +6,7 @@ #define CMD_PROMPT "" #define ANSI_MOVE_CURSOR_DOWN "\033[1A" -extern inline void removePrompt(); -extern inline void repositionCursor(); -extern inline bool handleClient(Node *nodeList, Node *node, Message message); -extern inline bool receiveMessage(Node *nodeList, Node *node, Message *messageOut); +extern void removePrompt(); +extern void repositionCursor(); +extern bool handleClient(Node *nodeList, Node *node, Message message); +extern bool receiveMessage(Node *nodeList, Node *node, Message *messageOut); diff --git a/src/sender_handler.c b/src/sender_handler.c index a9d5d05..7b0e55b 100644 --- a/src/sender_handler.c +++ b/src/sender_handler.c @@ -12,7 +12,7 @@ #include "main.h" #include "message.h" -inline bool sendMessage(int sock, Message message) { +bool sendMessage(int sock, Message message) { bool result = true; size_t serializedMessageLen; uint8_t *serializedMessage = serializeMessage(message, &serializedMessageLen); @@ -29,7 +29,8 @@ inline bool sendMessage(int sock, Message message) { return result; } -inline void sendMessageAll(Node *nodeList, Node *nodeExclude, Message message) { +void sendMessageAll(Node *nodeList, Node *nodeExclude, Message message) { + debug("sendMessageAll()..."); printNodeList(nodeList); Node *curNode = nodeList; while (curNode != NULL) { @@ -41,7 +42,7 @@ inline void sendMessageAll(Node *nodeList, Node *nodeExclude, Message message) { } } -inline void connectSocket(Node *nodeList, Node *node) { +void connectSocket(Node *nodeList, Node *node) { struct sockaddr_in serv_addr; bzero((char *) &serv_addr, sizeof(serv_addr)); @@ -82,7 +83,7 @@ inline void connectSocket(Node *nodeList, Node *node) { } } -inline bool connectToNode(Node *nodeList, Node *node, bool newJoin, Message *joinMessageOut) { +bool connectToNode(Node *nodeList, Node *node, bool newJoin, Message *joinMessageOut) { // Join the first Node in the NodeList connectSocket(nodeList, node); @@ -92,11 +93,13 @@ inline bool connectToNode(Node *nodeList, Node *node, bool newJoin, Message *joi *joinMessageOut = createJoinMessage(nodeList->username, nodeList->port, newJoin); return true; } - + + debug("Error: Node is not connected!"); + return false; } -inline bool handleCommand(Node *nodeList, char *input, CommandResult *cmdResultOut) { +bool handleCommand(Node *nodeList, char *input, CommandResult *cmdResultOut) { cmdResultOut->action = ACTION_NOTHING; char *tokenizedInput = strdup(input); @@ -115,7 +118,7 @@ inline bool handleCommand(Node *nodeList, char *input, CommandResult *cmdResultO } else { if (connectToNode(nodeList, nodeList->nextNode, true, &cmdResultOut->message)) - printf("You successfully the chat room.\n"); + printf("You successfully joined the chat room.\n"); else return false; } diff --git a/src/sender_handler.h b/src/sender_handler.h index 4a727c6..8feecfb 100644 --- a/src/sender_handler.h +++ b/src/sender_handler.h @@ -20,8 +20,8 @@ typedef struct { -extern inline bool sendMessage(int sock, Message message); -extern inline void sendMessageAll(Node *nodeList, Node *nodeExclude, Message message); -extern inline void connectSocket(Node *nodeList, Node *node); -extern inline bool connectToNode(Node *nodeList, Node *node, bool newJoin, Message *joinMessageOut); -extern inline bool handleCommand(Node *nodeList, char *input, CommandResult *cmdResultOut); +extern bool sendMessage(int sock, Message message); +extern void sendMessageAll(Node *nodeList, Node *nodeExclude, Message message); +extern void connectSocket(Node *nodeList, Node *node); +extern bool connectToNode(Node *nodeList, Node *node, bool newJoin, Message *joinMessageOut); +extern bool handleCommand(Node *nodeList, char *input, CommandResult *cmdResultOut);