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 <patchdev@fat-dragon.org>
This commit is contained in:
parent
d6826137dd
commit
b28e003945
@ -1,6 +1,8 @@
|
|||||||
#ifndef __BBS_H__
|
#ifndef __BBS_H__
|
||||||
#define __BBS_H__
|
#define __BBS_H__
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
@ -239,9 +239,61 @@ void append_screenbuffer(char *buffer) {
|
|||||||
row_at = 0;
|
row_at = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void chat_system(struct user_record *user) {
|
int chat_connect_ipv6(int *socketp) {
|
||||||
struct sockaddr_in servaddr;
|
|
||||||
struct sockaddr_in6 servaddr6;
|
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;
|
fd_set fds;
|
||||||
int t;
|
int t;
|
||||||
int ret;
|
int ret;
|
||||||
@ -250,7 +302,6 @@ void chat_system(struct user_record *user) {
|
|||||||
int len;
|
int len;
|
||||||
char c;
|
char c;
|
||||||
char buffer2[256];
|
char buffer2[256];
|
||||||
char buffer[513];
|
|
||||||
char outputbuffer[513];
|
char outputbuffer[513];
|
||||||
char readbuffer[1024];
|
char readbuffer[1024];
|
||||||
char message[1024];
|
char message[1024];
|
||||||
@ -290,74 +341,16 @@ void chat_system(struct user_record *user) {
|
|||||||
s_putstring("\e[24;1H");
|
s_putstring("\e[24;1H");
|
||||||
|
|
||||||
if (conf.ipv6) {
|
if (conf.ipv6) {
|
||||||
memset(&servaddr6, 0, sizeof(struct sockaddr_in6));
|
chat_connected = chat_connect_ipv6(&chat_socket);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!chat_connected) {
|
if (!chat_connected) {
|
||||||
memset(&servaddr, 0, sizeof(struct sockaddr_in));
|
chat_connected = chat_connect_ipv4(&chat_socket);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(buffer, 0, 513);
|
if (!chat_connected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
screenbuffer = (struct character_t ***)malloc(sizeof(struct character_t **) * 23);
|
screenbuffer = (struct character_t ***)malloc(sizeof(struct character_t **) * 23);
|
||||||
for (i = 0; i < 23; i++) {
|
for (i = 0; i < 23; i++) {
|
||||||
@ -488,7 +481,6 @@ void chat_system(struct user_record *user) {
|
|||||||
append_screenbuffer(outputbuffer);
|
append_screenbuffer(outputbuffer);
|
||||||
do_update = 1;
|
do_update = 1;
|
||||||
|
|
||||||
memset(buffer, 0, 513);
|
|
||||||
buffer_at = 0;
|
buffer_at = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user