From a9e44ce53c945b997b686329a4df5d79e416a837 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 28 Apr 2014 13:42:07 +0200 Subject: [PATCH] Preparation for IPv6 support - 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 | 19 +++++++++++++++++++ src/conf.h | 2 ++ src/main.c | 12 ++++++++++-- src/server.c | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/conf.c b/src/conf.c index 2c6f56f..a93031f 100644 --- a/src/conf.c +++ b/src/conf.c @@ -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) diff --git a/src/conf.h b/src/conf.h index 8253fb3..8113d85 100644 --- a/src/conf.h +++ b/src/conf.h @@ -40,7 +40,9 @@ typedef enum param { PASSPHRASE, CAPATH, BINDPORT, + BINDPORT6, BINDADDR, + BINDADDR6, WELCOMETEXT, MAX_BANDWIDTH, MAX_CLIENTS, diff --git a/src/main.c b/src/main.c index bfff28a..ebff0e5 100644 --- a/src/main.c +++ b/src/main.c @@ -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; diff --git a/src/server.c b/src/server.c index 05f5213..44f262c 100644 --- a/src/server.c +++ b/src/server.c @@ -51,11 +51,46 @@ #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() { -- 2.30.2