implemented bind support (vhost)
authorpk910 <philipp@zoelle1.de>
Sat, 10 Dec 2011 12:55:09 +0000 (13:55 +0100)
committerpk910 <philipp@zoelle1.de>
Sat, 10 Dec 2011 13:01:42 +0000 (14:01 +0100)
src/ClientSocket.c
src/ClientSocket.h
src/bot_DummyServ.c
src/bot_NeonHelp.c
src/bot_NeonServ.c
src/bot_NeonSpam.c

index 7ddaa3e46be9c620693efe469833e87fdbbce804..abf11a1945e0611006a54125947f0f5b223e9214 100644 (file)
@@ -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);
index 1ef009c148471a8d3395c98a52a3c163ee962a78..8d7ba76597ca4c2d9547cdb732a70421b606961b 100644 (file)
@@ -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);
index 26350986f297023f0cd78e08376c07dd6dcf2edc..e9ae76bc8e71a0d275e315b5ba7a953c54d4ab7d 100644 (file)
@@ -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);
index 65df0fe142a48e9694969e302c0dc7481af7675f..aa75426c4743b7a363674b6010cdcc18cf3e26d4 100644 (file)
@@ -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);
index 6bedff9c381b44618d097876e32c3ac4ed36bbdf..785de6fead5d1b7565f933a11aadb6d39e5f1e09 100644 (file)
@@ -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);
index 0431f4a6665be84fc000f47b36b4b4abce1c5596..9d5ea6418d1a73ce1bc3011ab047fdea1dae65d6 100644 (file)
@@ -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);