From c1beee44efbc7a672baad07bf2eabc9455472f5f Mon Sep 17 00:00:00 2001 From: z3APA3A <3APA3A@3proxy.ru> Date: Sun, 25 Dec 2016 02:46:30 +0300 Subject: [PATCH] Add support for -os, -oc, -ol -ocOPTIONS, -osOPTIONS, -olOPTIONS - options for client (oc), server (os) or listening (ol) socket e.g. proxy -ocTCP_NODELAY,SO_KEEPALIVE,SO_DONTROUTE --- src/Makefile.inc | 8 +-- src/auth.c | 2 +- src/common.c | 2 + src/dighosts.c | 141 ----------------------------------------------- src/proxy.h | 6 +- src/proxymain.c | 96 ++++++++++++++++++++++++++++++++ src/structures.h | 1 + 7 files changed, 106 insertions(+), 150 deletions(-) delete mode 100644 src/dighosts.c diff --git a/src/Makefile.inc b/src/Makefile.inc index aba8ac3..c94ff24 100644 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -2,7 +2,7 @@ # 3 proxy common Makefile # -all: $(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)mycrypt$(EXESUFFICS) $(BUILDDIR)dighosts$(EXESUFFICS) $(BUILDDIR)pop3p$(EXESUFFICS) $(BUILDDIR)smtpp$(EXESUFFICS) $(BUILDDIR)ftppr$(EXESUFFICS) $(BUILDDIR)tcppm$(EXESUFFICS) $(BUILDDIR)icqpr$(EXESUFFICS) $(BUILDDIR)udppm$(EXESUFFICS) $(BUILDDIR)socks$(EXESUFFICS) $(BUILDDIR)proxy$(EXESUFFICS) allplugins +all: $(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)mycrypt$(EXESUFFICS) $(BUILDDIR)pop3p$(EXESUFFICS) $(BUILDDIR)smtpp$(EXESUFFICS) $(BUILDDIR)ftppr$(EXESUFFICS) $(BUILDDIR)tcppm$(EXESUFFICS) $(BUILDDIR)icqpr$(EXESUFFICS) $(BUILDDIR)udppm$(EXESUFFICS) $(BUILDDIR)socks$(EXESUFFICS) $(BUILDDIR)proxy$(EXESUFFICS) allplugins sockmap$(OBJSUFFICS): sockmap.c proxy.h structures.h @@ -130,12 +130,6 @@ datatypes$(OBJSUFFICS): datatypes.c proxy.h structures.h mycrypt$(OBJSUFFICS): mycrypt.c $(CC) $(COUT)mycrypt$(OBJSUFFICS) $(CFLAGS) mycrypt.c -dighosts$(OBJSUFFICS): dighosts.c - $(CC) $(COUT)dighosts$(OBJSUFFICS) $(CFLAGS) dighosts.c - -$(BUILDDIR)dighosts$(EXESUFFICS): dighosts$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) - $(LN) $(LNOUT)$(BUILDDIR)dighosts$(EXESUFFICS) $(LDFLAGS) dighosts$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) - mycryptmain$(OBJSUFFICS): mycrypt.c $(CC) $(COUT)mycryptmain$(OBJSUFFICS) $(CFLAGS) $(DEFINEOPTION)WITHMAIN mycrypt.c diff --git a/src/auth.c b/src/auth.c index 8f7266b..74af5fe 100644 --- a/src/auth.c +++ b/src/auth.c @@ -1098,7 +1098,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un #ifdef TCP_NODELAY { int opt = 1; - setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)); + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)); } #endif } diff --git a/src/common.c b/src/common.c index 4e9a9af..bd5e064 100644 --- a/src/common.c +++ b/src/common.c @@ -694,6 +694,8 @@ int doconnect(struct clientparam * param){ } if(!*SAPORT(¶m->sinsr))*SAPORT(¶m->sinsr) = *SAPORT(¶m->req); if ((param->remsock=so._socket(SASOCK(¶m->sinsr), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);} + setopts(param->remsock, param->srv->srvsockopts); + so._setsockopt(param->remsock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg)); #ifdef REUSE { diff --git a/src/dighosts.c b/src/dighosts.c deleted file mode 100644 index c4965d1..0000000 --- a/src/dighosts.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - (c) 2002-2016 by Vladimir Dubrovin <3proxy@3proxy.ru> - - please read License Agreement - -*/ - -#include "proxy.h" -pthread_mutex_t log_mutex; - - -int sockgetchar(SOCKET sock, int timeosec, int timeousec){ - unsigned char buf; - fd_set fds; - struct timeval tv; - - tv.tv_sec = timeosec; - tv.tv_usec = timeousec; - FD_ZERO(&fds); - FD_SET(sock, &fds); - if (select (((int)sock)+1, &fds, NULL, NULL, &tv)!=1) return EOF; - if (recv(sock, (char *)&buf, 1, 0)!=1) return EOF; - return((int)buf); -} - - -int sockgetline(SOCKET sock, unsigned char * buf, int bufsize, int delim, int to){ - int c; - int i=0, tos, tou; - if(bufsize<2) return 0; - c = sockgetchar(sock, to, 0); - if (c == EOF) { - return 0; - } - tos = to/16; - tou = ((to * 1000) / bufsize)%1000; - do { - buf[i++] = c; - if(delim != EOF && c == delim) break; - }while(i < bufsize && (c = sockgetchar(sock, tos, tou)) != EOF); - return i; -} - - -unsigned char request[] = "GET %.1024s HTTP/1.0\r\nHost: %.256s\r\n\r\n"; - -int main(int argc, char *argv[]){ - unsigned char *host, *hostend; - SOCKET sock; - struct sockaddr_in sa; - FILE *fp; - unsigned char buf[16000]; - int i; - unsigned x,y,z,w,cidr, x1,y1,z1,w1, mask; - int first = 1; - -#ifdef _WIN32 - WSADATA wd; - WSAStartup(MAKEWORD( 1, 1 ), &wd); -#endif - - if(argc < 3 || argc > 4 || (argc == 4 && (argv[1][0] != '-' || argv[1][1] != 'm'))) { - fprintf(stderr, "Usage: %s [-m] \n" - " program retrieves requested and builds comma delimited list of networks\n" - " list than stored in \n" - " networks are searched in xxx.yyy.zzz.www/cidr format\n" - " switches:\n" - " -m networks are searched in xxx.yyy.zzz.www mmm.mmm.mmm.mmm format\n" - "\n(c)2002 by 3APA3A\n", - argv[0]); - return 1; - } - if(strncasecmp(argv[argc-2], "http://", 7)) { - fprintf(stderr, "URL must be HTTP://\n"); - return 2; - } - hostend = (unsigned char *)strchr((char *)argv[argc-2] + 7, '/'); - if(!hostend) { - fprintf(stderr, "Wrong URL syntaxis\n"); - return 3; - } - *hostend = 0; - if(!(host = (unsigned char *)strdup((char *)argv[argc-2] + 7))) { - return 4; - } - *hostend = '/'; - if(!getip46(4, host, (struct sockaddr *)&sa)) { - fprintf(stderr, "Unable to resolve %s\n", host); - return 5; - } - sa.sin_port = htons(80); - if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return 6; - sprintf((char *)buf, (char *)request, hostend, host); - if(connect(sock,(struct sockaddr *)&sa,sizeof(sa))) { - fprintf(stderr, "Unable to connect: %s\n", host); - return 8; - } - if(send(sock, (char *)buf, (int)strlen((char *)buf), 0) != (int)strlen((char *)buf)) return 9; - while( (i = sockgetline(sock, buf, sizeof(buf) - 1, '\n', 30)) > 2); - if(i<1) return 9; - if(!(fp = fopen(argv[argc-1], "w"))) { - fprintf(stderr, "Unable to open: %s\n", argv[2]); - return 7; - } - while( (i = sockgetline(sock, buf, sizeof(buf) - 1, '\n', 30)) > 0){ - buf[i] = 0; - for(i = 0; buf[i]; i++){ - if((buf[i]<'0' || buf[i] > '9') && buf[i] != '.' && buf[i] != '/')buf[i] = ' '; - } - if(argc == 3){ - if((i=sscanf((char *)buf, "%u.%u.%u.%u/%u", &x, &y, &z, &w, &cidr)) == 5 && - x<256 && y<256 && z<256 && w<256 && - cidr <= 32){ - if(!first)fprintf(fp, ","); - fprintf(fp, "%u.%u.%u.%u/%u", x, y, z, w, cidr); - first = 0; - } - } - else{ - if((i = sscanf((char *)buf, "%u.%u.%u.%u %u.%u.%u.%u", &x, &y, &z, &w, &x1, &y1, &z1, &w1)) == 8 && - x<256 && y<256 && z<256 && w<256 && - x1<256 && y1<256 && z1<256 && w1<256 - ){ - mask = (x1<<24)|(y1<<16)|(z1<<8)|w1; - for(cidr = 0; cidr <= 32; cidr++)if((((unsigned long)(0xFFFFFFFF))<<(32-cidr)) == mask) break; - if(cidr > 32) continue; - if(!first)fprintf(fp, ","); - fprintf(fp, "%u.%u.%u.%u/%u", x, y, z, w, cidr); - first = 0; - } - } - } - shutdown(sock, SHUT_RDWR); -#ifdef _WIN32 - closesocket(sock); -#else - close(sock); -#endif - fclose(fp); - return 0; -} diff --git a/src/proxy.h b/src/proxy.h index 236efb6..9034b6a 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -339,6 +339,11 @@ extern struct sockaddr_in6 radiuslist[MAXRADIUS]; extern int nradservers; extern char * radiussecret; +extern struct socketoptions { + int opt; + char * optname; +} sockopts[]; +void setopts(SOCKET s, int opts); #ifdef _WINCE char * CEToUnicode (const char *str); @@ -346,7 +351,6 @@ int cesystem(const char *str); int ceparseargs(const char *str); extern char * ceargv[32]; - #define system(S) cesystem(S) #endif diff --git a/src/proxymain.c b/src/proxymain.c index 369560a..61d73c3 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -61,6 +61,54 @@ void * threadfunc (void *p) { #undef param +struct socketoptions sockopts[] = { +#ifdef TCP_NODELAY + {TCP_NODELAY, "TCP_NODELAY"}, +#endif +#ifdef TCP_CORK + {TCP_CORK, "TCP_CORK"}, +#endif +#ifdef TCP_DEFER_ACCEPT + {TCP_DEFER_ACCEPT, "TCP_DEFER_ACCEPT"}, +#endif +#ifdef TCP_QUICKACK + {TCP_QUICKACK, "TCP_QUICKACK"}, +#endif +#ifdef TCP_TIMESTAMPS + {TCP_TIMESTAMPS, "TCP_TIMESTAMPS"}, +#endif +#ifdef USE_TCP_FASTOPEN + {USE_TCP_FASTOPEN, "USE_TCP_FASTOPEN"}, +#endif +#ifdef SO_REUSEADDR + {SO_REUSEADDR, "SO_REUSEADDR"}, +#endif +#ifdef SO_REUSEPORT + {SO_REUSEPORT, "SO_REUSEPORT"}, +#endif +#ifdef SO_KEEPALIVE + {SO_KEEPALIVE, "SO_KEEPALIVE"}, +#endif +#ifdef SO_DONTROUTE + {SO_DONTROUTE, "SO_DONTROUTE"}, +#endif + {0, NULL} +}; + +int getopts(const char *s){ + int i=0, ret=0; + for(; sockopts[i].optname; i++)if(strstr(s,sockopts[i].optname)) ret |= (1<= (opt = (1<