proxymain.c 29 KB

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