From bc7ca3af09d8db2d32f8003c2395e40647bb30bf Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Wed, 7 May 2014 03:29:57 +0400 Subject: [PATCH] intip changed to intsa intip changed to intsa for IPv6 use --- src/3proxy.c | 2 +- src/common.c | 3 ++- src/datatypes.c | 18 +++++++++++++++--- src/dnspr.c | 2 +- src/proxy.c | 3 ++- src/proxy.h | 5 ----- src/proxymain.c | 10 ++++++---- src/socks.c | 2 +- src/structures.h | 9 +++++++-- 9 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/3proxy.c b/src/3proxy.c index 5c88298..20e8caa 100644 --- a/src/3proxy.c +++ b/src/3proxy.c @@ -727,7 +727,7 @@ static int h_proxy(int argc, unsigned char ** argv){ } static int h_internal(int argc, unsigned char ** argv){ - conf.intip = getip(argv[1]); + getip46(46, argv[1], &conf.intsa); return 0; } diff --git a/src/common.c b/src/common.c index fe94d3e..028fe42 100644 --- a/src/common.c +++ b/src/common.c @@ -56,7 +56,8 @@ struct extparam conf = { NULL, NULL, NONE, NONE, NULL, - INADDR_ANY, INADDR_ANY, + {AF_INET}, + INADDR_ANY, 0, 0, NULL, NULL, diff --git a/src/datatypes.c b/src/datatypes.c index 554ab8f..ce9c94c 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -72,6 +72,17 @@ static void pr_ip(struct node *node, CBFUNC cbf, void*cb){ if(node->value)(*cbf)(cb, buf, ipprint(buf, *(unsigned *)node -> value)); } +static void pr_sa(struct node *node, CBFUNC cbf, void*cb){ +#ifdef NOIPV6 + if(node->value)return pr_ip(node, &((struct sockaddr_in *)node->value)->sin_addr.s_addr) +#else + char buf[64]; + *buf = 0; + inet_ntop(((struct sockaddr *)node -> value)->sa_family, node->value, buf, sizeof(buf)); + if(node->value)(*cbf)(cb, buf, strlen(buf)); +#endif +} + static void pr_wdays(struct node *node, CBFUNC cbf, void*cb){ char buf[16]; int i, found = 0; @@ -555,8 +566,8 @@ static void * ef_server_targetport(struct node * node){ return &((struct srvparam *)node->value) -> targetport; } -static void * ef_server_intip(struct node * node){ - return &((struct srvparam *)node->value) -> intip; +static void * ef_server_intsa(struct node * node){ + return &((struct srvparam *)node->value) -> intsa; } static void * ef_server_extip(struct node * node){ @@ -763,7 +774,7 @@ static struct property prop_server[] = { {prop_server + 2, "target", ef_server_target, TYPE_STRING, "portmapper target ip"}, {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, "intip", ef_server_intip, TYPE_IP, "ip address of internal interface"}, + {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, "intport", ef_server_intport, TYPE_PORT, "port to listen"}, {prop_server + 8, "extport", ef_server_extport, TYPE_PORT, "port to use for outgoing connection"}, @@ -819,6 +830,7 @@ struct datatype datatypes[64] = { {"traffic", NULL, pr_traffic, NULL}, {"port", NULL, pr_port, NULL}, {"ip", NULL, pr_ip, NULL}, + {"sa", NULL, pr_sa, NULL}, {"cidr", NULL, pr_cidr, NULL}, {"string", NULL, pr_string, NULL}, {"datetime", NULL, pr_datetime, NULL}, diff --git a/src/dnspr.c b/src/dnspr.c index 6612d6f..f9ef868 100644 --- a/src/dnspr.c +++ b/src/dnspr.c @@ -107,7 +107,7 @@ void * dnsprchild(struct clientparam* param) { unsigned a, b, c, d; sscanf(host, "%u.%u.%u.%u", &a, &b, &c, &d); ip = htonl((d<<24) ^ (c<<16) ^ (b<<8) ^ a); - if(ip == param->srv->intip){ + if(param->srv->intsa.ss_family == AF_INET && ip == ((struct sockaddr_in *)¶m->srv->intsa)->sin_addr.s_addr){ buf[2] = 0x85; buf[3] = 0x80; buf[6] = 0; diff --git a/src/proxy.c b/src/proxy.c index f971abe..cd6824c 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -545,7 +545,8 @@ for(;;){ #endif if((res = (*param->srv->authfunc)(param))) {RETURN(res);} - if (param->sins.sin_addr.s_addr == param->srv->intip && param->sins.sin_port == param->srv->intport) { + if (param->srv->intsa.ss_family == AF_INET && + (param->sins.sin_addr.s_addr == ((struct sockaddr_in *)¶m->srv->intsa)->sin_addr.s_addr && param->sins.sin_port == param->srv->intport)) { RETURN(519); } sasize = sizeof(struct sockaddr_in); diff --git a/src/proxy.h b/src/proxy.h index 0e5ee31..2fd1c22 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -47,10 +47,6 @@ #ifdef _WIN32 #include -#ifndef NOIPV6 -#include - -#endif #ifndef _WINCE #include #else @@ -319,7 +315,6 @@ extern pthread_mutex_t odbc_mutex; #endif extern struct hashtable dns_table; - extern struct datatype datatypes[64]; extern struct commands commandhandlers[]; diff --git a/src/proxymain.c b/src/proxymain.c index ff22a9b..a158afa 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -173,7 +173,7 @@ int MODULEMAINFUNC (int argc, char** argv){ } break; case 'i': - srv.intip = getip((unsigned char *)argv[i]+2); + getip46(46, argv[i]+2, &srv.intsa); break; case 'e': srv.extip = getip((unsigned char *)argv[i]+2); @@ -535,8 +535,8 @@ 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(!srv->intip) srv->intip = conf.intip; - param->sinc.sin_addr.s_addr = srv->intip; + if(!srv->intsa.ss_family) memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa)); + param->sinc.sin_addr.s_addr = ((struct sockaddr_in *)&srv->intsa)->sin_addr.s_addr; param->sinc.sin_port = srv->intport; if(!srv->extip) srv->extip = conf.extip; param->sins.sin_addr.s_addr = param->extip = srv->extip; @@ -843,7 +843,9 @@ void freeconf(struct extparam *confp){ confp->logtype = NONE; confp->authfunc = ipauth; confp->bandlimfunc = NULL; - confp->intip = confp->extip = 0; + memset(&confp->intsa, 0, sizeof(confp->intsa)); + confp->intsa.ss_family = AF_INET; + confp->extip = 0; confp->intport = confp->extport = 0; confp->singlepacket = 0; confp->maxchild = 100; diff --git a/src/socks.c b/src/socks.c index 5bdba1d..d8c9237 100644 --- a/src/socks.c +++ b/src/socks.c @@ -178,7 +178,7 @@ fflush(stderr); param->clisock = so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(param->clisock == INVALID_SOCKET) {RETURN(11);} sin.sin_family = AF_INET; - sin.sin_addr.s_addr = param->srv->intip; + sin.sin_addr.s_addr = ((struct sockaddr_in *)¶m->srv->intsa)->sin_addr.s_addr; sin.sin_port = htons(0); if(so._bind(param->clisock,(struct sockaddr *)&sin,sizeof(struct sockaddr_in))) {RETURN (12);} #if SOCKSTRACE > 0 diff --git a/src/structures.h b/src/structures.h index b0058d3..6cabb6d 100644 --- a/src/structures.h +++ b/src/structures.h @@ -28,6 +28,9 @@ extern "C" { #define INVALID_SOCKET (-1) #else #include +#ifndef NOIPV6 +#include +#endif #define pthread_mutex_t CRITICAL_SECTION #define pthread_mutex_init(x, y) InitializeCriticalSection(x) #define pthread_mutex_lock(x) EnterCriticalSection(x) @@ -330,7 +333,7 @@ struct srvparam { int nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv; unsigned bufsize; unsigned logdumpsrv, logdumpcli; - unsigned long intip; + struct sockaddr_storage intsa; unsigned long extip; pthread_mutex_t counter_mutex; struct pollfd fds; @@ -451,7 +454,8 @@ struct extparam { unsigned char *logname, **archiver; ROTATION logtype, countertype; char * counterfile; - unsigned long intip, extip; + struct sockaddr_storage intsa; + unsigned long extip; unsigned short intport, extport; struct passwords *pwl; struct auth * authenticate; @@ -659,6 +663,7 @@ typedef enum { TYPE_TRAFFIC, TYPE_PORT, TYPE_IP, + TYPE_SA, TYPE_CIDR, TYPE_STRING, TYPE_DATETIME,