From 375e3a74d0a06b8717115c77caae99ec865aaa8f Mon Sep 17 00:00:00 2001
From: Vladimir Dubrovin <3proxy@3proxy.ru>
Date: Sun, 18 Feb 2024 19:41:45 +0300
Subject: [PATCH] call local socket function
---
src/auth.c | 4 +--
src/common.c | 28 +++++++++---------
src/dnspr.c | 14 ++++-----
src/ftp.c | 12 ++++----
src/ftppr.c | 66 ++++++++++++++++++++---------------------
src/proxy.c | 24 +++++++--------
src/proxy.h | 2 +-
src/proxymain.c | 78 ++++++++++++++++++++++++-------------------------
src/sockmap.c | 12 ++++----
src/socks.c | 34 ++++++++++-----------
src/udppm.c | 12 ++++----
11 files changed, 143 insertions(+), 143 deletions(-)
diff --git a/src/auth.c b/src/auth.c
index 6b2fd48..72fbe76 100644
--- a/src/auth.c
+++ b/src/auth.c
@@ -739,7 +739,7 @@ int checkACL(struct clientparam * param){
dup = *acentry;
res = handleredirect(param, &dup);
if(!res) break;
- if(param->remsock != INVALID_SOCKET) so._closesocket(param->sostate, param->remsock);
+ if(param->remsock != INVALID_SOCKET) param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = INVALID_SOCKET;
}
return res;
@@ -1245,7 +1245,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
*sinsr = nservers[i].addr;
}
if(usetcp){
- if(connectwithpoll(so.state, sock,(struct sockaddr *)sinsr,SASIZE(sinsr),CONNECT_TO)) {
+ if(connectwithpoll(NULL, sock,(struct sockaddr *)sinsr,SASIZE(sinsr),CONNECT_TO)) {
so._shutdown(so.state, sock, SHUT_RDWR);
so._closesocket(so.state, sock);
break;
diff --git a/src/common.c b/src/common.c
index 0c1dd31..ec25eb6 100644
--- a/src/common.c
+++ b/src/common.c
@@ -473,7 +473,7 @@ int parseconnusername(char *username, struct clientparam *param, int extpasswd,
}
-int connectwithpoll(void *state, SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to){
+int connectwithpoll(struct clientparam *param, SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to){
struct pollfd fds[1];
#ifdef _WIN32
unsigned long ul = 1;
@@ -481,14 +481,14 @@ int connectwithpoll(void *state, SOCKET sock, struct sockaddr *sa, SASIZETYPE si
#else
fcntl(sock,F_SETFL, O_NONBLOCK | fcntl(sock,F_GETFL));
#endif
- if(so._connect(state, sock,sa,size)) {
+ if(param?param->srv->so._connect(param->sostate, sock,sa,size) : so._connect(so.state, sock,sa,size)) {
if(errno != EAGAIN && errno != EINPROGRESS) return (13);
}
if(!errno) return 0;
memset(fds, 0, sizeof(fds));
fds[0].fd = sock;
fds[0].events = POLLOUT|POLLIN;
- if(so._poll(state, fds, 1, to*1000) <= 0 || !(fds[0].revents & POLLOUT)) {
+ if((param?param->srv->so._poll(param->sostate, fds, 1, to*1000):so._poll(so.state, fds, 1, to*1000)) <= 0 || !(fds[0].revents & POLLOUT)) {
return (13);
}
return 0;
@@ -506,7 +506,7 @@ int doconnect(struct clientparam * param){
return 0;
if (param->remsock != INVALID_SOCKET){
size = sizeof(param->sinsr);
- if(so._getpeername(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsr, &size)==-1) {return (14);}
+ if(param->srv->so._getpeername(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsr, &size)==-1) {return (14);}
}
else {
struct linger lg = {1,conf.timeouts[SINGLEBYTE_S]};
@@ -519,7 +519,7 @@ int doconnect(struct clientparam * param){
memcpy(SAADDR(¶m->sinsr), SAADDR(¶m->req), SAADDRLEN(¶m->req));
}
if(!*SAPORT(¶m->sinsr))*SAPORT(¶m->sinsr) = *SAPORT(¶m->req);
- if ((param->remsock=so._socket(param->sostate, SASOCK(¶m->sinsr), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);}
+ if ((param->remsock=param->srv->so._socket(param->sostate, SASOCK(¶m->sinsr), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);}
if(SAISNULL(¶m->sinsl)){
#ifndef NOIPV6
if(*SAFAMILY(¶m->sinsr) == AF_INET6) param->sinsl = param->srv->extsa6;
@@ -530,48 +530,48 @@ int doconnect(struct clientparam * param){
*SAPORT(¶m->sinsl) = 0;
setopts(param->remsock, param->srv->srvsockopts);
- so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
+ param->srv->so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
#ifdef REUSE
{
int opt;
#ifdef SO_REUSEADDR
opt = 1;
- so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
+ param->srv->so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
#endif
#ifdef SO_REUSEPORT
opt = 1;
- so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
+ param->srv->so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
#endif
}
#endif
#if defined SO_BINDTODEVICE
if(param->srv->obindtodevice) {
- if(so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_BINDTODEVICE, param->srv->obindtodevice, strlen(param->srv->obindtodevice) + 1))
+ if(param->srv->so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_BINDTODEVICE, param->srv->obindtodevice, strlen(param->srv->obindtodevice) + 1))
return 12;
}
#elif defined IP_BOUND_IF
if(param->srv->obindtodevice) {
int idx;
idx = if_nametoindex(param->srv->obindtodevice);
- if(!idx || (*SAFAMILY(¶m->sinsl) == AF_INET && so._setsockopt(param->sostate, param->remsock, IPPROTO_IP, IP_BOUND_IF, &idx, sizeof(idx))))
+ if(!idx || (*SAFAMILY(¶m->sinsl) == AF_INET && param->srv->so._setsockopt(param->sostate, param->remsock, IPPROTO_IP, IP_BOUND_IF, &idx, sizeof(idx))))
return 12;
#ifndef NOIPV6
- if(*SAFAMILY(¶m->sinsl) == AF_INET6 && so._setsockopt(param->sostate, param->remsock, IPPROTO_IPV6, IPV6_BOUND_IF, &idx, sizeof(idx))) return 12;
+ if(*SAFAMILY(¶m->sinsl) == AF_INET6 && param->srv->so._setsockopt(param->sostate, param->remsock, IPPROTO_IPV6, IPV6_BOUND_IF, &idx, sizeof(idx))) return 12;
#endif
}
#endif
- if(so._bind(param->sostate, param->remsock, (struct sockaddr*)¶m->sinsl, SASIZE(¶m->sinsl))==-1) {
+ if(param->srv->so._bind(param->sostate, param->remsock, (struct sockaddr*)¶m->sinsl, SASIZE(¶m->sinsl))==-1) {
return 12;
}
if(param->operation >= 256 || (param->operation & CONNECT)){
- if(connectwithpoll(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr),CONNECT_TO)) {
+ if(connectwithpoll(param, param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr),CONNECT_TO)) {
return 13;
}
}
size = sizeof(param->sinsl);
- if(so._getsockname(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsl, &size)==-1) {return (15);}
+ if(param->srv->so._getsockname(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsl, &size)==-1) {return (15);}
}
return 0;
}
diff --git a/src/dnspr.c b/src/dnspr.c
index bf5e71a..5231eda 100644
--- a/src/dnspr.c
+++ b/src/dnspr.c
@@ -39,16 +39,16 @@ void * dnsprchild(struct clientparam* param) {
}
buf = bbuf+2;
size = sizeof(param->sincr);
- i = so._recvfrom(param->sostate, param->srv->srvsock, (char *)buf, BUFSIZE, 0, (struct sockaddr *)¶m->sincr, &size);
+ i = param->srv->so._recvfrom(param->sostate, param->srv->srvsock, (char *)buf, BUFSIZE, 0, (struct sockaddr *)¶m->sincr, &size);
size = sizeof(param->sinsl);
getsockname(param->srv->srvsock, (struct sockaddr *)¶m->sincl, &size);
#ifdef _WIN32
- if((param->clisock=so._socket(param->sostate, AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
+ if((param->clisock=param->srv->so._socket(param->sostate, AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
RETURN(818);
}
ioctlsocket(param->clisock, FIONBIO, &ul);
- if(so._setsockopt(param->sostate, param->clisock, SOL_SOCKET, SO_REUSEADDR, (char *)&ul, sizeof(int))) {RETURN(820);};
- if(so._bind(param->sostate, param->clisock,(struct sockaddr *)¶m->sincl,SASIZE(¶m->sincl))) {
+ if(param->srv->so._setsockopt(param->sostate, param->clisock, SOL_SOCKET, SO_REUSEADDR, (char *)&ul, sizeof(int))) {RETURN(820);};
+ if(param->srv->so._bind(param->sostate, param->clisock,(struct sockaddr *)¶m->sincl,SASIZE(¶m->sincl))) {
RETURN(822);
}
@@ -130,17 +130,17 @@ void * dnsprchild(struct clientparam* param) {
else ip = 0;
}
if(!ip && numservers){
- if((param->remsock=so._socket(param->sostate, SASOCK(&nservers[0].addr), nservers[0].usetcp? SOCK_STREAM:SOCK_DGRAM, nservers[0].usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {
+ if((param->remsock=param->srv->so._socket(param->sostate, SASOCK(&nservers[0].addr), nservers[0].usetcp? SOCK_STREAM:SOCK_DGRAM, nservers[0].usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {
RETURN(818);
}
memset(¶m->sinsl, 0, sizeof(param->sinsl));
*SAFAMILY(¶m->sinsl) = *SAFAMILY(&nservers[0].addr);
- if(so._bind(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {
+ if(param->srv->so._bind(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {
RETURN(819);
}
param->sinsr = nservers[0].addr;
if(nservers[0].usetcp) {
- if(connectwithpoll(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr),CONNECT_TO)) RETURN(830);
+ if(connectwithpoll(param, param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr),CONNECT_TO)) RETURN(830);
buf-=2;
*(unsigned short*)buf = htons(i);
i+=2;
diff --git a/src/ftp.c b/src/ftp.c
index 38b9760..703d78c 100644
--- a/src/ftp.c
+++ b/src/ftp.c
@@ -189,9 +189,9 @@ SOCKET ftpdata(struct clientparam *param){
if(!(sb = strchr(buf+4, '(')) || !(se= strchr(sb, ')'))) return INVALID_SOCKET;
if(sscanf(sb+1, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) return INVALID_SOCKET;
sasize = sizeof(param->sinsl);
- if(so._getsockname(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsl, &sasize)){return INVALID_SOCKET;}
+ if(param->srv->so._getsockname(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsl, &sasize)){return INVALID_SOCKET;}
sasize = sizeof(param->sinsr);
- if(so._getpeername(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsr, &sasize)){return INVALID_SOCKET;}
+ if(param->srv->so._getpeername(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsr, &sasize)){return INVALID_SOCKET;}
rem = param->remsock;
param->remsock = INVALID_SOCKET;
param->req = param->sinsr;
@@ -201,7 +201,7 @@ SOCKET ftpdata(struct clientparam *param){
param->operation = FTP_DATA;
if((param->res = (*param->srv->authfunc)(param))) {
if(param->remsock != INVALID_SOCKET) {
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = INVALID_SOCKET;
}
memset(¶m->sinsl, 0, sizeof(param->sinsl));
@@ -228,7 +228,7 @@ SOCKET ftpcommand(struct clientparam *param, unsigned char * command, unsigned c
(unsigned char *)" ":(unsigned char *)"",
arg?arg:(unsigned char *)"");
if((int)socksend(param, param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
- so._closesocket(param->sostate, s);
+ param->srv->so._closesocket(param->sostate, s);
return INVALID_SOCKET;
}
param->statscli64 += (int)strlen(buf);
@@ -236,11 +236,11 @@ SOCKET ftpcommand(struct clientparam *param, unsigned char * command, unsigned c
while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
}
if(i < 3) {
- so._closesocket(param->sostate, s);
+ param->srv->so._closesocket(param->sostate, s);
return INVALID_SOCKET;
}
if(buf[0] != '1') {
- so._closesocket(param->sostate, s);
+ param->srv->so._closesocket(param->sostate, s);
return INVALID_SOCKET;
}
return s;
diff --git a/src/ftppr.c b/src/ftppr.c
index c2d438e..aedd7f7 100644
--- a/src/ftppr.c
+++ b/src/ftppr.c
@@ -44,8 +44,8 @@ void * ftpprchild(struct clientparam* param) {
if (!strncasecmp((char *)buf, "OPEN ", 5)){
if(parsehostname((char *)buf+5, param, 21)){RETURN(803);}
if(param->remsock != INVALID_SOCKET) {
- so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = INVALID_SOCKET;
}
if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
@@ -105,27 +105,27 @@ void * ftpprchild(struct clientparam* param) {
}
#endif
if(sc != INVALID_SOCKET) {
- so._shutdown(param->sostate, sc, SHUT_RDWR);
- so._closesocket(param->sostate, sc);
+ param->srv->so._shutdown(param->sostate, sc, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, sc);
sc = INVALID_SOCKET;
}
if(ss != INVALID_SOCKET) {
- so._shutdown(param->sostate, ss, SHUT_RDWR);
- so._closesocket(param->sostate, ss);
+ param->srv->so._shutdown(param->sostate, ss, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, ss);
ss = INVALID_SOCKET;
}
if(clidatasock != INVALID_SOCKET) {
- so._shutdown(param->sostate, clidatasock, SHUT_RDWR);
- so._closesocket(param->sostate, clidatasock);
+ param->srv->so._shutdown(param->sostate, clidatasock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, clidatasock);
clidatasock = INVALID_SOCKET;
}
if ((clidatasock=socket(SASOCK(¶m->sincl), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {RETURN(821);}
*SAPORT(¶m->sincl) = 0;
- if(so._bind(param->sostate, clidatasock, (struct sockaddr *)¶m->sincl, SASIZE(¶m->sincl))){RETURN(822);}
+ if(param->srv->so._bind(param->sostate, clidatasock, (struct sockaddr *)¶m->sincl, SASIZE(¶m->sincl))){RETURN(822);}
if (pasv) {
- if(so._listen(param->sostate, clidatasock, 1)) {RETURN(823);}
+ if(param->srv->so._listen(param->sostate, clidatasock, 1)) {RETURN(823);}
sasize = sizeof(param->sincl);
- if(so._getsockname(param->sostate, clidatasock, (struct sockaddr *)¶m->sincl, &sasize)){RETURN(824);}
+ if(param->srv->so._getsockname(param->sostate, clidatasock, (struct sockaddr *)¶m->sincl, &sasize)){RETURN(824);}
if(pasv == 1){
if(*SAFAMILY(¶m->sincl) == AF_INET)
sprintf((char *)buf, "227 OK (%u,%u,%u,%u,%u,%u)\r\n",
@@ -153,8 +153,8 @@ void * ftpprchild(struct clientparam* param) {
if(sscanf((char *)buf+5, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) {RETURN(828);}
*SAPORT(¶m->sincr) = htons((unsigned short)((b5<<8)^b6));
- if(connectwithpoll(param->sostate, clidatasock, (struct sockaddr *)¶m->sincr, SASIZE(¶m->sincr),CONNECT_TO)) {
- so._closesocket(param->sostate, clidatasock);
+ if(connectwithpoll(param, clidatasock, (struct sockaddr *)¶m->sincr, SASIZE(¶m->sincr),CONNECT_TO)) {
+ param->srv->so._closesocket(param->sostate, clidatasock);
clidatasock = INVALID_SOCKET;
RETURN(826);
}
@@ -208,15 +208,15 @@ void * ftpprchild(struct clientparam* param) {
fds.fd = clidatasock;
fds.events = POLLIN;
- res = so._poll (param->sostate, &fds, 1, conf.timeouts[STRING_L]*1000);
+ res = param->srv->so._poll (param->sostate, &fds, 1, conf.timeouts[STRING_L]*1000);
if(res != 1) {
RETURN(857);
}
sasize = sizeof(param->sincr);
- ss = so._accept(param->sostate, clidatasock, (struct sockaddr *)¶m->sincr, &sasize);
+ ss = param->srv->so._accept(param->sostate, clidatasock, (struct sockaddr *)¶m->sincr, &sasize);
if (ss == INVALID_SOCKET) { RETURN (858);}
- so._shutdown(param->sostate, clidatasock, SHUT_RDWR);
- so._closesocket(param->sostate, clidatasock);
+ param->srv->so._shutdown(param->sostate, clidatasock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, clidatasock);
clidatasock = ss;
ss = INVALID_SOCKET;
}
@@ -226,8 +226,8 @@ void * ftpprchild(struct clientparam* param) {
status = 3;
ss = ftpcommand(param, buf, arg? buf+5 : NULL);
if (ss == INVALID_SOCKET) {
- so._shutdown(param->sostate, clidatasock, SHUT_RDWR);
- so._closesocket(param->sostate, clidatasock);
+ param->srv->so._shutdown(param->sostate, clidatasock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, clidatasock);
clidatasock = INVALID_SOCKET;
if(socksend(param, param->ctrlsock, (unsigned char *)"550 err\r\n", 9, conf.timeouts[STRING_S])!=9) {RETURN (831);}
@@ -247,17 +247,17 @@ void * ftpprchild(struct clientparam* param) {
}
sc = param->remsock;
param->remsock = ss;
- so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
- so._setsockopt(param->sostate, clidatasock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
+ param->srv->so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
+ param->srv->so._setsockopt(param->sostate, clidatasock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
param->clisock = clidatasock;
res = mapsocket(param, conf.timeouts[CONNECTION_S]);
if(param->remsock != INVALID_SOCKET) {
- so._shutdown (param->sostate, param->remsock, SHUT_RDWR);
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._shutdown (param->sostate, param->remsock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->remsock);
}
if(param->clisock != INVALID_SOCKET) {
- so._shutdown (param->sostate, param->clisock, SHUT_RDWR);
- so._closesocket(param->sostate, param->clisock);
+ param->srv->so._shutdown (param->sostate, param->clisock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->clisock);
}
param->clisock = param->ctrlsock;
param->remsock = sc;
@@ -293,7 +293,7 @@ void * ftpprchild(struct clientparam* param) {
if(i < 3) {RETURN (813);}
}
sasize = sizeof(param->sincr);
- if(so._getpeername(param->sostate, param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize)){RETURN(819);}
+ if(param->srv->so._getpeername(param->sostate, param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize)){RETURN(819);}
if(req && (param->statscli64 || param->statssrv64)){
dolog(param, (unsigned char *)req);
}
@@ -302,19 +302,19 @@ void * ftpprchild(struct clientparam* param) {
CLEANRET:
if(sc != INVALID_SOCKET) {
- so._shutdown(param->sostate, sc, SHUT_RDWR);
- so._closesocket(param->sostate, sc);
+ param->srv->so._shutdown(param->sostate, sc, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, sc);
}
if(ss != INVALID_SOCKET) {
- so._shutdown(param->sostate, ss, SHUT_RDWR);
- so._closesocket(param->sostate, ss);
+ param->srv->so._shutdown(param->sostate, ss, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, ss);
}
if(clidatasock != INVALID_SOCKET) {
- so._shutdown(param->sostate, clidatasock, SHUT_RDWR);
- so._closesocket(param->sostate, clidatasock);
+ param->srv->so._shutdown(param->sostate, clidatasock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, clidatasock);
}
sasize = sizeof(param->sincr);
- so._getpeername(param->sostate, param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize);
+ param->srv->so._getpeername(param->sostate, param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize);
if(param->res != 0 || param->statscli64 || param->statssrv64 ){
dolog(param, (unsigned char *)((req && (param->res > 802))? req:NULL));
}
diff --git a/src/proxy.c b/src/proxy.c
index 00b549b..516828b 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -253,15 +253,15 @@ for(;;){
fds[0].events = POLLIN;
fds[1].fd = param->remsock;
fds[1].events = POLLIN;
- res = so._poll(param->sostate, fds, 2, conf.timeouts[STRING_S]*1000);
+ res = param->srv->so._poll(param->sostate, fds, 2, conf.timeouts[STRING_S]*1000);
if(res<=0) {
RETURN(555);
}
if((fds[1].revents & (POLLIN|POLLHUP|POLLERR|POLLNVAL))) {
if(param->transparent || (!param->redirected && param->redirtype == R_HTTP)) RETURN(555);
ckeepalive = 0;
- so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = INVALID_SOCKET;
param->redirected = 0;
param->redirtype = 0;
@@ -282,8 +282,8 @@ for(;;){
if(!param->transparent && !param->srv->transparent && (i<=prefix || strncasecmp((char *)buf, (char *)req, prefix))){
ckeepalive = 0;
if(param->remsock != INVALID_SOCKET){
- so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->remsock);
}
param->remsock = INVALID_SOCKET;
param->redirected = 0;
@@ -530,7 +530,7 @@ for(;;){
if(param->srv->needuser > 1 && !param->username) {RETURN(4);}
if((res = (*param->srv->authfunc)(param))) {
if (res <= 10 || haveconnection || param->transparent) RETURN(res);
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = INVALID_SOCKET;
param->redirected = 0;
param->redirtype = 0;
@@ -650,7 +650,7 @@ for(;;){
if((param->operation == FTP_PUT) && (contentlength64 > 0)) param->waitclient64 = contentlength64;
res = mapsocket(param, conf.timeouts[CONNECTION_L]);
if (res == 99) res = 0;
- so._closesocket(param->sostate, ftps);
+ param->srv->so._closesocket(param->sostate, ftps);
ftps = INVALID_SOCKET;
param->remsock = s;
}
@@ -806,7 +806,7 @@ for(;;){
}
memcpy(buf+inbuf, "
", 4);
inbuf += 4;
- so._closesocket(param->sostate, ftps);
+ param->srv->so._closesocket(param->sostate, ftps);
ftps = INVALID_SOCKET;
param->remsock = s;
if(inbuf){
@@ -854,7 +854,7 @@ for(;;){
else {
#ifdef TCP_CORK
int opt = 1;
- so._setsockopt(param->sostate, param->remsock, IPPROTO_TCP, TCP_CORK, (unsigned char *)&opt, sizeof(int));
+ param->srv->so._setsockopt(param->sostate, param->remsock, IPPROTO_TCP, TCP_CORK, (unsigned char *)&opt, sizeof(int));
#endif
redirect = 1;
res = (int)strlen((char *)req);
@@ -906,7 +906,7 @@ for(;;){
#ifdef TCP_CORK
{
int opt = 0;
- so._setsockopt(param->sostate, param->remsock, IPPROTO_TCP, TCP_CORK, (unsigned char *)&opt, sizeof(int));
+ param->srv->so._setsockopt(param->sostate, param->remsock, IPPROTO_TCP, TCP_CORK, (unsigned char *)&opt, sizeof(int));
}
#endif
param->statscli64 += res;
@@ -1107,8 +1107,8 @@ for(;;){
REQUESTEND:
if((!ckeepalive || !keepalive) && param->remsock != INVALID_SOCKET){
- so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = INVALID_SOCKET;
RETURN(0);
}
diff --git a/src/proxy.h b/src/proxy.h
index f6c0ed6..fdcfab9 100644
--- a/src/proxy.h
+++ b/src/proxy.h
@@ -277,7 +277,7 @@ void srvinit2(struct srvparam * srv, struct clientparam *param);
void srvfree(struct srvparam * srv);
unsigned char * dologname (unsigned char *buf, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t);
int readconfig(FILE * fp);
-int connectwithpoll(void *state, SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to);
+int connectwithpoll(struct clientparam *param, SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to);
int myrand(void * entropy, int len);
diff --git a/src/proxymain.c b/src/proxymain.c
index 06df26d..c03da9a 100644
--- a/src/proxymain.c
+++ b/src/proxymain.c
@@ -22,12 +22,12 @@ void * threadfunc (void *p) {
fds.events = POLLIN;
fds.revents = 0;
for(i=5+(param->srv->maxchild>>10); i; i--){
- if(so._poll(param->sostate, &fds, 1, 1000*CONNBACK_TO)!=1){
+ if(param->srv->so._poll(param->sostate, &fds, 1, 1000*CONNBACK_TO)!=1){
dolog(param, (unsigned char *)"Connect back not received, check connback client");
i = 0;
break;
}
- param->remsock = so._accept(param->sostate, param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size);
+ param->remsock = param->srv->so._accept(param->sostate, param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size);
if(param->remsock == INVALID_SOCKET) {
dolog(param, (unsigned char *)"Connect back accept() failed");
continue;
@@ -45,14 +45,14 @@ void * threadfunc (void *p) {
if(param->srv->acl) param->res = checkACL(param);
if(param->res){
dolog(param, (unsigned char *)"Connect back ACL failed");
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = INVALID_SOCKET;
continue;
}
#endif
if(socksendto(param, param->remsock, (struct sockaddr*)¶m->sinsr, (unsigned char *)"C", 1, CONNBACK_TO*1000) != 1){
dolog(param, (unsigned char *)"Connect back sending command failed");
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = INVALID_SOCKET;
continue;
}
@@ -397,7 +397,7 @@ int MODULEMAINFUNC (int argc, char** argv){
#ifndef _WIN32
case 'I':
size = sizeof(defparam.sincl);
- if(so._getsockname(srv.so.state, 0, (struct sockaddr*)&defparam.sincl, &size) ||
+ if(srv.so._getsockname(srv.so.state, 0, (struct sockaddr*)&defparam.sincl, &size) ||
*SAFAMILY(&defparam.sincl) != AF_INET) error = 1;
else inetd = 1;
@@ -553,8 +553,8 @@ int MODULEMAINFUNC (int argc, char** argv){
if(!isudp){
lg.l_onoff = 1;
lg.l_linger = conf.timeouts[STRING_L];
- so._setsockopt(srv.so.state, 0, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg));
- so._setsockopt(srv.so.state, 0, SOL_SOCKET, SO_OOBINLINE, (unsigned char *)&opt, sizeof(int));
+ srv.so._setsockopt(srv.so.state, 0, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg));
+ srv.so._setsockopt(srv.so.state, 0, SOL_SOCKET, SO_OOBINLINE, (unsigned char *)&opt, sizeof(int));
}
defparam.clisock = 0;
if(! (newparam = myalloc (sizeof(defparam)))){
@@ -594,10 +594,10 @@ int MODULEMAINFUNC (int argc, char** argv){
if(srv.srvsock == INVALID_SOCKET){
if(!isudp){
- sock=so._socket(srv.so.state, SASOCK(&srv.intsa), SOCK_STREAM, IPPROTO_TCP);
+ sock=srv.so._socket(srv.so.state, SASOCK(&srv.intsa), SOCK_STREAM, IPPROTO_TCP);
}
else {
- sock=so._socket(srv.so.state, SASOCK(&srv.intsa), SOCK_DGRAM, IPPROTO_UDP);
+ sock=srv.so._socket(srv.so.state, SASOCK(&srv.intsa), SOCK_DGRAM, IPPROTO_UDP);
}
if( sock == INVALID_SOCKET) {
perror("socket()");
@@ -611,13 +611,13 @@ int MODULEMAINFUNC (int argc, char** argv){
#endif
srv.srvsock = sock;
opt = 1;
- if(so._setsockopt(srv.so.state, sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int)))perror("setsockopt()");
+ if(srv.so._setsockopt(srv.so.state, sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int)))perror("setsockopt()");
#ifdef SO_REUSEPORT
opt = 1;
- so._setsockopt(srv.so.state, sock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int));
+ srv.so._setsockopt(srv.so.state, sock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int));
#endif
#if defined SO_BINDTODEVICE
- if(srv.ibindtodevice && so._setsockopt(srv.so.state, sock, SOL_SOCKET, SO_BINDTODEVICE, srv.ibindtodevice, strlen(srv.ibindtodevice) + 1)) {
+ if(srv.ibindtodevice && srv.so._setsockopt(srv.so.state, sock, SOL_SOCKET, SO_BINDTODEVICE, srv.ibindtodevice, strlen(srv.ibindtodevice) + 1)) {
dolog(&defparam, "failed to bind device");
return -12;
}
@@ -630,7 +630,7 @@ int MODULEMAINFUNC (int argc, char** argv){
return -12;
}
#ifndef NOIPV6
- if((*SAFAMILY(&srv.intsa) == AF_INET6 && so._setsockopt(srv.so.state, sock, IPPROTO_IPV6, IPV6_BOUND_IF, &idx, sizeof(idx)))) {
+ if((*SAFAMILY(&srv.intsa) == AF_INET6 && srv.so._setsockopt(srv.so.state, sock, IPPROTO_IPV6, IPV6_BOUND_IF, &idx, sizeof(idx)))) {
dolog(&defparam, (unsigned char *)"failed to bind device");
return -12;
}
@@ -639,17 +639,17 @@ int MODULEMAINFUNC (int argc, char** argv){
#endif
}
size = sizeof(srv.intsa);
- for(sleeptime = SLEEPTIME * 100; so._bind(srv.so.state, sock, (struct sockaddr*)&srv.intsa, SASIZE(&srv.intsa))==-1; usleep(sleeptime)) {
+ for(sleeptime = SLEEPTIME * 100; srv.so._bind(srv.so.state, sock, (struct sockaddr*)&srv.intsa, SASIZE(&srv.intsa))==-1; usleep(sleeptime)) {
sprintf((char *)buf, "bind(): %s", strerror(errno));
if(!srv.silent)dolog(&defparam, buf);
sleeptime = (sleeptime<<1);
if(!sleeptime) {
- so._closesocket(srv.so.state, sock);
+ srv.so._closesocket(srv.so.state, sock);
return -3;
}
}
if(!isudp){
- if(so._listen (srv.so.state, sock, srv.backlog?srv.backlog : 1+(srv.maxchild>>3))==-1) {
+ if(srv.so._listen (srv.so.state, sock, srv.backlog?srv.backlog : 1+(srv.maxchild>>3))==-1) {
sprintf((char *)buf, "listen(): %s", strerror(errno));
if(!srv.silent)dolog(&defparam, buf);
return -4;
@@ -665,24 +665,24 @@ int MODULEMAINFUNC (int argc, char** argv){
}
if(iscbl){
parsehost(srv.family, cbl_string, (struct sockaddr *)&cbsa);
- if((srv.cbsock=so._socket(srv.so.state, SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) {
+ if((srv.cbsock=srv.so._socket(srv.so.state, SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) {
dolog(&defparam, (unsigned char *)"Failed to allocate connect back socket");
return -6;
}
opt = 1;
- so._setsockopt(srv.so.state, srv.cbsock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
+ srv.so._setsockopt(srv.so.state, srv.cbsock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
#ifdef SO_REUSEPORT
opt = 1;
- so._setsockopt(srv.so.state, srv.cbsock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int));
+ srv.so._setsockopt(srv.so.state, srv.cbsock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int));
#endif
setopts(srv.cbsock, srv.cbssockopts);
- if(so._bind(srv.so.state, srv.cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) {
+ if(srv.so._bind(srv.so.state, srv.cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) {
dolog(&defparam, (unsigned char *)"Failed to bind connect back socket");
return -7;
}
- if(so._listen(srv.so.state, srv.cbsock, 1 + (srv.maxchild>>4))==-1) {
+ if(srv.so._listen(srv.so.state, srv.cbsock, 1 + (srv.maxchild>>4))==-1) {
dolog(&defparam, (unsigned char *)"Failed to listen connect back socket");
return -8;
}
@@ -711,7 +711,7 @@ int MODULEMAINFUNC (int argc, char** argv){
if (iscbc) break;
if (conf.paused != srv.paused) break;
if (srv.fds.events & POLLIN) {
- error = so._poll(srv.so.state, &srv.fds, 1, 1000);
+ error = srv.so._poll(srv.so.state, &srv.fds, 1, 1000);
}
else {
usleep(SLEEPTIME);
@@ -730,20 +730,20 @@ int MODULEMAINFUNC (int argc, char** argv){
if(!isudp){
size = sizeof(defparam.sincr);
if(iscbc){
- new_sock=so._socket(srv.so.state, SASOCK(&defparam.sincr), SOCK_STREAM, IPPROTO_TCP);
+ new_sock=so._socket(so.state, SASOCK(&defparam.sincr), SOCK_STREAM, IPPROTO_TCP);
if(new_sock != INVALID_SOCKET){
setopts(new_sock, srv.cbcsockopts);
parsehost(srv.family, cbc_string, (struct sockaddr *)&defparam.sincr);
- if(connectwithpoll(srv.so.state, new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr),CONNBACK_TO)) {
- so._closesocket(srv.so.state, new_sock);
+ if(connectwithpoll(NULL, new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr),CONNBACK_TO)) {
+ so._closesocket(so.state, new_sock);
new_sock = INVALID_SOCKET;
usleep(SLEEPTIME);
continue;
}
if(sockrecvfrom(NULL, new_sock,(struct sockaddr*)&defparam.sincr,buf,1,60*1000) != 1 || *buf!='C') {
- so._closesocket(srv.so.state, new_sock);
+ so._closesocket(so.state, new_sock);
new_sock = INVALID_SOCKET;
usleep(SLEEPTIME);
continue;
@@ -755,7 +755,7 @@ int MODULEMAINFUNC (int argc, char** argv){
}
}
else {
- new_sock = so._accept(srv.so.state, sock, (struct sockaddr*)&defparam.sincr, &size);
+ new_sock = srv.so._accept(srv.so.state, sock, (struct sockaddr*)&defparam.sincr, &size);
if(new_sock == INVALID_SOCKET){
#ifdef _WIN32
switch(WSAGetLastError()){
@@ -803,7 +803,7 @@ int MODULEMAINFUNC (int argc, char** argv){
setopts(new_sock, srv.clisockopts);
}
size = sizeof(defparam.sincl);
- if(so._getsockname(srv.so.state, new_sock, (struct sockaddr *)&defparam.sincl, &size)){
+ if(srv.so._getsockname(srv.so.state, new_sock, (struct sockaddr *)&defparam.sincl, &size)){
sprintf((char *)buf, "getsockname(): %s", strerror(errno));
if(!srv.silent)dolog(&defparam, buf);
continue;
@@ -816,14 +816,14 @@ int MODULEMAINFUNC (int argc, char** argv){
lg.l_onoff = 1;
lg.l_linger = conf.timeouts[STRING_L];
- so._setsockopt(srv.so.state, new_sock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
- so._setsockopt(srv.so.state, new_sock, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int));
+ srv.so._setsockopt(srv.so.state, new_sock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
+ srv.so._setsockopt(srv.so.state, new_sock, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int));
}
else {
srv.fds.events = 0;
}
if(! (newparam = myalloc (sizeof(defparam)))){
- if(!isudp) so._closesocket(srv.so.state, new_sock);
+ if(!isudp) srv.so._closesocket(srv.so.state, new_sock);
defparam.res = 21;
if(!srv.silent)dolog(&defparam, (unsigned char *)"Memory Allocation Failed");
usleep(SLEEPTIME);
@@ -1051,20 +1051,20 @@ void freeparam(struct clientparam * param) {
if(param->extusername) myfree(param->extusername);
if(param->extpassword) myfree(param->extpassword);
if(param->ctrlsocksrv != INVALID_SOCKET && param->ctrlsocksrv != param->remsock) {
- so._shutdown(param->sostate, param->ctrlsocksrv, SHUT_RDWR);
- so._closesocket(param->sostate, param->ctrlsocksrv);
+ param->srv->so._shutdown(param->sostate, param->ctrlsocksrv, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->ctrlsocksrv);
}
if(param->ctrlsock != INVALID_SOCKET && param->ctrlsock != param->clisock) {
- so._shutdown(param->sostate, param->ctrlsock, SHUT_RDWR);
- so._closesocket(param->sostate, param->ctrlsock);
+ param->srv->so._shutdown(param->sostate, param->ctrlsock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->ctrlsock);
}
if(param->remsock != INVALID_SOCKET) {
- so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
- so._closesocket(param->sostate, param->remsock);
+ param->srv->so._shutdown(param->sostate, param->remsock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->remsock);
}
if(param->clisock != INVALID_SOCKET) {
- so._shutdown(param->sostate, param->clisock, SHUT_RDWR);
- so._closesocket(param->sostate, param->clisock);
+ param->srv->so._shutdown(param->sostate, param->clisock, SHUT_RDWR);
+ param->srv->so._closesocket(param->sostate, param->clisock);
}
myfree(param);
}
diff --git a/src/sockmap.c b/src/sockmap.c
index 1150c7a..33bfb9d 100644
--- a/src/sockmap.c
+++ b/src/sockmap.c
@@ -180,7 +180,7 @@ log(logbuf);
memset(fds, 0, sizeof(fds));
fds[0].fd = param->clisock;
fds[1].fd = param->remsock;
- so._poll(param->sostate, fds, 2, sleeptime);
+ param->srv->so._poll(param->sostate, fds, 2, sleeptime);
sleeptime = 0;
}
if((param->srv->logdumpsrv && (param->statssrv64 > param->srv->logdumpsrv)) ||
@@ -214,7 +214,7 @@ log("send to server from buf");
if(fromclient) TOCLIENTBUF = 1;
}
sasize = sizeof(param->sinsr);
- res = so._sendto(param->sostate, param->remsock, (char *)param->clibuf + param->clioffset, (int)MIN(inclientbuf, fromclient), 0, (struct sockaddr*)¶m->sinsr, sasize);
+ res = param->srv->so._sendto(param->sostate, param->remsock, (char *)param->clibuf + param->clioffset, (int)MIN(inclientbuf, fromclient), 0, (struct sockaddr*)¶m->sinsr, sasize);
if(res <= 0) {
TOSERVER = 0;
if(errno && errno != EAGAIN && errno != EINTR){
@@ -259,7 +259,7 @@ log("send to client from buf");
continue;
}
sasize = sizeof(param->sincr);
- res = so._sendto(param->sostate, param->clisock, (char *)param->srvbuf + param->srvoffset, (int)MIN(inserverbuf,fromserver), 0, (struct sockaddr*)¶m->sincr, sasize);
+ res = param->srv->so._sendto(param->sostate, param->clisock, (char *)param->srvbuf + param->srvoffset, (int)MIN(inserverbuf,fromserver), 0, (struct sockaddr*)¶m->sincr, sasize);
if(res <= 0) {
TOCLIENT = 0;
if(errno && errno != EAGAIN && errno != EINTR){
@@ -433,7 +433,7 @@ log("done read from server to pipe\n");
log("read from client to buf");
#endif
sasize = sizeof(param->sincr);
- res = so._recvfrom(param->sostate, param->clisock, (char *)param->clibuf + param->cliinbuf, (int)MIN((uint64_t)param->clibufsize - param->cliinbuf, fromclient-inclientbuf), 0, (struct sockaddr *)¶m->sincr, &sasize);
+ res = param->srv->so._recvfrom(param->sostate, param->clisock, (char *)param->clibuf + param->cliinbuf, (int)MIN((uint64_t)param->clibufsize - param->cliinbuf, fromclient-inclientbuf), 0, (struct sockaddr *)¶m->sincr, &sasize);
if(res <= 0) {
FROMCLIENT = 0;
if(res == 0 || (errno && errno != EINTR && errno !=EAGAIN)){
@@ -461,7 +461,7 @@ log("done read from client to buf");
log("read from server to buf");
#endif
sasize = sizeof(param->sinsr);
- res = so._recvfrom(param->sostate, param->remsock, (char *)param->srvbuf + param->srvinbuf, (int)MIN((uint64_t)param->srvbufsize - param->srvinbuf, fromserver-inserverbuf), 0, (struct sockaddr *)¶m->sinsr, &sasize);
+ res = param->srv->so._recvfrom(param->sostate, param->remsock, (char *)param->srvbuf + param->srvinbuf, (int)MIN((uint64_t)param->srvbufsize - param->srvinbuf, fromserver-inserverbuf), 0, (struct sockaddr *)¶m->sinsr, &sasize);
if(res <= 0) {
FROMSERVER = 0;
if(res == 0 || (errno && errno != EINTR && errno !=EAGAIN)) {
@@ -706,7 +706,7 @@ log("ready reading from server pipe");
#ifdef WITHLOG
log("entering poll");
#endif
- res = so._poll(param->sostate, fds, fdsc, timeo*1000);
+ res = param->srv->so._poll(param->sostate, fds, fdsc, timeo*1000);
#ifdef WITHLOG
log("leaving poll");
#endif
diff --git a/src/socks.c b/src/socks.c
index 421e0db..4dbdbb7 100644
--- a/src/socks.c
+++ b/src/socks.c
@@ -189,7 +189,7 @@ void * sockschild(struct clientparam* param) {
#else
param->sinsl = param->srv->extsa;
#endif
- if ((param->remsock=so._socket(param->sostate, SASOCK(¶m->req), command == 2? SOCK_STREAM:SOCK_DGRAM, command == 2?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
+ if ((param->remsock=param->srv->so._socket(param->sostate, SASOCK(¶m->req), command == 2? SOCK_STREAM:SOCK_DGRAM, command == 2?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
param->operation = command == 2?BIND:UDPASSOC;
#ifdef REUSE
if (command == 2){
@@ -197,11 +197,11 @@ void * sockschild(struct clientparam* param) {
#ifdef SO_REUSEADDR
opt = 1;
- so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&opt, sizeof(int));
+ param->srv->so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&opt, sizeof(int));
#endif
#ifdef SO_REUSEPORT
opt = 1;
- so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
+ param->srv->so._setsockopt(param->sostate, param->remsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
#endif
}
#endif
@@ -230,23 +230,23 @@ void * sockschild(struct clientparam* param) {
#endif
if(command > 1) {
- if(so._bind(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {
+ if(param->srv->so._bind(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {
*SAPORT(¶m->sinsl) = 0;
- if(so._bind(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl)))RETURN (12);
+ if(param->srv->so._bind(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl)))RETURN (12);
#if SOCKSTRACE > 0
fprintf(stderr, "%hu bound to communicate with server\n", *SAPORT(¶m->sins));
fflush(stderr);
#endif
}
sasize = SASIZE(¶m->sinsl);
- so._getsockname(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsl, &sasize);
+ param->srv->so._getsockname(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsl, &sasize);
if(command == 3) {
param->ctrlsock = param->clisock;
- param->clisock = so._socket(param->sostate, SASOCK(¶m->sincr), SOCK_DGRAM, IPPROTO_UDP);
+ param->clisock = param->srv->so._socket(param->sostate, SASOCK(¶m->sincr), SOCK_DGRAM, IPPROTO_UDP);
if(param->clisock == INVALID_SOCKET) {RETURN(11);}
sin = param->sincl;
*SAPORT(&sin) = 0;
- if(so._bind(param->sostate, param->clisock,(struct sockaddr *)&sin,SASIZE(&sin))) {RETURN (12);}
+ if(param->srv->so._bind(param->sostate, param->clisock,(struct sockaddr *)&sin,SASIZE(&sin))) {RETURN (12);}
#if SOCKSTRACE > 0
fprintf(stderr, "%hu binded to communicate with client\n",
ntohs(*SAPORT(&sin))
@@ -268,8 +268,8 @@ CLEANRET:
int repcode;
sasize = sizeof(sin);
- if(command != 3 && param->remsock != INVALID_SOCKET) so._getsockname(param->sostate, param->remsock, (struct sockaddr *)&sin, &sasize);
- else so._getsockname(param->sostate, param->clisock, (struct sockaddr *)&sin, &sasize);
+ if(command != 3 && param->remsock != INVALID_SOCKET) param->srv->so._getsockname(param->sostate, param->remsock, (struct sockaddr *)&sin, &sasize);
+ else param->srv->so._getsockname(param->sostate, param->clisock, (struct sockaddr *)&sin, &sasize);
#if SOCKSTRACE > 0
fprintf(stderr, "Sending confirmation to client with code %d for %s with %s:%hu\n",
param->res,
@@ -326,19 +326,19 @@ fflush(stderr);
param->res = mapsocket(param, conf.timeouts[CONNECTION_L]);
break;
case 2:
- so._listen (param->sostate, param->remsock, 1);
+ param->srv->so._listen (param->sostate, param->remsock, 1);
fds[0].fd = param->remsock;
fds[1].fd = param->clisock;
fds[0].events = fds[1].events = POLLIN;
- res = so._poll(param->sostate, fds, 2, conf.timeouts[CONNECTION_L] * 1000);
+ res = param->srv->so._poll(param->sostate, fds, 2, conf.timeouts[CONNECTION_L] * 1000);
if (res < 1 || fds[1].revents) {
res = 460;
break;
}
sasize = sizeof(param->sinsr);
- s = so._accept(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsr, &sasize);
- so._closesocket(param->sostate, param->remsock);
+ s = param->srv->so._accept(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsr, &sasize);
+ param->srv->so._closesocket(param->sostate, param->remsock);
param->remsock = s;
if(s == INVALID_SOCKET) {
param->res = 462;
@@ -392,7 +392,7 @@ fflush(stderr);
fds[2].fd = param->ctrlsock;
fds[2].events = fds[1].events = fds[0].events = POLLIN;
- res = so._poll(param->sostate, fds, 3, conf.timeouts[CONNECTION_L]*1000);
+ res = param->srv->so._poll(param->sostate, fds, 3, conf.timeouts[CONNECTION_L]*1000);
if(res <= 0) {
param->res = 463;
break;
@@ -403,7 +403,7 @@ fflush(stderr);
}
if (fds[1].revents) {
sasize = sizeof(sin);
- if((len = so._recvfrom(param->sostate, param->clisock, (char *)buf, 65535, 0, (struct sockaddr *)&sin, &sasize)) <= 10) {
+ if((len = param->srv->so._recvfrom(param->sostate, param->clisock, (char *)buf, 65535, 0, (struct sockaddr *)&sin, &sasize)) <= 10) {
param->res = 464;
break;
}
@@ -464,7 +464,7 @@ fflush(stderr);
sasize = sizeof(param->sinsr);
buf[0]=buf[1]=buf[2]=0;
buf[3]=(*SAFAMILY(¶m->sinsl) == AF_INET)?1:4;
- if((len = so._recvfrom(param->sostate, param->remsock, (char *)buf+6+SAADDRLEN(¶m->sinsl), 65535 - (6+SAADDRLEN(¶m->sinsl)), 0, (struct sockaddr *)¶m->sinsr, &sasize)) <= 0) {
+ if((len = param->srv->so._recvfrom(param->sostate, param->remsock, (char *)buf+6+SAADDRLEN(¶m->sinsl), 65535 - (6+SAADDRLEN(¶m->sinsl)), 0, (struct sockaddr *)¶m->sinsr, &sasize)) <= 0) {
param->res = 468;
break;
}
diff --git a/src/udppm.c b/src/udppm.c
index 1a681cd..b28582d 100644
--- a/src/udppm.c
+++ b/src/udppm.c
@@ -56,15 +56,15 @@ void * udppmchild(struct clientparam* param) {
param->cliinbuf = i;
#ifdef _WIN32
- if((param->clisock=so._socket(param->sostate, SASOCK(¶m->sincr), SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
+ if((param->clisock=param->srv->so._socket(param->sostate, SASOCK(¶m->sincr), SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
RETURN(818);
}
- if(so._setsockopt(param->sostate, param->clisock, SOL_SOCKET, SO_REUSEADDR, (char *)&ul, sizeof(int))) {RETURN(820);};
+ if(param->srv->so._setsockopt(param->sostate, param->clisock, SOL_SOCKET, SO_REUSEADDR, (char *)&ul, sizeof(int))) {RETURN(820);};
ul = 1;
ioctlsocket(param->clisock, FIONBIO, &ul);
size = sizeof(param->sinsl);
- if(so._getsockname(param->sostate, param->srv->srvsock, (struct sockaddr *)¶m->sinsl, &size)) {RETURN(21);};
- if(so._bind(param->sostate, param->clisock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {
+ if(param->srv->so._getsockname(param->sostate, param->srv->srvsock, (struct sockaddr *)¶m->sinsl, &size)) {RETURN(21);};
+ if(param->srv->so._bind(param->sostate, param->clisock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {
RETURN(822);
}
#else
@@ -77,8 +77,8 @@ void * udppmchild(struct clientparam* param) {
memcpy(¶m->sinsl, ¶m->srv->extsa, SASIZE(¶m->req));
#endif
*SAPORT(¶m->sinsl) = 0;
- if ((param->remsock=so._socket(param->sostate, SASOCK(¶m->sinsl), SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
- if(so._bind(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {RETURN (12);}
+ if ((param->remsock=param->srv->so._socket(param->sostate, SASOCK(¶m->sinsl), SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
+ if(param->srv->so._bind(param->sostate, param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {RETURN (12);}
#ifdef _WIN32
ul = 1;
ioctlsocket(param->remsock, FIONBIO, &ul);