proxymain.c 35 KB

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