intport removed, SA macro added

This commit is contained in:
Vladimir Dubrovin 2014-05-11 01:39:02 +04:00
parent bc7ca3af09
commit 7897b009a1
8 changed files with 94 additions and 70 deletions

1
.gitignore vendored
View File

@ -27,6 +27,7 @@ doc/html/index.html
verfile.sh
Makefile
Changelog
res
copytgz.sh
*~.nib
local.properties

View File

@ -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(&param->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
}

View File

@ -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"}
};

View File

@ -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 *)&param->srv->intsa)->sin_addr.s_addr){
if(*SAFAMILY(&param->srv->intsa) == AF_INET && ip == *(unsigned long*)SAADDR(&param->srv->intsa)){
buf[2] = 0x85;
buf[3] = 0x80;
buf[6] = 0;

View File

@ -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 *)&param->srv->intsa)->sin_addr.s_addr && param->sins.sin_port == param->srv->intport)) {
if (*SAFAMILY(&param->srv->intsa) == AF_INET &&
(param->sins.sin_addr.s_addr == ((struct sockaddr_in *)&param->srv->intsa)->sin_addr.s_addr && param->sins.sin_port == *SAPORT(&param->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(&param->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;

View File

@ -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);

View File

@ -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;

View File

@ -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;