diff options
-rw-r--r-- | client_network.c | 24 | ||||
-rw-r--r-- | commands.c | 2 | ||||
-rw-r--r-- | main.c | 10 | ||||
-rw-r--r-- | network.h | 2 | ||||
-rw-r--r-- | server_network.c | 4 |
5 files changed, 30 insertions, 12 deletions
diff --git a/client_network.c b/client_network.c index 1ae8fea..0050812 100644 --- a/client_network.c +++ b/client_network.c @@ -29,6 +29,7 @@ #include <gnutls/gnutls.h> #include <netdb.h> #include <arpa/inet.h> +#include <errno.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> @@ -535,6 +536,10 @@ int client_mode_handler(uint64_t argc, struct string *argv) { int client_fd = -1; int client_listen_fd; +int client_listen_fd_ready = 0; +struct sockaddr_in client_listen_fd_bind_addr = { + .sin_family = AF_INET, +}; int initclientnetwork(void) { client_network_commands.array = malloc(0); @@ -555,14 +560,19 @@ int initclientnetwork(void) { int one = 1; setsockopt(client_listen_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - struct sockaddr_in localhost = { - .sin_family = AF_INET, - .sin_port = htons(6667), - }; - inet_pton(AF_INET, "127.0.0.1", &localhost.sin_addr); // this is indeed localhost for mine, and I have no intent to change this - bind(client_listen_fd, (struct sockaddr*)&localhost, sizeof(localhost)); + client_listen_fd_bind_addr.sin_port = htons(6667); + + inet_pton(AF_INET, "127.0.0.1", &client_listen_fd_bind_addr.sin_addr); // this is indeed localhost for mine, and I have no intent to change this - listen(client_listen_fd, 1); + if (bind(client_listen_fd, (struct sockaddr*)&client_listen_fd_bind_addr, sizeof(client_listen_fd_bind_addr)) == -1) { + if (errno != EADDRINUSE) { + close(client_listen_fd); + return 1; + } + } else { + listen(client_listen_fd, 1); + client_listen_fd_ready = 1; + } return 0; } @@ -173,7 +173,7 @@ int spam_command(struct string sender, struct string original_message, struct st struct command_def *cmd = get_table_index(user_commands, argv[2]); if (cmd) { if (!cmd->local_only) { - if (cmd->privs.len != 0 && sender.len != 3) { + if (cmd->privs.len != 0 && sender.len != 3 && !is_local) { struct user_info *user = get_table_index(user_list, sender); if (!user) return 1; // really shouldn't happen @@ -39,6 +39,14 @@ #include "types.h" void *client_loop(void *ign) { + while (!client_listen_fd_ready) { + if (bind(client_listen_fd, (struct sockaddr *)&client_listen_fd_bind_addr, sizeof(client_listen_fd_bind_addr)) == -1) { + sleep(1); + } else { + client_listen_fd_ready = 1; + } + } + pthread_mutex_lock(&send_lock); while (1) { struct string full_msg = {.data = malloc(0), .len = 0}; @@ -266,7 +274,7 @@ int main(void) { if (last_timeout) { break; } else { - SEND(STRING(":1HC PING 1HC 100\n")); // TODO: Fix this as well + SEND(STRING(":1HC PING 1HC 101\n")); // TODO: Fix this as well last_timeout = 1; } } @@ -89,6 +89,8 @@ extern pthread_mutex_t send_lock; extern int client_fd; extern int client_listen_fd; +extern int client_listen_fd_ready; +extern struct sockaddr_in client_listen_fd_bind_addr; extern struct string client_nick; extern uint8_t client_connected; diff --git a/server_network.c b/server_network.c index 8676cc3..10b2023 100644 --- a/server_network.c +++ b/server_network.c @@ -339,7 +339,6 @@ int opertype_handler(struct string sender, uint64_t argc, struct string *argv) { return 1; } - free(user->opertype.data); struct string opertype = {.data = malloc(argv[0].len), .len = argv[0].len}; if (!opertype.data) { WRITES(2, STRING("OOM! (opertype_handler)\n")); @@ -347,8 +346,7 @@ int opertype_handler(struct string sender, uint64_t argc, struct string *argv) { } memcpy(opertype.data, argv[0].data, argv[0].len); - if (user->opertype.len) - free(user->opertype.data); + free(user->opertype.data); user->opertype = opertype; |