proxymain.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204
  1. /*
  2. 3APA3A simpliest proxy server
  3. (c) 2002-2016 by Vladimir Dubrovin <3proxy@3proxy.ru>
  4. please read License Agreement
  5. */
  6. #include "proxy.h"
  7. pthread_mutex_t log_mutex;
  8. #define param ((struct clientparam *) p)
  9. #ifdef _WIN32
  10. DWORD WINAPI threadfunc(LPVOID p) {
  11. #else
  12. void * threadfunc (void *p) {
  13. #endif
  14. int i = 0;
  15. if(param->srv->cbsock != INVALID_SOCKET){
  16. SASIZETYPE size = sizeof(param->sinsr);
  17. for(i=0; i<3; i++){
  18. param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)&param->sinsr, &size);
  19. if(param->remsock == INVALID_SOCKET) {
  20. param->res = 13;
  21. param->srv->logfunc(param, (unsigned char *)"Connect back accept() failed");
  22. continue;
  23. }
  24. #ifndef WITHMAIN
  25. param->req = param->sinsr;
  26. if(param->srv->acl) param->res = checkACL(param);
  27. if(param->res){
  28. param->srv->logfunc(param, (unsigned char *)"Connect back ACL failed");
  29. so._closesocket(param->remsock);
  30. param->remsock = INVALID_SOCKET;
  31. continue;
  32. }
  33. #endif
  34. if(so._sendto(param->remsock, "C", 1, 0, (struct sockaddr*)&param->sinsr, size) != 1){
  35. param->srv->logfunc(param, (unsigned char *)"Connect back sending command failed");
  36. so._closesocket(param->remsock);
  37. param->remsock = INVALID_SOCKET;
  38. continue;
  39. }
  40. break;
  41. }
  42. }
  43. if(i == 3){
  44. freeparam(param);
  45. }
  46. else {
  47. ((struct clientparam *) p)->srv->pf((struct clientparam *)p);
  48. }
  49. #ifdef _WIN32
  50. return 0;
  51. #else
  52. return NULL;
  53. #endif
  54. }
  55. #undef param
  56. struct socketoptions sockopts[] = {
  57. #ifdef TCP_NODELAY
  58. {TCP_NODELAY, "TCP_NODELAY"},
  59. #endif
  60. #ifdef TCP_CORK
  61. {TCP_CORK, "TCP_CORK"},
  62. #endif
  63. #ifdef TCP_DEFER_ACCEPT
  64. {TCP_DEFER_ACCEPT, "TCP_DEFER_ACCEPT"},
  65. #endif
  66. #ifdef TCP_QUICKACK
  67. {TCP_QUICKACK, "TCP_QUICKACK"},
  68. #endif
  69. #ifdef TCP_TIMESTAMPS
  70. {TCP_TIMESTAMPS, "TCP_TIMESTAMPS"},
  71. #endif
  72. #ifdef USE_TCP_FASTOPEN
  73. {USE_TCP_FASTOPEN, "USE_TCP_FASTOPEN"},
  74. #endif
  75. #ifdef SO_REUSEADDR
  76. {SO_REUSEADDR, "SO_REUSEADDR"},
  77. #endif
  78. #ifdef SO_REUSEPORT
  79. {SO_REUSEPORT, "SO_REUSEPORT"},
  80. #endif
  81. #ifdef SO_PORT_SCALABILITY
  82. {SO_PORT_SCALABILITY, "SO_PORT_SCALABILITY"},
  83. #endif
  84. #ifdef SO_REUSE_UNICASTPORT
  85. {SO_REUSE_UNICASTPORT, "SO_REUSE_UNICASTPORT"},
  86. #endif
  87. #ifdef SO_KEEPALIVE
  88. {SO_KEEPALIVE, "SO_KEEPALIVE"},
  89. #endif
  90. #ifdef SO_DONTROUTE
  91. {SO_DONTROUTE, "SO_DONTROUTE"},
  92. #endif
  93. {0, NULL}
  94. };
  95. int getopts(const char *s){
  96. int i=0, ret=0;
  97. for(; sockopts[i].optname; i++)if(strstr(s,sockopts[i].optname)) ret |= (1<<i);
  98. return ret;
  99. }
  100. void setopts(SOCKET s, int opts){
  101. int i, opt, set;
  102. for(i = 0; opts >= (opt = (1<<i)); i++){
  103. set = 1;
  104. if(opts & opt) setsockopt(s, *sockopts[i].optname == 'T'? IPPROTO_TCP:SOL_SOCKET, sockopts[i].opt, (char *)&set, sizeof(set));
  105. }
  106. }
  107. #ifndef MODULEMAINFUNC
  108. #define MODULEMAINFUNC main
  109. #define STDMAIN
  110. #ifndef _WINCE
  111. int main (int argc, char** argv){
  112. #else
  113. int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow){
  114. int argc;
  115. char ** argv;
  116. WNDCLASS wc;
  117. HWND hwnd = 0;
  118. #endif
  119. #else
  120. extern int linenum;
  121. extern int haveerror;
  122. int MODULEMAINFUNC (int argc, char** argv){
  123. #endif
  124. SOCKET sock = INVALID_SOCKET, new_sock = INVALID_SOCKET;
  125. int i=0;
  126. SASIZETYPE size;
  127. pthread_t thread;
  128. struct clientparam defparam;
  129. struct srvparam srv;
  130. struct clientparam * newparam;
  131. int error = 0;
  132. unsigned sleeptime;
  133. unsigned char buf[256];
  134. char *hostname=NULL;
  135. int opt = 1, isudp = 0, iscbl = 0, iscbc = 0;
  136. unsigned char *cbc_string = NULL, *cbl_string = NULL;
  137. #ifndef NOIPV6
  138. struct sockaddr_in6 cbsa;
  139. #else
  140. struct sockaddr_in cbsa;
  141. #endif
  142. FILE *fp = NULL;
  143. struct linger lg;
  144. int nlog = 5000;
  145. char loghelp[] =
  146. #ifdef STDMAIN
  147. #ifndef _WIN32
  148. " -I inetd mode (requires real socket, doesn't work with TTY)\n"
  149. " -l@IDENT log to syslog IDENT\n"
  150. #endif
  151. " -d go to background (daemon)\n"
  152. #else
  153. " -u never ask for username\n"
  154. " -u2 always ask for username\n"
  155. #endif
  156. #ifdef WITHSLICE
  157. " -s Use slice() - faster proxing, but no filtering for data\n"
  158. #endif
  159. " -fFORMAT logging format (see documentation)\n"
  160. " -l log to stderr\n"
  161. " -lFILENAME log to FILENAME\n"
  162. " -b(BUFSIZE) size of network buffer (default 4096 for TCP, 16384 for UDP)\n"
  163. " -S(STACKSIZE) value to add to default client thread stack size\n"
  164. " -t be silent (do not log service start/stop)\n"
  165. " -ocOPTIONS, -osOPTIONS, -olOPTIONS - options for client (oc), server (os) or listening (ol) socket,"
  166. " where possible options are: "
  167. #ifdef TCP_NODELAY
  168. "TCP_NODELAY "
  169. #endif
  170. #ifdef TCP_CORK
  171. "TCP_CORK "
  172. #endif
  173. #ifdef TCP_DEFER_ACCEPT
  174. "TCP_DEFER_ACCEPT "
  175. #endif
  176. #ifdef TCP_QUICKACK
  177. "TCP_QUICKACK "
  178. #endif
  179. #ifdef TCP_TIMESTAMPS
  180. "TCP_TIMESTAMPS "
  181. #endif
  182. #ifdef USE_TCP_FASTOPEN
  183. "USE_TCP_FASTOPEN "
  184. #endif
  185. #ifdef SO_REUSEADDR
  186. "SO_REUSEADDR "
  187. #endif
  188. #ifdef SO_REUSEPORT
  189. "SO_REUSEPORT "
  190. #endif
  191. #ifdef SO_PORT_SCALABILITY
  192. "SO_PORT_SCALABILITY "
  193. #endif
  194. #ifdef SO_REUSE_UNICASTPORT
  195. "SO_REUSE_UNICASTPORT "
  196. #endif
  197. #ifdef SO_KEEPALIVE
  198. "SO_KEEPALIVE "
  199. #endif
  200. #ifdef SO_DONTROUTE
  201. "SO_DONTROUTE "
  202. #endif
  203. "\n"
  204. " -iIP ip address or internal interface (clients are expected to connect)\n"
  205. " -eIP ip address or external interface (outgoing connection will have this)\n"
  206. " -rHOST:PORT Use IP:port for connect back proxy instead of listen port\n"
  207. " -RHOST:PORT Use PORT to listen connect back proxy connection to pass data to\n"
  208. " -4 Use IPv4 for outgoing connections\n"
  209. " -6 Use IPv6 for outgoing connections\n"
  210. " -46 Prefer IPv4 for outgoing connections, use both IPv4 and IPv6\n"
  211. " -64 Prefer IPv6 for outgoing connections, use both IPv4 and IPv6\n";
  212. #ifdef _WIN32
  213. unsigned long ul = 1;
  214. #else
  215. pthread_attr_t pa;
  216. #ifdef STDMAIN
  217. int inetd = 0;
  218. #endif
  219. #endif
  220. #ifdef _WIN32
  221. HANDLE h;
  222. #endif
  223. #ifdef STDMAIN
  224. #ifdef _WINCE
  225. argc = ceparseargs((char *)lpCmdLine);
  226. argv = ceargv;
  227. if(FindWindow(lpCmdLine, lpCmdLine)) return 0;
  228. ZeroMemory(&wc,sizeof(wc));
  229. wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  230. wc.hInstance=hInstance;
  231. wc.hCursor=LoadCursor(NULL,IDC_ARROW);
  232. wc.lpfnWndProc=DefWindowProc;
  233. wc.style=CS_HREDRAW|CS_VREDRAW;
  234. wc.lpszClassName=lpCmdLine;
  235. RegisterClass(&wc);
  236. hwnd = CreateWindowEx(WS_EX_TOOLWINDOW,lpCmdLine,lpCmdLine,WS_VISIBLE|WS_POPUP,0,0,0,0,0,0,hInstance,0);
  237. #endif
  238. #ifdef _WIN32
  239. WSADATA wd;
  240. WSAStartup(MAKEWORD( 1, 1 ), &wd);
  241. #else
  242. signal(SIGPIPE, SIG_IGN);
  243. #endif
  244. #endif
  245. srvinit(&srv, &defparam);
  246. srv.pf = childdef.pf;
  247. isudp = childdef.isudp;
  248. srv.service = defparam.service = childdef.service;
  249. #ifndef STDMAIN
  250. srv.acl = copyacl(conf.acl);
  251. srv.authfuncs = copyauth(conf.authfuncs);
  252. if(!conf.services){
  253. conf.services = &srv;
  254. }
  255. else {
  256. srv.next = conf.services;
  257. conf.services = conf.services->prev = &srv;
  258. }
  259. #else
  260. srv.needuser = 0;
  261. pthread_mutex_init(&log_mutex, NULL);
  262. #endif
  263. for (i=1; i<argc; i++) {
  264. if(*argv[i]=='-') {
  265. switch(argv[i][1]) {
  266. case 'd':
  267. if(!conf.demon)daemonize();
  268. conf.demon = 1;
  269. break;
  270. case 'l':
  271. srv.logfunc = logstdout;
  272. if(srv.logtarget) myfree(srv.logtarget);
  273. srv.logtarget = (unsigned char *)mystrdup(argv[i] + 2);
  274. if(argv[i][2]) {
  275. if(argv[i][2]=='@'){
  276. #ifdef STDMAIN
  277. #ifndef _WIN32
  278. openlog(argv[i]+3, LOG_PID, LOG_DAEMON);
  279. srv.logfunc = logsyslog;
  280. #endif
  281. #endif
  282. }
  283. else {
  284. fp = fopen(argv[i] + 2, "a");
  285. if (fp) {
  286. srv.stdlog = fp;
  287. fseek(fp, 0L, SEEK_END);
  288. }
  289. }
  290. }
  291. break;
  292. case 'i':
  293. getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv.intsa);
  294. break;
  295. case 'e':
  296. {
  297. #ifndef NOIPV6
  298. struct sockaddr_in6 sa6;
  299. memset(&sa6, 0, sizeof(sa6));
  300. error = !getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&sa6);
  301. if(!error) {
  302. if (*SAFAMILY(&sa6)==AF_INET) srv.extsa = sa6;
  303. else srv.extsa6 = sa6;
  304. }
  305. #else
  306. error = !getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv.extsa);
  307. #endif
  308. }
  309. break;
  310. case 'p':
  311. *SAPORT(&srv.intsa) = htons(atoi(argv[i]+2));
  312. break;
  313. case '4':
  314. case '6':
  315. srv.family = atoi(argv[i]+1);
  316. break;
  317. case 'b':
  318. srv.bufsize = atoi(argv[i]+2);
  319. break;
  320. case 'n':
  321. srv.usentlm = atoi(argv[i]+2);
  322. break;
  323. #ifdef STDMAIN
  324. #ifndef _WIN32
  325. case 'I':
  326. size = sizeof(defparam.sincl);
  327. if(so._getsockname(0, (struct sockaddr*)&defparam.sincl, &size) ||
  328. *SAFAMILY(&defparam.sincl) != AF_INET) error = 1;
  329. else inetd = 1;
  330. break;
  331. #endif
  332. #endif
  333. case 'f':
  334. if(srv.logformat)myfree(srv.logformat);
  335. srv.logformat = (unsigned char *)mystrdup(argv[i] + 2);
  336. break;
  337. case 't':
  338. srv.silent = 1;
  339. break;
  340. case 'h':
  341. hostname = argv[i] + 2;
  342. break;
  343. case 'r':
  344. cbc_string = (unsigned char *)mystrdup(argv[i] + 2);
  345. iscbc = 1;
  346. break;
  347. case 'R':
  348. cbl_string = (unsigned char *)mystrdup(argv[i] + 2);
  349. iscbl = 1;
  350. break;
  351. case 'u':
  352. srv.needuser = 0;
  353. if(*(argv[i] + 2)) srv.needuser = atoi(argv[i] + 2);
  354. break;
  355. case 'T':
  356. srv.transparent = 1;
  357. break;
  358. case 'S':
  359. srv.stacksize = atoi(argv[i]+2);
  360. break;
  361. case 'a':
  362. srv.anonymous = 1 + atoi(argv[i]+2);
  363. break;
  364. case 's':
  365. if(isudp)
  366. srv.singlepacket = 1 + atoi(argv[i]+2);
  367. #ifdef WITHSPLICE
  368. else
  369. srv.usesplice = 1 + atoi(argv[i]+2);
  370. #endif
  371. break;
  372. case 'o':
  373. if(argv[i][2] == 's'){
  374. srv.srvsockopts = getopts(argv[i]+3);
  375. break;
  376. }
  377. else if(argv[i][2] == 'c'){
  378. srv.clisockopts = getopts(argv[i]+3);
  379. break;
  380. }
  381. else if(argv[i][2] == 'l'){
  382. srv.lissockopts = getopts(argv[i]+3);
  383. break;
  384. }
  385. default:
  386. error = 1;
  387. break;
  388. }
  389. }
  390. else break;
  391. }
  392. #ifndef STDMAIN
  393. if(childdef.port) {
  394. #endif
  395. #ifndef PORTMAP
  396. if (error || i!=argc) {
  397. #ifndef STDMAIN
  398. haveerror = 1;
  399. conf.threadinit = 0;
  400. #endif
  401. fprintf(stderr, "%s of " VERSION " (" BUILDDATE ")\n"
  402. "Usage: %s options\n"
  403. "Available options are:\n"
  404. "%s"
  405. " -pPORT - service port to accept connections\n"
  406. " -RIP:PORT - connect back IP:PORT to listen and accept connections\n"
  407. " -rIP:PORT - connect back IP:PORT to establish connect back connection\n"
  408. "%s"
  409. "\tExample: %s -i127.0.0.1\n\n"
  410. "%s",
  411. argv[0], argv[0], loghelp, childdef.helpmessage, argv[0],
  412. #ifdef STDMAIN
  413. copyright
  414. #else
  415. ""
  416. #endif
  417. );
  418. return (1);
  419. }
  420. #endif
  421. #ifndef STDMAIN
  422. }
  423. else {
  424. #endif
  425. #ifndef NOPORTMAP
  426. 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) {
  427. #ifndef STDMAIN
  428. haveerror = 1;
  429. conf.threadinit = 0;
  430. #endif
  431. fprintf(stderr, "%s of " VERSION " (" BUILDDATE ")\n"
  432. "Usage: %s options"
  433. " [-e<external_ip>] <port_to_bind>"
  434. " <target_hostname> <target_port>\n"
  435. "Available options are:\n"
  436. " -RIP:PORT - connect back IP:PORT to listen and accept connections\n"
  437. " -rIP:PORT - connect back IP:PORT to establish connect back connection\n"
  438. "%s"
  439. "%s"
  440. "\tExample: %s -d -i127.0.0.1 6666 serv.somehost.ru 6666\n\n"
  441. "%s",
  442. argv[0], argv[0], loghelp, childdef.helpmessage, argv[0],
  443. #ifdef STDMAIN
  444. copyright
  445. #else
  446. ""
  447. #endif
  448. );
  449. return (1);
  450. }
  451. srv.target = (unsigned char *)mystrdup(argv[i+1]);
  452. #endif
  453. #ifndef STDMAIN
  454. }
  455. #else
  456. #ifndef _WIN32
  457. if(inetd) {
  458. fcntl(0,F_SETFL,O_NONBLOCK);
  459. if(!isudp){
  460. so._setsockopt(0, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg));
  461. so._setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (unsigned char *)&opt, sizeof(int));
  462. }
  463. defparam.clisock = 0;
  464. if(! (newparam = myalloc (sizeof(defparam)))){
  465. return 2;
  466. };
  467. *newparam = defparam;
  468. return((*srv.pf)((void *)newparam)? 1:0);
  469. }
  470. #endif
  471. #endif
  472. srvinit2(&srv, &defparam);
  473. if(!*SAFAMILY(&srv.intsa)) *SAFAMILY(&srv.intsa) = AF_INET;
  474. if(!*SAPORT(&srv.intsa)) *SAPORT(&srv.intsa) = htons(childdef.port);
  475. *SAFAMILY(&srv.extsa) = AF_INET;
  476. #ifndef NOIPV6
  477. *SAFAMILY(&srv.extsa6) = AF_INET6;
  478. #endif
  479. if(hostname)parsehostname(hostname, &defparam, childdef.port);
  480. #ifndef STDMAIN
  481. copyfilter(conf.filters, &srv);
  482. conf.threadinit = 0;
  483. #endif
  484. if (!iscbc) {
  485. if(srv.srvsock == INVALID_SOCKET){
  486. if(!isudp){
  487. lg.l_onoff = 1;
  488. lg.l_linger = conf.timeouts[STRING_L];
  489. sock=so._socket(SASOCK(&srv.intsa), SOCK_STREAM, IPPROTO_TCP);
  490. }
  491. else {
  492. sock=so._socket(SASOCK(&srv.intsa), SOCK_DGRAM, IPPROTO_UDP);
  493. }
  494. if( sock == INVALID_SOCKET) {
  495. perror("socket()");
  496. return -2;
  497. }
  498. setopts(sock, srv.lissockopts);
  499. #ifdef _WIN32
  500. ioctlsocket(sock, FIONBIO, &ul);
  501. #else
  502. fcntl(sock,F_SETFL,O_NONBLOCK);
  503. #endif
  504. srv.srvsock = sock;
  505. opt = 1;
  506. if(so._setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int)))perror("setsockopt()");
  507. #ifdef SO_REUSEPORT
  508. opt = 1;
  509. so._setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int));
  510. #endif
  511. }
  512. size = sizeof(srv.intsa);
  513. for(sleeptime = SLEEPTIME * 100; so._bind(sock, (struct sockaddr*)&srv.intsa, SASIZE(&srv.intsa))==-1; usleep(sleeptime)) {
  514. sprintf((char *)buf, "bind(): %s", strerror(errno));
  515. if(!srv.silent)(*srv.logfunc)(&defparam, buf);
  516. sleeptime = (sleeptime<<1);
  517. if(!sleeptime) {
  518. so._closesocket(sock);
  519. return -3;
  520. }
  521. }
  522. if(!isudp){
  523. if(so._listen (sock, 1 + (srv.maxchild>>4))==-1) {
  524. sprintf((char *)buf, "listen(): %s", strerror(errno));
  525. if(!srv.silent)(*srv.logfunc)(&defparam, buf);
  526. return -4;
  527. }
  528. }
  529. else
  530. defparam.clisock = sock;
  531. if(!srv.silent && !iscbc){
  532. sprintf((char *)buf, "Accepting connections [%u/%u]", (unsigned)getpid(), (unsigned)pthread_self());
  533. (*srv.logfunc)(&defparam, buf);
  534. }
  535. }
  536. if(iscbl){
  537. parsehost(srv.family, cbl_string, (struct sockaddr *)&cbsa);
  538. if((srv.cbsock=so._socket(SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) {
  539. (*srv.logfunc)(&defparam, (unsigned char *)"Failed to allocate connect back socket");
  540. return -6;
  541. }
  542. opt = 1;
  543. so._setsockopt(srv.cbsock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
  544. #ifdef SO_REUSEPORT
  545. opt = 1;
  546. so._setsockopt(srv.cbsock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int));
  547. #endif
  548. if(so._bind(srv.cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) {
  549. (*srv.logfunc)(&defparam, (unsigned char *)"Failed to bind connect back socket");
  550. return -7;
  551. }
  552. if(so._listen(srv.cbsock, 1 + (srv.maxchild>>4))==-1) {
  553. (*srv.logfunc)(&defparam, (unsigned char *)"Failed to listen connect back socket");
  554. return -8;
  555. }
  556. }
  557. srv.fds.fd = sock;
  558. srv.fds.events = POLLIN;
  559. #ifndef _WIN32
  560. pthread_attr_init(&pa);
  561. pthread_attr_setstacksize(&pa,PTHREAD_STACK_MIN + (16384 + srv.stacksize));
  562. pthread_attr_setdetachstate(&pa,PTHREAD_CREATE_DETACHED);
  563. #endif
  564. for (;;) {
  565. for(;;){
  566. while((conf.paused == srv.paused && srv.childcount >= srv.maxchild)){
  567. nlog++;
  568. if(!srv.silent && nlog > 5000) {
  569. sprintf((char *)buf, "Warning: too many connected clients (%d/%d)", srv.childcount, srv.maxchild);
  570. (*srv.logfunc)(&defparam, buf);
  571. nlog = 0;
  572. }
  573. usleep(SLEEPTIME);
  574. }
  575. if (iscbc) break;
  576. if (conf.paused != srv.paused) break;
  577. if (srv.fds.events & POLLIN) {
  578. error = so._poll(&srv.fds, 1, 1000);
  579. }
  580. else {
  581. usleep(SLEEPTIME);
  582. continue;
  583. }
  584. if (error >= 1) break;
  585. if (error == 0) continue;
  586. if (errno != EAGAIN && errno != EINTR) {
  587. sprintf((char *)buf, "poll(): %s/%d", strerror(errno), errno);
  588. if(!srv.silent)(*srv.logfunc)(&defparam, buf);
  589. break;
  590. }
  591. }
  592. if((conf.paused != srv.paused) || (error < 0)) break;
  593. error = 0;
  594. if(!isudp){
  595. size = sizeof(defparam.sincr);
  596. if(iscbc){
  597. new_sock=so._socket(SASOCK(&defparam.sincr), SOCK_STREAM, IPPROTO_TCP);
  598. if(new_sock != INVALID_SOCKET){
  599. parsehost(srv.family, cbc_string, (struct sockaddr *)&defparam.sincr);
  600. if(connectwithpoll(new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr))) {
  601. so._closesocket(new_sock);
  602. new_sock = INVALID_SOCKET;
  603. usleep(SLEEPTIME);
  604. continue;
  605. }
  606. if(so._recvfrom(new_sock,(char *)buf,1,0,(struct sockaddr*)&defparam.sincr, &size) != 1) {
  607. so._closesocket(new_sock);
  608. new_sock = INVALID_SOCKET;
  609. usleep(SLEEPTIME);
  610. continue;
  611. }
  612. }
  613. else {
  614. usleep(SLEEPTIME);
  615. continue;
  616. }
  617. }
  618. else {
  619. new_sock = so._accept(sock, (struct sockaddr*)&defparam.sincr, &size);
  620. if(new_sock == INVALID_SOCKET){
  621. #ifdef _WIN32
  622. switch(WSAGetLastError()){
  623. case WSAEMFILE:
  624. case WSAENOBUFS:
  625. case WSAENETDOWN:
  626. usleep(SLEEPTIME * 10);
  627. break;
  628. case WSAEINTR:
  629. error = 1;
  630. break;
  631. default:
  632. break;
  633. }
  634. #else
  635. switch (errno){
  636. #ifdef EMFILE
  637. case EMFILE:
  638. #endif
  639. #ifdef ENFILE
  640. case ENFILE:
  641. #endif
  642. #ifdef ENOBUFS
  643. case ENOBUFS:
  644. #endif
  645. #ifdef ENOMEM
  646. case ENOMEM:
  647. #endif
  648. usleep(SLEEPTIME * 10);
  649. break;
  650. default:
  651. break;
  652. }
  653. #endif
  654. nlog++;
  655. if(!srv.silent && (error || nlog > 5000)) {
  656. sprintf((char *)buf, "accept(): %s", strerror(errno));
  657. (*srv.logfunc)(&defparam, buf);
  658. nlog = 0;
  659. }
  660. continue;
  661. }
  662. }
  663. setopts(new_sock, srv.clisockopts);
  664. size = sizeof(defparam.sincl);
  665. if(so._getsockname(new_sock, (struct sockaddr *)&defparam.sincl, &size)){
  666. sprintf((char *)buf, "getsockname(): %s", strerror(errno));
  667. if(!srv.silent)(*srv.logfunc)(&defparam, buf);
  668. continue;
  669. }
  670. #ifdef _WIN32
  671. ioctlsocket(new_sock, FIONBIO, &ul);
  672. #else
  673. fcntl(new_sock,F_SETFL,O_NONBLOCK);
  674. #endif
  675. so._setsockopt(new_sock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
  676. so._setsockopt(new_sock, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int));
  677. }
  678. else {
  679. srv.fds.events = 0;
  680. }
  681. if(! (newparam = myalloc (sizeof(defparam)))){
  682. if(!isudp) so._closesocket(new_sock);
  683. defparam.res = 21;
  684. if(!srv.silent)(*srv.logfunc)(&defparam, (unsigned char *)"Memory Allocation Failed");
  685. usleep(SLEEPTIME);
  686. continue;
  687. };
  688. *newparam = defparam;
  689. if(defparam.hostname)newparam->hostname=(unsigned char *)strdup((char *)defparam.hostname);
  690. clearstat(newparam);
  691. if(!isudp) newparam->clisock = new_sock;
  692. #ifndef STDMAIN
  693. if(makefilters(&srv, newparam) > CONTINUE){
  694. freeparam(newparam);
  695. continue;
  696. }
  697. #endif
  698. newparam->prev = newparam->next = NULL;
  699. pthread_mutex_lock(&srv.counter_mutex);
  700. if(!srv.child){
  701. srv.child = newparam;
  702. }
  703. else {
  704. newparam->next = srv.child;
  705. srv.child = srv.child->prev = newparam;
  706. }
  707. #ifdef _WIN32
  708. #ifndef _WINCE
  709. h = (HANDLE)_beginthreadex((LPSECURITY_ATTRIBUTES )NULL, (unsigned)(16384 + srv.stacksize), (void *)threadfunc, (void *) newparam, 0, &thread);
  710. #else
  711. h = (HANDLE)CreateThread((LPSECURITY_ATTRIBUTES )NULL, (unsigned)(16384 + srv.stacksize), (void *)threadfunc, (void *) newparam, 0, &thread);
  712. #endif
  713. srv.childcount++;
  714. if (h) {
  715. newparam->threadid = (unsigned)thread;
  716. CloseHandle(h);
  717. }
  718. else {
  719. sprintf((char *)buf, "_beginthreadex(): %s", _strerror(NULL));
  720. if(!srv.silent)(*srv.logfunc)(&defparam, buf);
  721. freeparam(newparam);
  722. }
  723. #else
  724. error = pthread_create(&thread, &pa, threadfunc, (void *)newparam);
  725. srv.childcount++;
  726. if(error){
  727. sprintf((char *)buf, "pthread_create(): %s", strerror(error));
  728. if(!srv.silent)(*srv.logfunc)(&defparam, buf);
  729. freeparam(newparam);
  730. }
  731. else {
  732. newparam->threadid = (unsigned)thread;
  733. }
  734. #endif
  735. pthread_mutex_unlock(&srv.counter_mutex);
  736. memset(&defparam.sincl, 0, sizeof(defparam.sincl));
  737. memset(&defparam.sincr, 0, sizeof(defparam.sincr));
  738. if(isudp) while(!srv.fds.events)usleep(SLEEPTIME);
  739. }
  740. if(!srv.silent) srv.logfunc(&defparam, (unsigned char *)"Exiting thread");
  741. if(fp) fclose(fp);
  742. srvfree(&srv);
  743. #ifndef STDMAIN
  744. pthread_mutex_lock(&config_mutex);
  745. if(srv.next)srv.next->prev = srv.prev;
  746. if(srv.prev)srv.prev->next = srv.next;
  747. else conf.services = srv.next;
  748. pthread_mutex_unlock(&config_mutex);
  749. #endif
  750. if(defparam.hostname)myfree(defparam.hostname);
  751. if(cbc_string)myfree(cbc_string);
  752. if(cbl_string)myfree(cbl_string);
  753. return 0;
  754. }
  755. void srvinit(struct srvparam * srv, struct clientparam *param){
  756. memset(srv, 0, sizeof(struct srvparam));
  757. srv->version = conf.version + 1;
  758. srv->paused = conf.paused;
  759. srv->logfunc = conf.logfunc;
  760. srv->noforce = conf.noforce;
  761. if(srv->logformat)myfree(srv->logformat);
  762. srv->logformat = conf.logformat? (unsigned char *)mystrdup((char *)conf.logformat) : NULL;
  763. srv->authfunc = conf.authfunc;
  764. srv->usentlm = 0;
  765. srv->maxchild = conf.maxchild;
  766. srv->stacksize = conf.stacksize;
  767. srv->time_start = time(NULL);
  768. if(conf.logtarget){
  769. if(srv->logtarget) myfree(srv->logtarget);
  770. srv->logtarget = (unsigned char *)mystrdup((char *)conf.logtarget);
  771. }
  772. srv->srvsock = INVALID_SOCKET;
  773. srv->logdumpsrv = conf.logdumpsrv;
  774. srv->logdumpcli = conf.logdumpcli;
  775. srv->cbsock = INVALID_SOCKET;
  776. srv->needuser = 1;
  777. memset(param, 0, sizeof(struct clientparam));
  778. param->srv = srv;
  779. param->version = srv->version;
  780. param->paused = srv->paused;
  781. param->remsock = param->clisock = param->ctrlsock = param->ctrlsocksrv = INVALID_SOCKET;
  782. *SAFAMILY(&param->req) = *SAFAMILY(&param->sinsl) = *SAFAMILY(&param->sinsr) = *SAFAMILY(&param->sincr) = *SAFAMILY(&param->sincl) = AF_INET;
  783. pthread_mutex_init(&srv->counter_mutex, NULL);
  784. srv->intsa = conf.intsa;
  785. srv->extsa = conf.extsa;
  786. #ifndef NOIPV6
  787. srv->extsa6 = conf.extsa6;
  788. #endif
  789. }
  790. void srvinit2(struct srvparam * srv, struct clientparam *param){
  791. if(srv->logformat){
  792. char *s;
  793. if(*srv->logformat == '-' && (s = strchr((char *)srv->logformat + 1, '+')) && s[1]){
  794. unsigned char* logformat = srv->logformat;
  795. *s = 0;
  796. srv->nonprintable = (unsigned char *)mystrdup((char *)srv->logformat + 1);
  797. srv->replace = s[1];
  798. srv->logformat = (unsigned char *)mystrdup(s + 2);
  799. *s = '+';
  800. myfree(logformat);
  801. }
  802. }
  803. memset(&param->sinsl, 0, sizeof(param->sinsl));
  804. memset(&param->sinsr, 0, sizeof(param->sinsr));
  805. memset(&param->req, 0, sizeof(param->req));
  806. *SAFAMILY(&param->sinsl) = AF_INET;
  807. *SAFAMILY(&param->sinsr) = AF_INET;
  808. *SAFAMILY(&param->req) = AF_INET;
  809. param->sincr = param->sincl = srv->intsa;
  810. #ifndef NOIPV6
  811. if (srv->family == 6 || srv->family == 64) param->sinsr = srv->extsa6;
  812. else
  813. #endif
  814. param->sinsr = srv->extsa;
  815. }
  816. void srvfree(struct srvparam * srv){
  817. if(srv->srvsock != INVALID_SOCKET) so._closesocket(srv->srvsock);
  818. srv->srvsock = INVALID_SOCKET;
  819. if(srv->cbsock != INVALID_SOCKET) so._closesocket(srv->cbsock);
  820. srv->cbsock = INVALID_SOCKET;
  821. srv->service = S_ZOMBIE;
  822. while(srv->child) usleep(SLEEPTIME * 100);
  823. #ifndef STDMAIN
  824. if(srv->filter){
  825. while(srv->nfilters){
  826. srv->nfilters--;
  827. if(srv->filter[srv->nfilters].filter_close){
  828. (*srv->filter[srv->nfilters].filter_close)(srv->filter[srv->nfilters].data);
  829. }
  830. }
  831. myfree(srv->filter);
  832. }
  833. if(srv->acl)freeacl(srv->acl);
  834. if(srv->authfuncs)freeauth(srv->authfuncs);
  835. #endif
  836. pthread_mutex_destroy(&srv->counter_mutex);
  837. if(srv->target) myfree(srv->target);
  838. if(srv->logtarget) myfree(srv->logtarget);
  839. if(srv->logformat) myfree(srv->logformat);
  840. if(srv->nonprintable) myfree(srv->nonprintable);
  841. }
  842. void freeparam(struct clientparam * param) {
  843. if(param->res == 2) return;
  844. if(param->datfilterssrv) myfree(param->datfilterssrv);
  845. #ifndef STDMAIN
  846. if(param->reqfilters) myfree(param->reqfilters);
  847. if(param->hdrfilterscli) myfree(param->hdrfilterscli);
  848. if(param->hdrfilterssrv) myfree(param->hdrfilterssrv);
  849. if(param->predatfilters) myfree(param->predatfilters);
  850. if(param->datfilterscli) myfree(param->datfilterscli);
  851. if(param->filters){
  852. if(param->nfilters)while(param->nfilters--){
  853. if(param->filters[param->nfilters].filter->filter_clear)
  854. (*param->filters[param->nfilters].filter->filter_clear)(param->filters[param->nfilters].data);
  855. }
  856. myfree(param->filters);
  857. }
  858. #endif
  859. if(param->clibuf) myfree(param->clibuf);
  860. if(param->srvbuf) myfree(param->srvbuf);
  861. if(param->srv){
  862. pthread_mutex_lock(&param->srv->counter_mutex);
  863. if(param->prev){
  864. param->prev->next = param->next;
  865. }
  866. else
  867. param->srv->child = param->next;
  868. if(param->next){
  869. param->next->prev = param->prev;
  870. }
  871. (param->srv->childcount)--;
  872. pthread_mutex_unlock(&param->srv->counter_mutex);
  873. }
  874. if(param->hostname) myfree(param->hostname);
  875. if(param->username) myfree(param->username);
  876. if(param->password) myfree(param->password);
  877. if(param->extusername) myfree(param->extusername);
  878. if(param->extpassword) myfree(param->extpassword);
  879. if(param->ctrlsocksrv != INVALID_SOCKET && param->ctrlsocksrv != param->remsock) {
  880. so._shutdown(param->ctrlsocksrv, SHUT_RDWR);
  881. so._closesocket(param->ctrlsocksrv);
  882. }
  883. if(param->ctrlsock != INVALID_SOCKET && param->ctrlsock != param->clisock) {
  884. so._shutdown(param->ctrlsock, SHUT_RDWR);
  885. so._closesocket(param->ctrlsock);
  886. }
  887. if(param->remsock != INVALID_SOCKET) {
  888. so._shutdown(param->remsock, SHUT_RDWR);
  889. so._closesocket(param->remsock);
  890. }
  891. if(param->clisock != INVALID_SOCKET) {
  892. so._shutdown(param->clisock, SHUT_RDWR);
  893. so._closesocket(param->clisock);
  894. }
  895. myfree(param);
  896. }
  897. #ifndef STDMAIN
  898. static void * itcopy (void * from, size_t size){
  899. void * ret;
  900. if(!from) return NULL;
  901. ret = myalloc(size);
  902. if(ret) memcpy(ret, from, size);
  903. return ret;
  904. }
  905. struct auth * copyauth (struct auth * authfuncs){
  906. struct auth * newauth = NULL;
  907. newauth = authfuncs = itcopy(authfuncs, sizeof(struct auth));
  908. for( ; authfuncs; authfuncs = authfuncs->next = itcopy(authfuncs->next, sizeof(struct auth)));
  909. return newauth;
  910. }
  911. struct ace * copyacl (struct ace *ac){
  912. struct ace * ret = NULL;
  913. struct iplist *ipl;
  914. struct portlist *pl;
  915. struct userlist *ul;
  916. struct chain *ch;
  917. struct period *pel;
  918. struct hostname *hst;
  919. ret = ac = itcopy(ac, sizeof(struct ace));
  920. for( ; ac; ac = ac->next = itcopy(ac->next, sizeof(struct ace))){
  921. ac->src = itcopy(ac->src, sizeof(struct iplist));
  922. for(ipl = ac->src; ipl; ipl = ipl->next = itcopy(ipl->next, sizeof(struct iplist)));
  923. ac->dst = itcopy(ac->dst, sizeof(struct iplist));
  924. for(ipl = ac->dst; ipl; ipl = ipl->next = itcopy(ipl->next, sizeof(struct iplist)));
  925. ac->ports = itcopy(ac->ports, sizeof(struct portlist));
  926. for(pl = ac->ports; pl; pl = pl->next = itcopy(pl->next, sizeof(struct portlist)));
  927. ac->periods = itcopy(ac->periods, sizeof(struct period));
  928. for(pel = ac->periods; pel; pel = pel->next = itcopy(pel->next, sizeof(struct period)));
  929. ac->users = itcopy(ac->users, sizeof(struct userlist));
  930. for(ul = ac->users; ul; ul = ul->next = itcopy(ul->next, sizeof(struct userlist))){
  931. if(ul->user) ul->user = (unsigned char*)mystrdup((char *)ul->user);
  932. }
  933. ac->dstnames = itcopy(ac->dstnames, sizeof(struct hostname));
  934. for(hst = ac->dstnames; hst; hst = hst->next = itcopy(hst->next, sizeof(struct hostname))){
  935. if(hst->name) hst->name = (unsigned char*)mystrdup((char *)hst->name);
  936. }
  937. ac->chains = itcopy(ac->chains, sizeof(struct chain));
  938. for(ch = ac->chains; ch; ch = ch->next = itcopy(ch->next, sizeof(struct chain))){
  939. if(ch->extuser)ch->extuser = (unsigned char*)mystrdup((char *)ch->extuser);
  940. if(ch->extpass)ch->extpass = (unsigned char*)mystrdup((char *)ch->extpass);
  941. if(ch->exthost)ch->exthost = (unsigned char*)mystrdup((char *)ch->exthost);
  942. }
  943. }
  944. return ret;
  945. }
  946. void copyfilter (struct filter *filter, struct srvparam *srv){
  947. int nfilters = 0;
  948. if(!filter) return;
  949. for(srv->filter = filter; srv->filter; srv->filter = srv->filter->next) nfilters++;
  950. srv->filter = myalloc(sizeof(struct filter) * nfilters);
  951. if(!srv->filter) return;
  952. for(; filter; filter = filter->next){
  953. void *data = NULL;
  954. if(!filter->filter_open || !(data = (*filter->filter_open)(filter->data, srv))) continue;
  955. srv->filter[srv->nfilters] = *filter;
  956. srv->filter[srv->nfilters].data = data;
  957. if(srv->nfilters>0)srv->filter[srv->nfilters - 1].next = srv->filter + srv->nfilters;
  958. srv->nfilters++;
  959. if(filter->filter_request)srv->nreqfilters++;
  960. if(filter->filter_header_srv)srv->nhdrfilterssrv++;
  961. if(filter->filter_header_cli)srv->nhdrfilterscli++;
  962. if(filter->filter_predata)srv->npredatfilters++;
  963. if(filter->filter_data_srv)srv->ndatfilterssrv++;
  964. if(filter->filter_data_cli)srv->ndatfilterscli++;
  965. }
  966. }
  967. FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param){
  968. FILTER_ACTION res=PASS;
  969. FILTER_ACTION action;
  970. int i;
  971. if(!srv->nfilters) return PASS;
  972. if(!(param->filters = myalloc(sizeof(struct filterp) * srv->nfilters)) ||
  973. (srv->nreqfilters && !(param->reqfilters = myalloc(sizeof(struct filterp *) * srv->nreqfilters))) ||
  974. (srv->nhdrfilterssrv && !(param->hdrfilterssrv = myalloc(sizeof(struct filterp *) * srv->nhdrfilterssrv))) ||
  975. (srv->nhdrfilterscli && !(param->hdrfilterscli = myalloc(sizeof(struct filterp *) * srv->nhdrfilterscli))) ||
  976. (srv->npredatfilters && !(param->predatfilters = myalloc(sizeof(struct filterp *) * srv->npredatfilters))) ||
  977. (srv->ndatfilterssrv && !(param->datfilterssrv = myalloc(sizeof(struct filterp *) * srv->ndatfilterssrv))) ||
  978. (srv->ndatfilterscli && !(param->datfilterscli = myalloc(sizeof(struct filterp *) * srv->ndatfilterscli)))
  979. ){
  980. param->res = 21;
  981. return REJECT;
  982. }
  983. for(i=0; i<srv->nfilters; i++){
  984. if(!srv->filter[i].filter_client)continue;
  985. action = (*srv->filter[i].filter_client)(srv->filter[i].data, param, &param->filters[param->nfilters].data);
  986. if(action == PASS) continue;
  987. if(action > CONTINUE) return action;
  988. param->filters[param->nfilters].filter = srv->filter + i;
  989. if(srv->filter[i].filter_request)param->reqfilters[param->nreqfilters++] = param->filters + param->nfilters;
  990. if(srv->filter[i].filter_header_cli)param->hdrfilterscli[param->nhdrfilterscli++] = param->filters + param->nfilters;
  991. if(srv->filter[i].filter_header_srv)param->hdrfilterssrv[param->nhdrfilterssrv++] = param->filters + param->nfilters;
  992. if(srv->filter[i].filter_predata)param->predatfilters[param->npredatfilters++] = param->filters + param->nfilters;
  993. if(srv->filter[i].filter_data_cli)param->datfilterscli[param->ndatfilterscli++] = param->filters + param->nfilters;
  994. if(srv->filter[i].filter_data_srv)param->datfilterssrv[param->ndatfilterssrv++] = param->filters + param->nfilters;
  995. param->nfilters++;
  996. }
  997. return res;
  998. }
  999. void * itfree(void *data, void * retval){
  1000. myfree(data);
  1001. return retval;
  1002. }
  1003. void freeauth(struct auth * authfuncs){
  1004. for(; authfuncs; authfuncs = (struct auth *)itfree(authfuncs, authfuncs->next));
  1005. }
  1006. void freeacl(struct ace *ac){
  1007. struct iplist *ipl;
  1008. struct portlist *pl;
  1009. struct userlist *ul;
  1010. struct chain *ch;
  1011. struct period *pel;
  1012. struct hostname *hst;
  1013. for(; ac; ac = (struct ace *) itfree(ac, ac->next)){
  1014. for(ipl = ac->src; ipl; ipl = (struct iplist *)itfree(ipl, ipl->next));
  1015. for(ipl = ac->dst; ipl; ipl = (struct iplist *)itfree(ipl,ipl->next));
  1016. for(pl = ac->ports; pl; pl = (struct portlist *)itfree(pl, pl->next));
  1017. for(pel = ac->periods; pel; pel = (struct period *)itfree(pel, pel->next));
  1018. for(ul = ac->users; ul; ul = (struct userlist *)itfree(ul, ul->next)){
  1019. if(ul->user)myfree(ul->user);
  1020. }
  1021. for(hst = ac->dstnames; hst; hst = (struct hostname *)itfree(hst, hst->next)){
  1022. if(hst->name)myfree(hst->name);
  1023. }
  1024. for(ch = ac->chains; ch; ch = (struct chain *) itfree(ch, ch->next)){
  1025. if(ch->extuser) myfree(ch->extuser);
  1026. if(ch->extpass) myfree(ch->extpass);
  1027. if(ch->exthost) myfree(ch->exthost);
  1028. }
  1029. }
  1030. }
  1031. FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
  1032. FILTER_ACTION action;
  1033. int i;
  1034. for(i=0; i<param->nreqfilters; i++){
  1035. action = (*param->reqfilters[i]->filter->filter_request)(param->reqfilters[i]->data, param, buf_p, bufsize_p, offset, length_p);
  1036. if(action!=CONTINUE) return action;
  1037. }
  1038. return PASS;
  1039. }
  1040. FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
  1041. FILTER_ACTION action;
  1042. int i;
  1043. for(i=0; i<param->nhdrfilterssrv; i++){
  1044. action = (*param->hdrfilterssrv[i]->filter->filter_header_srv)(param->hdrfilterssrv[i]->data, param, buf_p, bufsize_p, offset, length_p);
  1045. if(action!=CONTINUE) return action;
  1046. }
  1047. return PASS;
  1048. }
  1049. FILTER_ACTION handlehdrfilterscli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
  1050. FILTER_ACTION action;
  1051. int i;
  1052. for(i = 0; i < param->nhdrfilterscli; i++){
  1053. action = (*param->hdrfilterscli[i]->filter->filter_header_cli)(param->hdrfilterscli[i]->data, param, buf_p, bufsize_p, offset, length_p);
  1054. if(action!=CONTINUE) return action;
  1055. }
  1056. return PASS;
  1057. }
  1058. #endif
  1059. FILTER_ACTION handlepredatflt(struct clientparam *cparam){
  1060. #ifndef STDMAIN
  1061. FILTER_ACTION action;
  1062. int i;
  1063. for(i=0; i<cparam->npredatfilters ;i++){
  1064. action = (*cparam->predatfilters[i]->filter->filter_predata)(cparam->predatfilters[i]->data, cparam);
  1065. if(action!=CONTINUE) return action;
  1066. }
  1067. #endif
  1068. return PASS;
  1069. }
  1070. FILTER_ACTION handledatfltcli(struct clientparam *cparam, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
  1071. #ifndef STDMAIN
  1072. FILTER_ACTION action;
  1073. int i;
  1074. for(i=0; i<cparam->ndatfilterscli ;i++){
  1075. action = (*cparam->datfilterscli[i]->filter->filter_data_cli)(cparam->datfilterscli[i]->data, cparam, buf_p, bufsize_p, offset, length_p);
  1076. if(action!=CONTINUE) return action;
  1077. }
  1078. #endif
  1079. return PASS;
  1080. }
  1081. FILTER_ACTION handledatfltsrv(struct clientparam *cparam, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
  1082. FILTER_ACTION action;
  1083. int i;
  1084. for(i=0; i<cparam->ndatfilterssrv; i++){
  1085. action = (*cparam->datfilterssrv[i]->filter->filter_data_srv)(cparam->datfilterssrv[i]->data, cparam, buf_p, bufsize_p, offset, length_p);
  1086. if(action!=CONTINUE) return action;
  1087. }
  1088. return PASS;
  1089. }