Preparation for IPv6 support
authorFelix Morgner <felix.morgner@gmail.com>
Mon, 28 Apr 2014 11:42:07 +0000 (13:42 +0200)
committerFelix Morgner <felix.morgner@gmail.com>
Mon, 28 Apr 2014 17:14:55 +0000 (19:14 +0200)
- Two new configuration variables were introduced (bindport6, bindaddr6)
- Analogously two new commandline parameters were introduced -A and -B
- Address and port setup were moved into a seperate function to clean up
  the code a little.

src/conf.c
src/conf.h
src/main.c
src/server.c

index 2c6f56f9ffa5fd404fd2f10618a241cf42488d6c..a93031fab2492ff11f6fe2e2482e63cebd2723d0 100644 (file)
@@ -152,6 +152,17 @@ const char *getStrConf(param_t param)
                                return "";
                }
                break;
+       case BINDADDR6:
+               setting = config_lookup(&configuration, "bindaddr6");
+               if (!setting)
+                       return "";
+               else {
+                       if ((strsetting = config_setting_get_string(setting)) != NULL)
+                               return strsetting;
+                       else
+                               return "";
+               }
+               break;
        case WELCOMETEXT:
                setting = config_lookup(&configuration, "welcometext");
                if (!setting)
@@ -238,6 +249,14 @@ int getIntConf(param_t param)
                        return config_setting_get_int(setting);
                }
                break;
+       case BINDPORT6:
+               setting = config_lookup(&configuration, "bindport6");
+               if (!setting)
+                       return DEFAULT_BINDPORT;
+               else {
+                       return config_setting_get_int(setting);
+               }
+               break;
        case BAN_LENGTH:
                setting = config_lookup(&configuration, "ban_length");
                if (!setting)
index 8253fb330ba3c190f0d6331e2b07671c83bdd81f..8113d85d0c2a1cb7b49563895efd0739aad9decb 100644 (file)
@@ -40,7 +40,9 @@ typedef enum param {
        PASSPHRASE,
        CAPATH,
        BINDPORT,
+  BINDPORT6,
        BINDADDR,
+  BINDADDR6,
        WELCOMETEXT,
        MAX_BANDWIDTH,
        MAX_CLIENTS,
index bfff28ab0b4696d2d36138aea05796b11c7d736f..ebff0e523163b91fe99ae6594cbcf8bb2014f0d8 100644 (file)
@@ -58,7 +58,9 @@
 
 char system_string[64], version_string[64];
 int bindport;
+int bindport6;
 char *bindaddr;
+char *bindaddr6;
 
 void lockfile(const char *pidfile)
 {
@@ -249,9 +251,9 @@ int main(int argc, char **argv)
 
        /* Arguments */
 #ifdef POSIX_PRIORITY_SCHEDULING
-       while ((c = getopt(argc, argv, "drp:c:a:b:ht")) != EOF) {
+       while ((c = getopt(argc, argv, "drp:c:a:A:b:B:ht")) != EOF) {
 #else
-       while ((c = getopt(argc, argv, "dp:c:a:b:ht")) != EOF) {
+       while ((c = getopt(argc, argv, "dp:c:a:A:b:B:ht")) != EOF) {
 #endif
                switch(c) {
                case 'c':
@@ -263,9 +265,15 @@ int main(int argc, char **argv)
                case 'a':
                        bindaddr = optarg;
                        break;
+    case 'A':
+      bindaddr6 = optarg;
+      break;
                case 'b':
                        bindport = atoi(optarg);
                        break;
+    case 'B':
+      bindport6 = atoi(optarg);
+      break;
                case 'd':
                        nodaemon = true;
                        break;
index 05f5213abc058575cd22b1591ecb68553188cf3d..44f262c3c9441e176f99ab38b436994110fe49ef 100644 (file)
 #define TCP_SOCK 0
 #define UDP_SOCK 1
 
+#define TCP6_SOCK 2
+#define UDP6_SOCK 3
+
 /* globals */
 int udpsock;
 bool_t shutdown_server;
 extern char *bindaddr;
+extern char *bindaddr6;
 extern int bindport;
+extern int bindport6;
+
+struct sockaddr_storage** Server_setupAddressesAndPorts()
+{
+  struct sockaddr_storage** addresses;
+
+  struct sockaddr_storage* v4address = calloc(1, sizeof(struct sockaddr_storage));
+  v4address->ss_family = AF_INET;
+  v4address->ss_len = sizeof(struct sockaddr_storage);
+  struct sockaddr_storage* v6address = calloc(1, sizeof(struct sockaddr_storage));
+  v6address->ss_family = AF_INET;
+  v6address->ss_len = sizeof(struct sockaddr_storage);
+
+  int error = 0;
+
+  error = inet_pton(AF_INET, (!bindaddr) ? ((getStrConf(BINDADDR)) ? getStrConf(BINDADDR) : "0.0.0.0")
+                                         : bindaddr, &(((struct sockaddr_in*)v4address)->sin_addr));
+  if (error == 0) Log_fatal("Invalid IPv4 address supplied!");
+
+  error = inet_pton(AF_INET, (!bindaddr6) ? ((getStrConf(BINDADDR6)) ? getStrConf(BINDADDR6) : "::")
+                                         : bindaddr6, &(((struct sockaddr_in6*)v6address)->sin6_addr));
+  if (error == 0) Log_fatal("Invalid IPv6 address supplied!");
+
+  ((struct sockaddr_in*)v4address)->sin_port = htons((bindport) ? bindport : getIntConf(BINDPORT));
+  ((struct sockaddr_in6*)v6address)->sin6_port = htons((bindport) ? bindport : getIntConf(BINDPORT));
+
+  addresses[0] = v4address;
+  addresses[1] = v6address;
+
+  return addresses;
+}
 
 void Server_run()
 {