From f1e017394d970ee8f8e22edf9a9a2c3e77f33cbd Mon Sep 17 00:00:00 2001 From: z3APA3A <3APA3A@3proxy.ru> Date: Sun, 19 Oct 2014 04:32:18 +0400 Subject: [PATCH] Added IPv6 support for 'external' command and -e Now, 2 external addresses can be specified: one for IPv4 and one for IPv6 --- src/3proxy.c | 13 +++++++++++-- src/common.c | 8 +++++--- src/datatypes.c | 12 ++++++------ src/proxymain.c | 33 +++++++++++++++++++++++++-------- src/structures.h | 8 ++++---- src/version.h | 2 +- 6 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/3proxy.c b/src/3proxy.c index bed4737..1cd8d15 100644 --- a/src/3proxy.c +++ b/src/3proxy.c @@ -732,7 +732,16 @@ static int h_internal(int argc, unsigned char ** argv){ } static int h_external(int argc, unsigned char ** argv){ - conf.extip = getip(argv[1]); + int res; +#ifndef NOIPV6 + struct sockaddr_in6 sa6; + res = getip46(46, argv[1], (struct sockaddr *)&sa6); + if(!res) return 1; + memcpy((*SAFAMILY(&sa6)==AF_INET)?(void *)&conf.extsa:(void *)&conf.extsa6, &sa6, SASIZE(&sa6)); +#else + res = getip46(46, argv[1], (struct sockaddr *)&conf.extsa); + if(!res) return 1; +#endif return 0; } @@ -2040,7 +2049,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int { char * args[] = {"auth", "iponly", NULL}; - h_auth(2, args); + h_auth(2, (unsigned char **)args); } res = readconfig(fp); diff --git a/src/common.c b/src/common.c index 7b2e114..a0b18bd 100644 --- a/src/common.c +++ b/src/common.c @@ -65,9 +65,11 @@ struct extparam conf = { NULL, NULL, NONE, NONE, NULL, - {AF_INET}, - INADDR_ANY, - 0, +#ifndef NOIPV6 + {AF_INET},{AF_INET6},{AF_INET}, +#else + {AF_INET},{AF_INET}, +#endif NULL, NULL, doconnect, diff --git a/src/datatypes.c b/src/datatypes.c index 074b62c..40b5649 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -564,12 +564,12 @@ static void * ef_server_intsa(struct node * node){ return &((struct srvparam *)node->value) -> intsa; } -static void * ef_server_extip(struct node * node){ - return &((struct srvparam *)node->value) -> extip; +static void * ef_server_extsa(struct node * node){ + return &((struct srvparam *)node->value) -> extsa; } -static void * ef_server_extport(struct node * node){ - return &((struct srvparam *)node->value) -> extport; +static void * ef_server_extsa6(struct node * node){ + return &((struct srvparam *)node->value) -> extsa6; } static void * ef_server_acl(struct node * node){ @@ -754,8 +754,8 @@ static struct property prop_server[] = { {prop_server + 3, "targetport", ef_server_targetport, TYPE_PORT, "portmapper target port"}, {prop_server + 4, "starttime", ef_server_starttime, TYPE_DATETIME, "service started seconds"}, {prop_server + 5, "intsa", ef_server_intsa, TYPE_SA, "ip address of internal interface"}, - {prop_server + 6, "extip", ef_server_extip, TYPE_IP, "ip address of external interface"}, - {prop_server + 7, "extport", ef_server_extport, TYPE_PORT, "port to use for outgoing connection"}, + {prop_server + 6, "extsa", ef_server_extsa, TYPE_SA, "ip address of external interface"}, + {prop_server + 7, "extsa6", ef_server_extsa6, TYPE_SA, "ipv6 address of external interface"}, {prop_server + 8, "auth", ef_server_auth, TYPE_STRING, "service authentication type"}, {prop_server + 9, "acl", ef_server_acl, TYPE_ACE, "access control list"}, {prop_server + 10, "singlepacket", ef_server_singlepacket, TYPE_INTEGER, "is single packet redirection"}, diff --git a/src/proxymain.c b/src/proxymain.c index b8ad7e2..ab2c5ae 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -176,7 +176,15 @@ int MODULEMAINFUNC (int argc, char** argv){ getip46(46, argv[i]+2, (struct sockaddr *)&srv.intsa); break; case 'e': - srv.extip = getip((unsigned char *)argv[i]+2); + { +#ifndef NOIPV6 + struct sockaddr_in6 sa6; + error = !getip46(46, argv[i]+2, (struct sockaddr *)&sa6); + if(!error) memcpy((*SAFAMILY(&sa6)==AF_INET)?(void *)&srv.extsa:(void *)&srv.extsa6, &sa6, SASIZE(&sa6)); +#else + error = !getip46(46, argv[i]+2, (struct sockaddr *)&srv.extsa); +#endif + } break; case 'p': *SAPORT(&srv.intsa) = htons(atoi(argv[i]+2)); @@ -313,6 +321,10 @@ int MODULEMAINFUNC (int argc, char** argv){ srvinit2(&srv, &defparam); if(!*SAFAMILY(&srv.intsa)) *SAFAMILY(&srv.intsa) = AF_INET; if(!*SAPORT(&srv.intsa)) *SAPORT(&srv.intsa) = htons(childdef.port); + *SAFAMILY(&srv.extsa) = AF_INET; +#ifndef NOIPV6 + *SAFAMILY(&srv.extsa6) = AF_INET6; +#endif if(hostname)parsehostname(hostname, &defparam, childdef.port); @@ -535,6 +547,10 @@ void srvinit(struct srvparam * srv, struct clientparam *param){ *SAFAMILY(¶m->req) = *SAFAMILY(¶m->sins) = *SAFAMILY(¶m->sincr) = *SAFAMILY(¶m->sincl) = AF_INET; pthread_mutex_init(&srv->counter_mutex, NULL); memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa)); + memcpy(&srv->extsa, &conf.extsa, sizeof(srv->extsa)); +#ifndef NOIPV6 + memcpy(&srv->extsa6, &conf.extsa6, sizeof(srv->extsa6)); +#endif } void srvinit2(struct srvparam * srv, struct clientparam *param){ @@ -550,12 +566,9 @@ void srvinit2(struct srvparam * srv, struct clientparam *param){ else srv->logformat = (unsigned char *)mystrdup((char *)srv->logformat); } if(srv->logtarget) srv->logtarget = (unsigned char *)mystrdup((char *)srv->logtarget); - if(!*SAFAMILY(&srv->intsa)) *SAFAMILY(&srv->intsa) = AF_INET; memcpy(¶m->sincr, &srv->intsa, sizeof(param->sincr)); - if(!srv->extip) srv->extip = conf.extip; - param->sins.sin_addr.s_addr = param->extip = srv->extip; - if(!srv->extport) srv->extport = htons(conf.extport); - param->sins.sin_port = param->extport = srv->extport; +/* FIX ME */ + memcpy(¶m->sins, &srv->extsa, sizeof(param->sins)); } void srvfree(struct srvparam * srv){ @@ -858,9 +871,13 @@ void freeconf(struct extparam *confp){ confp->authfunc = ipauth; confp->bandlimfunc = NULL; memset(&confp->intsa, 0, sizeof(confp->intsa)); + memset(&confp->extsa, 0, sizeof(confp->extsa)); +#ifndef NOIPV6 + memset(&confp->extsa6, 0, sizeof(confp->extsa6)); + *SAFAMILY(&confp->extsa6) = AF_INET6; +#endif *SAFAMILY(&confp->intsa) = AF_INET; - confp->extip = 0; - *SAPORT(&confp->intsa) = confp->extport = 0; + *SAFAMILY(&confp->extsa) = AF_INET; confp->singlepacket = 0; confp->maxchild = 100; resolvfunc = NULL; diff --git a/src/structures.h b/src/structures.h index 5489299..5aa2ced 100644 --- a/src/structures.h +++ b/src/structures.h @@ -356,10 +356,11 @@ struct srvparam { unsigned logdumpsrv, logdumpcli; #ifndef NOIPV6 struct sockaddr_in6 intsa; + struct sockaddr_in6 extsa6; #else struct sockaddr_in intsa; #endif - unsigned long extip; + struct sockaddr_in extsa; pthread_mutex_t counter_mutex; struct pollfd fds; FILE *stdlog; @@ -372,7 +373,6 @@ struct srvparam { unsigned char * logformat; unsigned char * logtarget; unsigned char * nonprintable; - unsigned short extport; unsigned short targetport; unsigned char replace; time_t time_start; @@ -484,11 +484,11 @@ struct extparam { char * counterfile; #ifndef NOIPV6 struct sockaddr_in6 intsa; + struct sockaddr_in6 extsa6; #else struct sockaddr_in intsa; #endif - unsigned long extip; - unsigned short extport; + struct sockaddr_in extsa; struct passwords *pwl; struct auth * authenticate; AUTHFUNC authfunc; diff --git a/src/version.h b/src/version.h index 45f99ca..15a8005 100644 --- a/src/version.h +++ b/src/version.h @@ -1,2 +1,2 @@ #define VERSION "3proxy-0.8b-devel" -#define BUILDDATE "140703033508" +#define BUILDDATE "141019042604"