mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-23 02:25:40 +08:00
intport removed, SA macro added
This commit is contained in:
parent
bc7ca3af09
commit
7897b009a1
1
.gitignore
vendored
1
.gitignore
vendored
@ -27,6 +27,7 @@ doc/html/index.html
|
||||
verfile.sh
|
||||
Makefile
|
||||
Changelog
|
||||
res
|
||||
copytgz.sh
|
||||
*~.nib
|
||||
local.properties
|
||||
|
54
src/common.c
54
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
|
||||
}
|
||||
|
@ -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"}
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user