From b28e003945a683826dbc9fbcf66f2a3982d3abff Mon Sep 17 00:00:00 2001 From: Dan Cross Date: Mon, 8 Oct 2018 14:13:12 +0000 Subject: [PATCH] Chat system: simplify connect logic. Simplify the logic around making connections in the chat system by delegating to utility functions that return early on failure. Signed-off-by: Dan Cross --- src/bbs.h | 2 + src/chat_system.c | 126 ++++++++++++++++++++++------------------------ 2 files changed, 61 insertions(+), 67 deletions(-) diff --git a/src/bbs.h b/src/bbs.h index 79b1594..cd51bfe 100644 --- a/src/bbs.h +++ b/src/bbs.h @@ -1,6 +1,8 @@ #ifndef __BBS_H__ #define __BBS_H__ +#include + #include #include #ifdef __APPLE__ diff --git a/src/chat_system.c b/src/chat_system.c index 123f7df..5f94f4c 100644 --- a/src/chat_system.c +++ b/src/chat_system.c @@ -239,9 +239,61 @@ void append_screenbuffer(char *buffer) { row_at = 0; } -void chat_system(struct user_record *user) { - struct sockaddr_in servaddr; +int chat_connect_ipv6(int *socketp) { struct sockaddr_in6 servaddr6; + int chat_socket; + char buffer[513]; + + memset(&servaddr6, 0, sizeof(struct sockaddr_in6)); + if (inet_pton(AF_INET6, conf.mgchat_server, &servaddr6.sin6_addr) != 1) { + if (hostname_to_ip6(conf.mgchat_server, buffer)) { + return 0; + } + if (!inet_pton(AF_INET6, buffer, &servaddr6.sin6_addr)) { + return 0; + } + } + servaddr6.sin6_family = AF_INET6; + servaddr6.sin6_port = htons(conf.mgchat_port); + if ((chat_socket = socket(AF_INET6, SOCK_STREAM, 0)) < 0) { + return 0; + } + if (connect(chat_socket, (struct sockaddr *)&servaddr6, sizeof(servaddr6)) < 0) { + return 0; + } + + *socketp = chat_socket; + return 1; +} + +int chat_connect_ipv4(int *socketp) { + struct sockaddr_in servaddr; + int chat_socket; + char buffer[513]; + + memset(&servaddr, 0, sizeof(struct sockaddr_in)); + if (inet_pton(AF_INET, conf.mgchat_server, &servaddr.sin_addr) != 1) { + if (hostname_to_ip(conf.mgchat_server, buffer)) { + return 0; + } + if (!inet_pton(AF_INET, buffer, &servaddr.sin_addr)) { + return 0; + } + } + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(conf.mgchat_port); + if ((chat_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + return 0; + } + if (connect(chat_socket, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { + return 0; + } + + *socketp = chat_socket; + return 1; +} + +void chat_system(struct user_record *user) { fd_set fds; int t; int ret; @@ -250,7 +302,6 @@ void chat_system(struct user_record *user) { int len; char c; char buffer2[256]; - char buffer[513]; char outputbuffer[513]; char readbuffer[1024]; char message[1024]; @@ -290,74 +341,16 @@ void chat_system(struct user_record *user) { s_putstring("\e[24;1H"); if (conf.ipv6) { - memset(&servaddr6, 0, sizeof(struct sockaddr_in6)); - if (inet_pton(AF_INET6, conf.mgchat_server, &servaddr6.sin6_addr) != 1) { - if (!hostname_to_ip6(conf.mgchat_server, buffer)) { - if (!inet_pton(AF_INET6, buffer, &servaddr6.sin6_addr)) { - chat_connected = 0; - } else { - servaddr6.sin6_family = AF_INET6; - servaddr6.sin6_port = htons(conf.mgchat_port); - if ((chat_socket = socket(AF_INET6, SOCK_STREAM, 0)) < 0) { - chat_connected = 0; - } else { - if (connect(chat_socket, (struct sockaddr *)&servaddr6, sizeof(servaddr6)) < 0) { - chat_connected = 0; - } else { - chat_connected = 1; - } - } - } - } else { - chat_connected = 0; - } - } else { - servaddr6.sin6_family = AF_INET6; - servaddr6.sin6_port = htons(conf.mgchat_port); - if ((chat_socket = socket(AF_INET6, SOCK_STREAM, 0)) < 0) { - chat_connected = 0; - } else { - if (connect(chat_socket, (struct sockaddr *)&servaddr6, sizeof(servaddr6)) < 0) { - chat_connected = 0; - } else { - chat_connected = 1; - } - } - } + chat_connected = chat_connect_ipv6(&chat_socket); } if (!chat_connected) { - memset(&servaddr, 0, sizeof(struct sockaddr_in)); - if (inet_pton(AF_INET, conf.mgchat_server, &servaddr.sin_addr) != 1) { - if (!hostname_to_ip(conf.mgchat_server, buffer)) { - if (!inet_pton(AF_INET, buffer, &servaddr.sin_addr)) { - return; - } else { - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(conf.mgchat_port); - if ((chat_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return; - } - if (connect(chat_socket, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { - return; - } - } - } else { - return; - } - } else { - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(conf.mgchat_port); - if ((chat_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return; - } - if (connect(chat_socket, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { - return; - } - } + chat_connected = chat_connect_ipv4(&chat_socket); } - memset(buffer, 0, 513); + if (!chat_connected) { + return; + } screenbuffer = (struct character_t ***)malloc(sizeof(struct character_t **) * 23); for (i = 0; i < 23; i++) { @@ -488,7 +481,6 @@ void chat_system(struct user_record *user) { append_screenbuffer(outputbuffer); do_update = 1; - memset(buffer, 0, 513); buffer_at = 0; } }