Major code refactoring

- sockmapping rewritten from stratch to minimilse polling. poll() is now
only called if blocking is actually expected, splice pipes are now
polled if splice fails, buffers flushing is much more accurate.
- logging code moved to separate files
- signal masks added to client threads to prevent unneeded interruptions
- bandwidth limitation will not delay the thread after client or server
shutdown
This commit is contained in:
z3APA3A 2020-10-09 15:42:34 +03:00
parent 3dd1969657
commit eb829b062b
17 changed files with 724 additions and 586 deletions

View File

@ -870,6 +870,16 @@ You can control 3proxy service via "Services" administration ot via "net" comman
<li>50-69 - SOCKS5 PROXY REDIRECTION ERRORS <li>50-69 - SOCKS5 PROXY REDIRECTION ERRORS
<li>70-79 PARENT PROXY CONNECTION ERRORS (identical to 1x) <li>70-79 PARENT PROXY CONNECTION ERRORS (identical to 1x)
<li>90-99 - established connection errors <li>90-99 - established connection errors
<li>since 0.9
<li>90 - unexpected system error (should not happen)
<li>91 - unexpected poll error (should not happen)
<li>92 - connection terminated by timeout
<li>93 - dirty connection termination by server or client (or network issue) with unsent data
<li>94 - clear connection termination by server or client with unsent data
<li>95 - dirty connection termination by client (or network issue)
<li>96 - dirty connection termination by server (or network issue)
<li>97 - dirty connection termination by both client and server (probably network issue)
<li>prior to 0.9:
<li>90 - socket error or connection broken <li>90 - socket error or connection broken
<li>91 - TCP/IP common failure <li>91 - TCP/IP common failure
<li>92 - connection timed out <li>92 - connection timed out

View File

@ -1046,6 +1046,18 @@
<li>50-69 - ошибки перенаправления SOCKS5 <li>50-69 - ошибки перенаправления SOCKS5
<li>70-79 ошибки установки родительского соединения, аналогичны 1x <li>70-79 ошибки установки родительского соединения, аналогичны 1x
<li>90-99 - ошибки разрыва соединения <li>90-99 - ошибки разрыва соединения
<li>с версии 0.9
<li>90 - неожиданная системная ошибка (не должно происходить)
<li>91 - ошибка poll (не должно происходить)
<li>92 - соединение прервано по таймауту
<li>93 - клиент или сервер &quot;грязно&quot; закрыли соединение или произошла сетевая ошибка, остались неотправленные данные
<li>94 - клиент или сервер &quot;чисто&quot; закрыли соединение или произошла сетевая ошибка, остались неотправленные данные
<li>95 - клиент "грязно" закрыл соединение или сетевая ошибка
<li>96 - сервер "грязно" закрыл соединение или сетевая ошибка
<li>97 - клиент и сервер "грязно" закрыли соединение или сетевая ошибка
<li>98 - исчерпан лимит данных сервера (не должно быть в журнале)
<li>99 - исчерпан лимит данных клиента (не должно быть в журнале)
<li>до версии 0.9
<li>90 - ошибка сокета или соединение неожиданно прервано <li>90 - ошибка сокета или соединение неожиданно прервано
<li>91 - общий сбой стека TCP/IP <li>91 - общий сбой стека TCP/IP
<li>92 - соединение прервано по таймауту <li>92 - соединение прервано по таймауту

View File

@ -369,7 +369,7 @@ int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to){
unsigned long ul = 1; unsigned long ul = 1;
ioctlsocket(sock, FIONBIO, &ul); ioctlsocket(sock, FIONBIO, &ul);
#else #else
fcntl(sock,F_SETFL,O_NONBLOCK); fcntl(sock,F_SETFL, O_NONBLOCK | fcntl(sock,F_GETFL));
#endif #endif
if(so._connect(sock,sa,size)) { if(so._connect(sock,sa,size)) {
if(errno != EAGAIN && errno != EINPROGRESS) return (13); if(errno != EAGAIN && errno != EINPROGRESS) return (13);

View File

@ -198,7 +198,7 @@ CLEANRET:
if((ip && type == 0x01) || type == 0x1c){ if((ip && type == 0x01) || type == 0x1c){
myinet_ntop(type == 0x01? AF_INET:AF_INET6, addr, (char *)buf+strlen((char *)buf), 64); myinet_ntop(type == 0x01? AF_INET:AF_INET6, addr, (char *)buf+strlen((char *)buf), 64);
} }
(*param->srv->logfunc)(param, buf); dolog(param, buf);
} }
if(bbuf)myfree(bbuf); if(bbuf)myfree(bbuf);
if(host)myfree(host); if(host)myfree(host);

View File

@ -295,7 +295,7 @@ void * ftpprchild(struct clientparam* param) {
sasize = sizeof(param->sincr); sasize = sizeof(param->sincr);
if(so._getpeername(param->ctrlsock, (struct sockaddr *)&param->sincr, &sasize)){RETURN(819);} if(so._getpeername(param->ctrlsock, (struct sockaddr *)&param->sincr, &sasize)){RETURN(819);}
if(req && (param->statscli64 || param->statssrv64)){ if(req && (param->statscli64 || param->statssrv64)){
(*param->srv->logfunc)(param, (unsigned char *)req); dolog(param, (unsigned char *)req);
} }
} }
@ -316,7 +316,7 @@ CLEANRET:
sasize = sizeof(param->sincr); sasize = sizeof(param->sincr);
so._getpeername(param->ctrlsock, (struct sockaddr *)&param->sincr, &sasize); so._getpeername(param->ctrlsock, (struct sockaddr *)&param->sincr, &sasize);
if(param->res != 0 || param->statscli64 || param->statssrv64 ){ if(param->res != 0 || param->statscli64 || param->statssrv64 ){
(*param->srv->logfunc)(param, (unsigned char *)((req && (param->res > 802))? req:NULL)); dolog(param, (unsigned char *)((req && (param->res > 802))? req:NULL));
} }
if(req) myfree(req); if(req) myfree(req);
if(buf) myfree(buf); if(buf) myfree(buf);

View File

@ -1,18 +1,38 @@
/* /*
3APA3A simpliest proxy server 3APA3A simpliest proxy server
(c) 2002-2016 by Vladimir Dubrovin <3proxy@3proxy.ru> (c) 2002-2020 by Vladimir Dubrovin <3proxy@3proxy.ru>
please read License Agreement please read License Agreement
*/ */
pthread_mutex_t log_mutex;
#include "proxy.h" #include "proxy.h"
pthread_mutex_t log_mutex;
int havelog = 0; int havelog = 0;
struct clientparam logparam;
struct srvparam logsrv;
void dolog(struct clientparam * param, const unsigned char *s){
static int init = 0;
if(param)param->srv->logfunc(param, s);
else {
if(!init){
srvinit(&logsrv, &logparam);
init = 1;
}
logstdout(&logparam, s);
}
}
void clearstat(struct clientparam * param) { void clearstat(struct clientparam * param) {
#ifdef _WIN32 #ifdef _WIN32

View File

@ -49,9 +49,9 @@ CLEANRET:
if(param->hostname&&param->extusername) { if(param->hostname&&param->extusername) {
sprintf((char *)buf, "%.128s@%.128s%c%hu", param->extusername, param->hostname, (*SAPORT(&param->sinsr)==110)?0:':', ntohs(*SAPORT(&param->sinsr))); sprintf((char *)buf, "%.128s@%.128s%c%hu", param->extusername, param->hostname, (*SAPORT(&param->sinsr)==110)?0:':', ntohs(*SAPORT(&param->sinsr)));
(*param->srv->logfunc)(param, buf); dolog(param, buf);
} }
else (*param->srv->logfunc)(param, NULL); else dolog(param, NULL);
if(param->clisock != INVALID_SOCKET) { if(param->clisock != INVALID_SOCKET) {
if ((param->res > 0 && param->res < 100) || (param->res > 611 && param->res <700)) socksend(param->clisock, (unsigned char *)"-ERR\r\n", 6,conf.timeouts[STRING_S]); if ((param->res > 0 && param->res < 100) || (param->res > 611 && param->res <700)) socksend(param->clisock, (unsigned char *)"-ERR\r\n", 6,conf.timeouts[STRING_S]);
} }

View File

@ -152,7 +152,7 @@ static void logurl(struct clientparam * param, char * buf, char * req, int ftp){
strcpy(se, sb); strcpy(se, sb);
} }
} }
if(param->res != 555 && param->res != 508)(*param->srv->logfunc)(param, (unsigned char *)(req?buf:NULL)); if(param->res != 555 && param->res != 508)dolog(param, (unsigned char *)(req?buf:NULL));
} }
void decodeurl(unsigned char *s, int allowcr){ void decodeurl(unsigned char *s, int allowcr){

View File

@ -151,8 +151,7 @@ extern int timetoexit;
extern struct extparam conf; extern struct extparam conf;
int sockmap(struct clientparam * param, int timeo); int sockmap(struct clientparam * param, int timeo, int usesplice);
int splicemap(struct clientparam * param, int timeo);
int socksend(SOCKET sock, unsigned char * buf, int bufsize, int to); int socksend(SOCKET sock, unsigned char * buf, int bufsize, int to);
int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to); int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to);
int sockrecvfrom(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to); int sockrecvfrom(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to);
@ -168,6 +167,7 @@ int sockgetlinebuf(struct clientparam * param, DIRECTION which, unsigned char *
void dolog(struct clientparam * param, const unsigned char *s);
int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec); int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec);
int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format); int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format);
extern FILE * stdlog; extern FILE * stdlog;
@ -312,9 +312,9 @@ extern struct datatype datatypes[64];
extern struct commands commandhandlers[]; extern struct commands commandhandlers[];
#ifdef WITHSPLICE #ifdef WITHSPLICE
#define mapsocket(a,b) (a->srv->usesplice && !a->ndatfilterssrv && !a->ndatfilterscli && !a->npredatfilters?splicemap(a,b):sockmap(a,b)) #define mapsocket(a,b) ((a->srv->usesplice && !a->ndatfilterssrv && !a->ndatfilterscli)?sockmap(a,b,1):sockmap(a,b,0))
#else #else
#define mapsocket(a,b) sockmap(a,b) #define mapsocket(a,b) sockmap(a,b, 0)
#endif #endif

View File

@ -23,27 +23,27 @@ void * threadfunc (void *p) {
fds.revents = 0; fds.revents = 0;
for(i=5+(param->srv->maxchild>>10); i; i--){ for(i=5+(param->srv->maxchild>>10); i; i--){
if(so._poll(&fds, 1, 1000*CONNBACK_TO)!=1){ if(so._poll(&fds, 1, 1000*CONNBACK_TO)!=1){
param->srv->logfunc(param, (unsigned char *)"Connect back not received, check connback client"); dolog(param, (unsigned char *)"Connect back not received, check connback client");
i = 0; i = 0;
break; break;
} }
param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)&param->sinsr, &size); param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)&param->sinsr, &size);
if(param->remsock == INVALID_SOCKET) { if(param->remsock == INVALID_SOCKET) {
param->srv->logfunc(param, (unsigned char *)"Connect back accept() failed"); dolog(param, (unsigned char *)"Connect back accept() failed");
continue; continue;
} }
#ifndef WITHMAIN #ifndef WITHMAIN
param->req = param->sinsr; param->req = param->sinsr;
if(param->srv->acl) param->res = checkACL(param); if(param->srv->acl) param->res = checkACL(param);
if(param->res){ if(param->res){
param->srv->logfunc(param, (unsigned char *)"Connect back ACL failed"); dolog(param, (unsigned char *)"Connect back ACL failed");
so._closesocket(param->remsock); so._closesocket(param->remsock);
param->remsock = INVALID_SOCKET; param->remsock = INVALID_SOCKET;
continue; continue;
} }
#endif #endif
if(socksendto(param->remsock, (struct sockaddr*)&param->sinsr, (unsigned char *)"C", 1, CONNBACK_TO) != 1){ if(socksendto(param->remsock, (struct sockaddr*)&param->sinsr, (unsigned char *)"C", 1, CONNBACK_TO) != 1){
param->srv->logfunc(param, (unsigned char *)"Connect back sending command failed"); dolog(param, (unsigned char *)"Connect back sending command failed");
so._closesocket(param->remsock); so._closesocket(param->remsock);
param->remsock = INVALID_SOCKET; param->remsock = INVALID_SOCKET;
continue; continue;
@ -57,6 +57,13 @@ void * threadfunc (void *p) {
freeparam(param); freeparam(param);
} }
else { else {
#ifndef _WIN32
sigset_t mask;
sigfillset(&mask);
pthread_sigmask(SIG_SETMASK, &mask, NULL);
#endif
((struct clientparam *) p)->srv->pf((struct clientparam *)p); ((struct clientparam *) p)->srv->pf((struct clientparam *)p);
} }
#ifdef _WIN32 #ifdef _WIN32
@ -260,12 +267,8 @@ int MODULEMAINFUNC (int argc, char** argv){
WSADATA wd; WSADATA wd;
WSAStartup(MAKEWORD( 1, 1 ), &wd); WSAStartup(MAKEWORD( 1, 1 ), &wd);
#else
signal(SIGPIPE, SIG_IGN);
#endif #endif
#endif #endif
srvinit(&srv, &defparam); srvinit(&srv, &defparam);
@ -288,6 +291,14 @@ int MODULEMAINFUNC (int argc, char** argv){
pthread_mutex_init(&log_mutex, NULL); pthread_mutex_init(&log_mutex, NULL);
#endif #endif
#ifndef _WIN32
{
sigset_t mask;
sigfillset(&mask);
pthread_sigmask(SIG_SETMASK, &mask, NULL);
}
#endif
for (i=1; i<argc; i++) { for (i=1; i<argc; i++) {
if(*argv[i]=='-') { if(*argv[i]=='-') {
switch(argv[i][1]) { switch(argv[i][1]) {
@ -513,7 +524,7 @@ int MODULEMAINFUNC (int argc, char** argv){
#ifndef _WIN32 #ifndef _WIN32
if(inetd) { if(inetd) {
fcntl(0,F_SETFL,O_NONBLOCK); fcntl(0,F_SETFL,O_NONBLOCK | fcntl(0,F_GETFL));
if(!isudp){ if(!isudp){
so._setsockopt(0, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg)); so._setsockopt(0, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg));
so._setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (unsigned char *)&opt, sizeof(int)); so._setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (unsigned char *)&opt, sizeof(int));
@ -571,7 +582,7 @@ int MODULEMAINFUNC (int argc, char** argv){
#ifdef _WIN32 #ifdef _WIN32
ioctlsocket(sock, FIONBIO, &ul); ioctlsocket(sock, FIONBIO, &ul);
#else #else
fcntl(sock,F_SETFL,O_NONBLOCK); fcntl(sock,F_SETFL,O_NONBLOCK | fcntl(sock,F_GETFL));
#endif #endif
srv.srvsock = sock; srv.srvsock = sock;
opt = 1; opt = 1;
@ -587,7 +598,7 @@ int MODULEMAINFUNC (int argc, char** argv){
size = sizeof(srv.intsa); size = sizeof(srv.intsa);
for(sleeptime = SLEEPTIME * 100; so._bind(sock, (struct sockaddr*)&srv.intsa, SASIZE(&srv.intsa))==-1; usleep(sleeptime)) { for(sleeptime = SLEEPTIME * 100; so._bind(sock, (struct sockaddr*)&srv.intsa, SASIZE(&srv.intsa))==-1; usleep(sleeptime)) {
sprintf((char *)buf, "bind(): %s", strerror(errno)); sprintf((char *)buf, "bind(): %s", strerror(errno));
if(!srv.silent)(*srv.logfunc)(&defparam, buf); if(!srv.silent)dolog(&defparam, buf);
sleeptime = (sleeptime<<1); sleeptime = (sleeptime<<1);
if(!sleeptime) { if(!sleeptime) {
so._closesocket(sock); so._closesocket(sock);
@ -597,7 +608,7 @@ int MODULEMAINFUNC (int argc, char** argv){
if(!isudp){ if(!isudp){
if(so._listen (sock, 1 + (srv.maxchild>>4))==-1) { if(so._listen (sock, 1 + (srv.maxchild>>4))==-1) {
sprintf((char *)buf, "listen(): %s", strerror(errno)); sprintf((char *)buf, "listen(): %s", strerror(errno));
if(!srv.silent)(*srv.logfunc)(&defparam, buf); if(!srv.silent)dolog(&defparam, buf);
return -4; return -4;
} }
} }
@ -606,13 +617,13 @@ int MODULEMAINFUNC (int argc, char** argv){
if(!srv.silent && !iscbc){ if(!srv.silent && !iscbc){
sprintf((char *)buf, "Accepting connections [%u/%u]", (unsigned)getpid(), (unsigned)pthread_self()); sprintf((char *)buf, "Accepting connections [%u/%u]", (unsigned)getpid(), (unsigned)pthread_self());
(*srv.logfunc)(&defparam, buf); dolog(&defparam, buf);
} }
} }
if(iscbl){ if(iscbl){
parsehost(srv.family, cbl_string, (struct sockaddr *)&cbsa); parsehost(srv.family, cbl_string, (struct sockaddr *)&cbsa);
if((srv.cbsock=so._socket(SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) { if((srv.cbsock=so._socket(SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) {
(*srv.logfunc)(&defparam, (unsigned char *)"Failed to allocate connect back socket"); dolog(&defparam, (unsigned char *)"Failed to allocate connect back socket");
return -6; return -6;
} }
opt = 1; opt = 1;
@ -625,11 +636,11 @@ int MODULEMAINFUNC (int argc, char** argv){
setopts(srv.cbsock, srv.cbssockopts); setopts(srv.cbsock, srv.cbssockopts);
if(so._bind(srv.cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) { if(so._bind(srv.cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) {
(*srv.logfunc)(&defparam, (unsigned char *)"Failed to bind connect back socket"); dolog(&defparam, (unsigned char *)"Failed to bind connect back socket");
return -7; return -7;
} }
if(so._listen(srv.cbsock, 1 + (srv.maxchild>>4))==-1) { if(so._listen(srv.cbsock, 1 + (srv.maxchild>>4))==-1) {
(*srv.logfunc)(&defparam, (unsigned char *)"Failed to listen connect back socket"); dolog(&defparam, (unsigned char *)"Failed to listen connect back socket");
return -8; return -8;
} }
} }
@ -649,7 +660,7 @@ int MODULEMAINFUNC (int argc, char** argv){
nlog++; nlog++;
if(!srv.silent && nlog > 5000) { if(!srv.silent && nlog > 5000) {
sprintf((char *)buf, "Warning: too many connected clients (%d/%d)", srv.childcount, srv.maxchild); sprintf((char *)buf, "Warning: too many connected clients (%d/%d)", srv.childcount, srv.maxchild);
(*srv.logfunc)(&defparam, buf); dolog(&defparam, buf);
nlog = 0; nlog = 0;
} }
usleep(SLEEPTIME); usleep(SLEEPTIME);
@ -667,7 +678,7 @@ int MODULEMAINFUNC (int argc, char** argv){
if (error == 0) continue; if (error == 0) continue;
if (errno != EAGAIN && errno != EINTR) { if (errno != EAGAIN && errno != EINTR) {
sprintf((char *)buf, "poll(): %s/%d", strerror(errno), errno); sprintf((char *)buf, "poll(): %s/%d", strerror(errno), errno);
if(!srv.silent)(*srv.logfunc)(&defparam, buf); if(!srv.silent)dolog(&defparam, buf);
break; break;
} }
} }
@ -740,7 +751,7 @@ int MODULEMAINFUNC (int argc, char** argv){
nlog++; nlog++;
if(!srv.silent && (error || nlog > 5000)) { if(!srv.silent && (error || nlog > 5000)) {
sprintf((char *)buf, "accept(): %s", strerror(errno)); sprintf((char *)buf, "accept(): %s", strerror(errno));
(*srv.logfunc)(&defparam, buf); dolog(&defparam, buf);
nlog = 0; nlog = 0;
} }
continue; continue;
@ -750,13 +761,13 @@ int MODULEMAINFUNC (int argc, char** argv){
size = sizeof(defparam.sincl); size = sizeof(defparam.sincl);
if(so._getsockname(new_sock, (struct sockaddr *)&defparam.sincl, &size)){ if(so._getsockname(new_sock, (struct sockaddr *)&defparam.sincl, &size)){
sprintf((char *)buf, "getsockname(): %s", strerror(errno)); sprintf((char *)buf, "getsockname(): %s", strerror(errno));
if(!srv.silent)(*srv.logfunc)(&defparam, buf); if(!srv.silent)dolog(&defparam, buf);
continue; continue;
} }
#ifdef _WIN32 #ifdef _WIN32
ioctlsocket(new_sock, FIONBIO, &ul); ioctlsocket(new_sock, FIONBIO, &ul);
#else #else
fcntl(new_sock,F_SETFL,O_NONBLOCK); fcntl(new_sock,F_SETFL,O_NONBLOCK | fcntl(new_sock,F_GETFL));
#endif #endif
so._setsockopt(new_sock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg)); so._setsockopt(new_sock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
so._setsockopt(new_sock, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int)); so._setsockopt(new_sock, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int));
@ -767,7 +778,7 @@ int MODULEMAINFUNC (int argc, char** argv){
if(! (newparam = myalloc (sizeof(defparam)))){ if(! (newparam = myalloc (sizeof(defparam)))){
if(!isudp) so._closesocket(new_sock); if(!isudp) so._closesocket(new_sock);
defparam.res = 21; defparam.res = 21;
if(!srv.silent)(*srv.logfunc)(&defparam, (unsigned char *)"Memory Allocation Failed"); if(!srv.silent)dolog(&defparam, (unsigned char *)"Memory Allocation Failed");
usleep(SLEEPTIME); usleep(SLEEPTIME);
continue; continue;
}; };
@ -804,7 +815,7 @@ int MODULEMAINFUNC (int argc, char** argv){
} }
else { else {
sprintf((char *)buf, "_beginthreadex(): %s", _strerror(NULL)); sprintf((char *)buf, "_beginthreadex(): %s", _strerror(NULL));
if(!srv.silent)(*srv.logfunc)(&defparam, buf); if(!srv.silent)dolog(&defparam, buf);
error = 1; error = 1;
} }
#else #else
@ -813,7 +824,7 @@ int MODULEMAINFUNC (int argc, char** argv){
srv.childcount++; srv.childcount++;
if(error){ if(error){
sprintf((char *)buf, "pthread_create(): %s", strerror(error)); sprintf((char *)buf, "pthread_create(): %s", strerror(error));
if(!srv.silent)(*srv.logfunc)(&defparam, buf); if(!srv.silent)dolog(&defparam, buf);
} }
else { else {
newparam->threadid = (unsigned)thread; newparam->threadid = (unsigned)thread;

View File

@ -292,9 +292,9 @@ CLEANRET:
if(param->hostname&&param->extusername) { if(param->hostname&&param->extusername) {
sprintf((char *)buf, "%.128s@%.128s%c%hu", param->extusername, param->hostname, *SAPORT(&param->sinsr)==25?0:':',ntohs(*SAPORT(&param->sinsr))); sprintf((char *)buf, "%.128s@%.128s%c%hu", param->extusername, param->hostname, *SAPORT(&param->sinsr)==25?0:':',ntohs(*SAPORT(&param->sinsr)));
(*param->srv->logfunc)(param, buf); dolog(param, buf);
} }
else (*param->srv->logfunc)(param, NULL); else dolog(param, NULL);
if(param->clisock != INVALID_SOCKET) { if(param->clisock != INVALID_SOCKET) {
if ((param->res > 0 && param->res < 100) || (param->res > 661 && param->res <700)) socksend(param->clisock, (unsigned char *)"571 \r\n", 6,conf.timeouts[STRING_S]); if ((param->res > 0 && param->res < 100) || (param->res > 661 && param->res <700)) socksend(param->clisock, (unsigned char *)"571 \r\n", 6,conf.timeouts[STRING_S]);
} }

File diff suppressed because it is too large Load Diff

View File

@ -448,7 +448,7 @@ fflush(stderr);
else else
myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->req), (char *)buf + strlen((char *)buf), 64); myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->req), (char *)buf + strlen((char *)buf), 64);
sprintf((char *)buf+strlen((char *)buf), ":%hu", ntohs(*SAPORT(&param->req))); sprintf((char *)buf+strlen((char *)buf), ":%hu", ntohs(*SAPORT(&param->req)));
(*param->srv->logfunc)(param, buf); dolog(param, buf);
myfree(buf); myfree(buf);
} }
freeparam(param); freeparam(param);

View File

@ -740,7 +740,7 @@ struct pluginlink {
int (*dobuf2)(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format); int (*dobuf2)(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format);
int (*scanaddr)(const unsigned char *s, unsigned long * ip, unsigned long * mask); int (*scanaddr)(const unsigned char *s, unsigned long * ip, unsigned long * mask);
unsigned long (*getip46)(int family, unsigned char *name, struct sockaddr *sa); unsigned long (*getip46)(int family, unsigned char *name, struct sockaddr *sa);
int (*sockmap)(struct clientparam * param, int timeo); int (*sockmap)(struct clientparam * param, int timeo, int usesplice);
int (*ACLMatches)(struct ace* acentry, struct clientparam * param); int (*ACLMatches)(struct ace* acentry, struct clientparam * param);
int (*alwaysauth)(struct clientparam * param); int (*alwaysauth)(struct clientparam * param);
int (*checkACL)(struct clientparam * param); int (*checkACL)(struct clientparam * param);

View File

@ -23,7 +23,7 @@ void * tcppmchild(struct clientparam* param) {
RETURN (mapsocket(param, conf.timeouts[CONNECTION_L])); RETURN (mapsocket(param, conf.timeouts[CONNECTION_L]));
CLEANRET: CLEANRET:
(*param->srv->logfunc)(param, param->hostname); dolog(param, param->hostname);
freeparam(param); freeparam(param);
return (NULL); return (NULL);
} }

View File

@ -81,7 +81,7 @@ void * udppmchild(struct clientparam* param) {
#ifdef _WIN32 #ifdef _WIN32
ioctlsocket(param->remsock, FIONBIO, &ul); ioctlsocket(param->remsock, FIONBIO, &ul);
#else #else
fcntl(param->remsock,F_SETFL,O_NONBLOCK); fcntl(param->remsock,F_SETFL,O_NONBLOCK | fcntl(param->remsock,F_GETFL));
#endif #endif
memcpy(&param->sinsr, &param->req, sizeof(param->req)); memcpy(&param->sinsr, &param->req, sizeof(param->req));
@ -91,7 +91,7 @@ void * udppmchild(struct clientparam* param) {
param->srv->fds.events = POLLIN; param->srv->fds.events = POLLIN;
} }
param->res = sockmap(param, conf.timeouts[(param->srv->singlepacket)?SINGLEBYTE_L:STRING_L]); param->res = mapsocket(param, conf.timeouts[(param->srv->singlepacket)?SINGLEBYTE_L:STRING_L]);
if(!param->srv->singlepacket) { if(!param->srv->singlepacket) {
param->srv->fds.events = POLLIN; param->srv->fds.events = POLLIN;
} }
@ -99,7 +99,7 @@ void * udppmchild(struct clientparam* param) {
CLEANRET: CLEANRET:
if(buf)myfree(buf); if(buf)myfree(buf);
(*param->srv->logfunc)(param, NULL); dolog(param, NULL);
#ifndef _WIN32 #ifndef _WIN32
param->clisock = INVALID_SOCKET; param->clisock = INVALID_SOCKET;
#endif #endif

View File

@ -576,7 +576,7 @@ CLEANRET:
printstr(&pp, NULL); printstr(&pp, NULL);
if(buf) myfree(buf); if(buf) myfree(buf);
(*param->srv->logfunc)(param, (unsigned char *)req); dolog(param, (unsigned char *)req);
if(req)myfree(req); if(req)myfree(req);
freeparam(param); freeparam(param);
return (NULL); return (NULL);