From 9d77ca8f63040a3945f634090be990fdeb05c2f3 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sat, 10 Dec 2011 13:55:09 +0100 Subject: [PATCH] implemented bind support (vhost) --- src/ClientSocket.c | 47 ++++++++++++++++++++++++++++++++++++++++++--- src/ClientSocket.h | 3 ++- src/bot_DummyServ.c | 4 ++-- src/bot_NeonHelp.c | 4 ++-- src/bot_NeonServ.c | 4 ++-- src/bot_NeonSpam.c | 4 ++-- 6 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/ClientSocket.c b/src/ClientSocket.c index 7ddaa3e..abf11a1 100644 --- a/src/ClientSocket.c +++ b/src/ClientSocket.c @@ -43,7 +43,7 @@ static void init_sockets() { sockets->count = 0; } -struct ClientSocket* create_socket(char *host, int port, char *pass, char *nick, char *ident, char *realname) { +struct ClientSocket* create_socket(char *host, int port, char *bindto, char *pass, char *nick, char *ident, char *realname) { if(sockets == NULL) init_sockets(); struct ClientSocket *client = malloc(sizeof(*client)); if (!client) @@ -53,6 +53,7 @@ struct ClientSocket* create_socket(char *host, int port, char *pass, char *nick, } client->host = strdup(host); client->port = port; + client->bind = (bindto ? strdup(bindto) : NULL); client->pass = (pass == NULL ? NULL : strdup(pass)); client->nick = strdup(nick); client->ident = strdup(ident); @@ -111,6 +112,23 @@ int connect_socket(struct ClientSocket *client) { ip6->sin6_family = AF_INET6; ip6->sin6_port = htons(client->port); + struct sockaddr_in6 *ip6vhost = NULL; + if (client->bind && !getaddrinfo(client->bind, NULL, &hints, &res)) { + while (res) { + switch (res->ai_family) { + case AF_INET6: + ip6vhost = (struct sockaddr_in6 *) res->ai_addr; + break; + } + res = res->ai_next; + } + } + if(ip6vhost) { + ip6vhost->sin6_family = AF_INET6; + ip6vhost->sin6_port = htons(0); + bind(sock, (struct sockaddr*)ip6vhost, sizeof(*ip6vhost)); + } + if (connect(sock, (struct sockaddr*)ip6, sizeof(*ip6)) == -1) { perror("connect() failed"); return 0; @@ -126,6 +144,23 @@ int connect_socket(struct ClientSocket *client) { ip4->sin_family = AF_INET; ip4->sin_port = htons(client->port); + struct sockaddr_in *ip4vhost = NULL; + if (client->bind && !getaddrinfo(client->bind, NULL, &hints, &res)) { + while (res) { + switch (res->ai_family) { + case AF_INET: + ip4vhost = (struct sockaddr_in *) res->ai_addr; + break; + } + res = res->ai_next; + } + } + if(ip4vhost) { + ip4vhost->sin_family = AF_INET; + ip4vhost->sin_port = htons(0); + bind(sock, (struct sockaddr*)ip4vhost, sizeof(*ip4vhost)); + } + if (connect(sock, (struct sockaddr*)ip4, sizeof(*ip4)) == -1) { perror("connect() failed"); return 0; @@ -182,7 +217,10 @@ int close_socket(struct ClientSocket *client) { if(client->handleinfo_first) clear_handleinfoqueue(client); free(client->host); - free(client->pass); + if(client->bind) + free(client->bind); + if(client->pass) + free(client->pass); free(client); return 1; } @@ -323,7 +361,10 @@ void free_sockets() { if(client->queue) queue_destroy(client); free(client->host); - free(client->pass); + if(client->bind) + free(client->bind); + if(client->pass) + free(client->pass); free(client); } free(sockets); diff --git a/src/ClientSocket.h b/src/ClientSocket.h index 1ef009c..8d7ba76 100644 --- a/src/ClientSocket.h +++ b/src/ClientSocket.h @@ -40,6 +40,7 @@ struct ClientSocket { unsigned int bufferpos; char *host; int port; + char *bind; char *pass; char *nick; char *ident; @@ -64,7 +65,7 @@ struct ClientSocket { struct ClientSocket *next; }; -struct ClientSocket* create_socket(char *host, int port, char *pass, char *nick, char *ident, char *realname); +struct ClientSocket* create_socket(char *host, int port, char *bindto, char *pass, char *nick, char *ident, char *realname); int connect_socket(struct ClientSocket *client); int close_socket(struct ClientSocket *client); int write_socket_force(struct ClientSocket *client, char* msg, int len); diff --git a/src/bot_DummyServ.c b/src/bot_DummyServ.c index 2635098..e9ae76b 100644 --- a/src/bot_DummyServ.c +++ b/src/bot_DummyServ.c @@ -69,11 +69,11 @@ static void start_bots() { MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); res = mysql_use(); while ((row = mysql_fetch_row(res)) != NULL) { - client = create_socket(row[3], atoi(row[4]), row[5], row[0], row[1], row[2]); + client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); diff --git a/src/bot_NeonHelp.c b/src/bot_NeonHelp.c index 65df0fe..aa75426 100644 --- a/src/bot_NeonHelp.c +++ b/src/bot_NeonHelp.c @@ -64,11 +64,11 @@ static void start_bots() { MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); res = mysql_use(); while ((row = mysql_fetch_row(res)) != NULL) { - client = create_socket(row[3], atoi(row[4]), row[5], row[0], row[1], row[2]); + client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 6bedff9..785de6f 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -409,11 +409,11 @@ static void start_bots() { MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); res = mysql_use(); while ((row = mysql_fetch_row(res)) != NULL) { - client = create_socket(row[3], atoi(row[4]), row[5], row[0], row[1], row[2]); + client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); diff --git a/src/bot_NeonSpam.c b/src/bot_NeonSpam.c index 0431f4a..9d5ea64 100644 --- a/src/bot_NeonSpam.c +++ b/src/bot_NeonSpam.c @@ -147,11 +147,11 @@ static void start_bots() { MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); res = mysql_use(); while ((row = mysql_fetch_row(res)) != NULL) { - client = create_socket(row[3], atoi(row[4]), row[5], row[0], row[1], row[2]); + client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); -- 2.20.1