aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-08-17 21:27:02 -0400
committerTest_User <hax@andrewyu.org>2024-08-17 21:27:02 -0400
commitf576099a00cdf87d2e8931da8ec03e2b27c449a2 (patch)
tree875cb1b89a8834d5e17ef21215fdef5c81cff9d1
parente4768d794d676e82db9428148b52aab46292d80e (diff)
downloadc_coupserv-f576099a00cdf87d2e8931da8ec03e2b27c449a2.tar.gz
c_coupserv-f576099a00cdf87d2e8931da8ec03e2b27c449a2.zip
Retry binding for the client socket if EADDRINUSE
-rw-r--r--client_network.c24
-rw-r--r--main.c8
-rw-r--r--network.h2
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;
}
diff --git a/main.c b/main.c
index e3ba683..1ec66bc 100644
--- a/main.c
+++ b/main.c
@@ -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};
diff --git a/network.h b/network.h
index a05503e..d9df589 100644
--- a/network.h
+++ b/network.h
@@ -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;