proxymain.c 30 KB

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