proxymain.c 34 KB

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