From 7897b009a1af5a0d57d5dc321b008104e5096192 Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Sun, 11 May 2014 01:39:02 +0400 Subject: [PATCH] intport removed, SA macro added --- .gitignore | 1 + src/common.c | 54 +++++++++++++++++++++++++++--------------------- src/datatypes.c | 35 ++++++++++++++----------------- src/dnspr.c | 2 +- src/proxy.c | 6 +++--- src/proxy.h | 6 +----- src/proxymain.c | 30 ++++++++++++++------------- src/structures.h | 30 +++++++++++++++++++++++---- 8 files changed, 94 insertions(+), 70 deletions(-) diff --git a/.gitignore b/.gitignore index 22ac573..cf580e3 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ doc/html/index.html verfile.sh Makefile Changelog +res copytgz.sh *~.nib local.properties diff --git a/src/common.c b/src/common.c index 028fe42..341967f 100644 --- a/src/common.c +++ b/src/common.c @@ -58,7 +58,7 @@ struct extparam conf = { NULL, {AF_INET}, INADDR_ANY, - 0, 0, + 0, NULL, NULL, doconnect, @@ -463,7 +463,7 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char i += myinet_ntoa(param->req.sin_addr, (char *)buf + i); break; case 'p': - sprintf((char *)buf+i, "%hu", ntohs(param->srv->intport)); + sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->srv->intsa))); i += (int)strlen((char *)buf+i); break; case 'c': @@ -720,60 +720,66 @@ unsigned long getip(unsigned char *name){ return retval; } -#ifdef NOIPV6 -unsigned long getip46(int family, unsigned char *name, struct sockaddr_in *sa){ -#else -unsigned long getip46(int family, unsigned char *name, struct sockaddr_storage *sa){ - int ndots=0, ncols=0; +unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){ +#ifndef NOIPV6 + int ndots=0, ncols=0, nhex=0; struct addrinfo *ai, *iter; - struct sockaddr *sa4, *sa6; + struct sockaddr *sa4=NULL, *sa6=NULL; int i; if(!sa) return 0; if(!family) { #endif - memset(sa, 0, sizeof(struct sockaddr_in)); ((struct sockaddr_in *)sa)->sin_family = AF_INET; return (((struct sockaddr_in *)sa)->sin_addr.s_addr = getip(name))? AF_INET:0; #ifndef NOIPV6 } for(i=0; name[i]; i++){ if(name[i] == '.'){ - if(++ndots > 3) break; - continue; + if(++ndots > 3) { + break; + } } else if(name[i] == ':'){ - if(++ndots > 7) break; - continue; + if(++ncols > 7) { + break; + } + } + else if(name[i] == '%' || (name[i] >= 'a' && name[i] <= 'f') || (name[i] >= 'A' && name[i] <= 'F')){ + nhex++; + } + else if(name[i] <'0' || name[i] >'9') { + break; } - if(name[i] <'0' || name[i] >'9') break; } if(!name[i]){ - if(ndots == 3 && ncols == 0){ - return inet_pton(AF_INET, name, sa)? AF_INET : 0; + if(ndots == 3 && ncols == 0 && nhex == 0){ + *SAFAMILY(sa)=AF_INET; + return inet_pton(AF_INET, name, SAADDR(sa))? AF_INET : 0; } if(ncols >= 2) { - return inet_pton(AF_INET6, name, sa)? AF_INET6 : 0; + *SAFAMILY(sa)=AF_INET6; + return inet_pton(AF_INET6, name, SAADDR(sa))? AF_INET6 : 0; } } if (getaddrinfo(name, NULL, NULL, &ai)) return 0; for(iter = ai; iter; iter = iter->ai_next){ if(!sa4 && iter->ai_addr->sa_family == AF_INET) sa4 = iter->ai_addr; - if(!sa6 && iter->ai_addr->sa_family == AF_INET) sa6 = iter->ai_addr; + if(!sa6 && iter->ai_addr->sa_family == AF_INET6) sa6 = iter->ai_addr; } if(sa6 && ((family == 6) || (family == 64) || (family == 46 && !sa4))){ - memcpy(sa, sa6, sizeof(struct sockaddr_in6)); + *SAFAMILY(sa)=AF_INET6; + memcpy(SAADDR(sa), SAADDR(sa6), SAADDRLEN(sa)); freeaddrinfo(ai); return AF_INET6; } else if(sa4 && family != 6){ - memcpy(sa, sa4, sizeof(struct sockaddr_in)); + *SAFAMILY(sa)=AF_INET; + memcpy(SAADDR(sa), SAADDR(sa4), SAADDRLEN(sa)); freeaddrinfo(ai); return AF_INET; } - else { - freeaddrinfo(ai); - return 0; - } + freeaddrinfo(ai); + return 0; #endif } diff --git a/src/datatypes.c b/src/datatypes.c index ce9c94c..a80196e 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -77,8 +77,10 @@ static void pr_sa(struct node *node, CBFUNC cbf, void*cb){ 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)); + buf[0] = '[' + buf[1] = 0; + inet_ntop(*SAFAMILY(node->value), node->value, buf+1, sizeof(buf)-10); + sprintf(buf + strlen(buf), "]:hu", (unsigned short)*SAPORT(node->value)); if(node->value)(*cbf)(cb, buf, strlen(buf)); #endif } @@ -574,10 +576,6 @@ static void * ef_server_extip(struct node * node){ return &((struct srvparam *)node->value) -> extip; } -static void * ef_server_intport(struct node * node){ - return &((struct srvparam *)node->value) -> intport; -} - static void * ef_server_extport(struct node * node){ return &((struct srvparam *)node->value) -> extport; } @@ -776,19 +774,18 @@ static struct property prop_server[] = { {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, "intport", ef_server_intport, TYPE_PORT, "port to listen"}, - {prop_server + 8, "extport", ef_server_extport, TYPE_PORT, "port to use for outgoing connection"}, - {prop_server + 9, "auth", ef_server_auth, TYPE_STRING, "service authentication type"}, - {prop_server + 10, "acl", ef_server_acl, TYPE_ACE, "access control list"}, - {prop_server + 11, "singlepacket", ef_server_singlepacket, TYPE_INTEGER, "is single packet redirection"}, - {prop_server + 12, "usentlm", ef_server_usentlm, TYPE_INTEGER, "allow NTLM authentication"}, - {prop_server + 13, "log", ef_server_log, TYPE_STRING, "type of logging"}, - {prop_server + 14, "logtarget", ef_server_logtarget, TYPE_STRING, "log target options"}, - {prop_server + 15, "logformat", ef_server_logformat, TYPE_STRING, "logging format string"}, - {prop_server + 16, "nonprintable", ef_server_nonprintable, TYPE_STRING, "non printable characters"}, - {prop_server + 17, "replacement", ef_server_replacement, TYPE_CHAR, "replacement character"}, - {prop_server + 18, "childcount", ef_server_childcount, TYPE_INTEGER, "number of servers connected"}, - {prop_server + 19, "child", ef_server_child, TYPE_CLIENT, "connected clients"}, + {prop_server + 7, "extport", ef_server_extport, TYPE_PORT, "port to use for outgoing connection"}, + {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"}, + {prop_server + 11, "usentlm", ef_server_usentlm, TYPE_INTEGER, "allow NTLM authentication"}, + {prop_server + 12, "log", ef_server_log, TYPE_STRING, "type of logging"}, + {prop_server + 13, "logtarget", ef_server_logtarget, TYPE_STRING, "log target options"}, + {prop_server + 14, "logformat", ef_server_logformat, TYPE_STRING, "logging format string"}, + {prop_server + 15, "nonprintable", ef_server_nonprintable, TYPE_STRING, "non printable characters"}, + {prop_server + 16, "replacement", ef_server_replacement, TYPE_CHAR, "replacement character"}, + {prop_server + 17, "childcount", ef_server_childcount, TYPE_INTEGER, "number of servers connected"}, + {prop_server + 18, "child", ef_server_child, TYPE_CLIENT, "connected clients"}, {NULL, "next", ef_server_next, TYPE_SERVER, "next"} }; diff --git a/src/dnspr.c b/src/dnspr.c index f9ef868..65faaf6 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(param->srv->intsa.ss_family == AF_INET && ip == ((struct sockaddr_in *)¶m->srv->intsa)->sin_addr.s_addr){ + if(*SAFAMILY(¶m->srv->intsa) == AF_INET && ip == *(unsigned long*)SAADDR(¶m->srv->intsa)){ buf[2] = 0x85; buf[3] = 0x80; buf[6] = 0; diff --git a/src/proxy.c b/src/proxy.c index cd6824c..c1fe343 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -545,8 +545,8 @@ for(;;){ #endif if((res = (*param->srv->authfunc)(param))) {RETURN(res);} - 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)) { + if (*SAFAMILY(¶m->srv->intsa) == AF_INET && + (param->sins.sin_addr.s_addr == ((struct sockaddr_in *)¶m->srv->intsa)->sin_addr.s_addr && param->sins.sin_port == *SAPORT(¶m->srv->intsa))) { RETURN(519); } sasize = sizeof(struct sockaddr_in); @@ -830,7 +830,7 @@ for(;;){ if(anonymous!=1){ sprintf((char*)buf+strlen((char *)buf), "Via: 1.1 "); gethostname((char *)(buf+strlen((char *)buf)), 256); - sprintf((char*)buf+strlen((char *)buf), ":%d (%s %s)\r\nX-Forwarded-For: ", (int)ntohs(param->srv->intport), conf.stringtable?conf.stringtable[2]:(unsigned char *)"", conf.stringtable?conf.stringtable[3]:(unsigned char *)""); + sprintf((char*)buf+strlen((char *)buf), ":%d (%s %s)\r\nX-Forwarded-For: ", (int)ntohs(*SAPORT(¶m->srv->intsa)), conf.stringtable?conf.stringtable[2]:(unsigned char *)"", conf.stringtable?conf.stringtable[3]:(unsigned char *)""); if(!anonymous)myinet_ntoa(param->sinc.sin_addr, (char *)buf + strlen((char *)buf)); else { unsigned long tmp; diff --git a/src/proxy.h b/src/proxy.h index 2fd1c22..829ace8 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -188,11 +188,7 @@ int myinet_ntoa(struct in_addr in, char * buf); extern unsigned long nservers[MAXNSERVERS]; extern unsigned long authnserver; unsigned long getip(unsigned char *name); -#ifdef NOIPV6 -unsigned long getip46(int family, unsigned char *name, struct sockaddr_in *sa); -#else -unsigned long getip46(int family, unsigned char *name, struct sockaddr_storage *sa); -#endif +unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa); unsigned long myresolver(unsigned char *); unsigned long fakeresolver (unsigned char *name); int initdnshashtable(unsigned nhashsize); diff --git a/src/proxymain.c b/src/proxymain.c index a158afa..a2df6a6 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -173,13 +173,13 @@ int MODULEMAINFUNC (int argc, char** argv){ } break; case 'i': - getip46(46, argv[i]+2, &srv.intsa); + getip46(46, argv[i]+2, (struct sockaddr *)&srv.intsa); break; case 'e': srv.extip = getip((unsigned char *)argv[i]+2); break; case 'p': - srv.intport = htons(atoi(argv[i]+2)); + *SAPORT(&srv.intsa) = htons(atoi(argv[i]+2)); break; case 'b': srv.bufsize = atoi(argv[i]+2); @@ -259,7 +259,7 @@ int MODULEMAINFUNC (int argc, char** argv){ else { #endif #ifndef NOPORTMAP - if (error || argc != i+3 || *argv[i]=='-'|| (srv.intport = htons((unsigned short)atoi(argv[i])))==0 || (srv.targetport = htons((unsigned short)atoi(argv[i+2])))==0) { + if (error || argc != i+3 || *argv[i]=='-'|| (*SAPORT(&srv.intsa) = htons((unsigned short)atoi(argv[i])))==0 || (srv.targetport = htons((unsigned short)atoi(argv[i+2])))==0) { #ifndef STDMAIN haveerror = 1; conf.threadinit = 0; @@ -311,7 +311,7 @@ int MODULEMAINFUNC (int argc, char** argv){ srvinit2(&srv, &defparam); - if(!srv.intport) srv.intport = htons(childdef.port); + if(!*SAPORT(&srv.intsa)) *SAPORT(&srv.intsa) = htons(childdef.port); if(!defparam.sinc.sin_port) defparam.sinc.sin_port = htons(childdef.port); if(hostname)parsehostname(hostname, &defparam, childdef.port); @@ -329,7 +329,7 @@ int MODULEMAINFUNC (int argc, char** argv){ if(!isudp){ lg.l_onoff = 1; lg.l_linger = conf.timeouts[STRING_L]; - sock=so._socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + sock=so._socket(SASOCK(&srv.intsa), SOCK_STREAM, IPPROTO_TCP); } else { sock=so._socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); @@ -350,8 +350,8 @@ int MODULEMAINFUNC (int argc, char** argv){ #endif } - size = sizeof(defparam.sinc); - for(sleeptime = SLEEPTIME * 100; so._bind(sock, (struct sockaddr*)&defparam.sinc, size)==-1; usleep(sleeptime)) { + size = sizeof(srv.intsa); + for(sleeptime = SLEEPTIME * 100; so._bind(sock, (struct sockaddr*)&srv.intsa, size)==-1; usleep(sleeptime)) { sprintf((char *)buf, "bind(): %s", strerror(errno)); if(!srv.silent)(*srv.logfunc)(&defparam, buf); sleeptime = (sleeptime<<1); @@ -374,8 +374,10 @@ int MODULEMAINFUNC (int argc, char** argv){ sprintf((char *)buf, "Accepting connections [%u/%u]", (unsigned)getpid(), (unsigned)pthread_self()); (*srv.logfunc)(&defparam, buf); } - defparam.sinc.sin_addr.s_addr = defparam.sins.sin_addr.s_addr = 0; - defparam.sinc.sin_port = defparam.sins.sin_port = 0; + memset(&defparam.sinc, 0, sizeof(defparam.sinc)); + memset(&defparam.sins, 0, sizeof(defparam.sins)); + *SAFAMILY(&defparam.sinc) = AF_INET; + *SAFAMILY(&defparam.sins) = AF_INET; srv.fds.fd = sock; srv.fds.events = POLLIN; @@ -519,7 +521,7 @@ void srvinit(struct srvparam * srv, struct clientparam *param){ param->remsock = param->clisock = param->ctrlsock = param->ctrlsocksrv = INVALID_SOCKET; param->req.sin_family = param->sins.sin_family = param->sinc.sin_family = AF_INET; pthread_mutex_init(&srv->counter_mutex, NULL); - + memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa)); } void srvinit2(struct srvparam * srv, struct clientparam *param){ @@ -535,9 +537,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(!srv->intsa.ss_family) memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa)); + if(!*SAFAMILY(&srv->intsa)) *SAFAMILY(&srv->intsa) = AF_INET; param->sinc.sin_addr.s_addr = ((struct sockaddr_in *)&srv->intsa)->sin_addr.s_addr; - param->sinc.sin_port = srv->intport; + param->sinc.sin_port = *SAPORT(&srv->intsa); 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); @@ -844,9 +846,9 @@ void freeconf(struct extparam *confp){ confp->authfunc = ipauth; confp->bandlimfunc = NULL; memset(&confp->intsa, 0, sizeof(confp->intsa)); - confp->intsa.ss_family = AF_INET; + *SAFAMILY(&confp->intsa) = AF_INET; confp->extip = 0; - confp->intport = confp->extport = 0; + *SAPORT(&confp->intsa) = confp->extport = 0; confp->singlepacket = 0; confp->maxchild = 100; resolvfunc = NULL; diff --git a/src/structures.h b/src/structures.h index 6cabb6d..9d91ece 100644 --- a/src/structures.h +++ b/src/structures.h @@ -101,6 +101,21 @@ int #define IM_MSN 0x00400000 #define ADMIN 0x01000000 + +#define SAFAMILY(sa) (&(((struct sockaddr_in *)sa)->sin_family)) + +#ifndef NOIPV6 +#define SAPORT(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? &((struct sockaddr_in6 *)sa)->sin6_port : &((struct sockaddr_in *)sa)->sin_port) +#define SAADDR(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr) +#define SAADDRLEN(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4) +#define SASOCK(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? PF_INET6:PF_INET) +#else +#define SAPORT(sa) (&((struct sockaddr_in *)sa)->sin_port) +#define SAADDR(sa) ((unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.a_addr) +#define SAADDRLEN(sa) (4) +#define SASOCK(sa) (PF_INET) +#endif + typedef enum { CLIENT, SERVER @@ -333,7 +348,11 @@ struct srvparam { int nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv; unsigned bufsize; unsigned logdumpsrv, logdumpcli; - struct sockaddr_storage intsa; +#ifndef NOIPV6 + struct sockaddr_in6 intsa; +#else + struct sockaddr_in intsa +#endif unsigned long extip; pthread_mutex_t counter_mutex; struct pollfd fds; @@ -347,7 +366,6 @@ struct srvparam { unsigned char * logformat; unsigned char * logtarget; unsigned char * nonprintable; - unsigned short intport; unsigned short extport; unsigned short targetport; unsigned char replace; @@ -454,9 +472,13 @@ struct extparam { unsigned char *logname, **archiver; ROTATION logtype, countertype; char * counterfile; - struct sockaddr_storage intsa; +#ifndef NOIPV6 + struct sockaddr_in6 intsa; +#else + struct sockaddr_in intsa +#endif unsigned long extip; - unsigned short intport, extport; + unsigned short extport; struct passwords *pwl; struct auth * authenticate; AUTHFUNC authfunc;