diff options
-rw-r--r-- | client_network.c | 24 | ||||
-rw-r--r-- | main.c | 8 | ||||
-rw-r--r-- | network.h | 2 |
3 files changed, 27 insertions, 7 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; } @@ -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}; @@ -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; |