common.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. /*
  2. 3APA3A simpliest proxy server
  3. (c) 2002-2021 by Vladimir Dubrovin <3proxy@3proxy.org>
  4. please read License Agreement
  5. */
  6. #include "proxy.h"
  7. char * copyright = COPYRIGHT;
  8. int randomizer = 1;
  9. #ifndef _WIN32
  10. pthread_attr_t pa;
  11. void daemonize(void){
  12. if(fork() > 0) {
  13. usleep(SLEEPTIME);
  14. _exit(0);
  15. }
  16. setsid();
  17. }
  18. #endif
  19. unsigned char **stringtable = NULL;
  20. #ifdef WITH_LINUX_FUTEX
  21. int sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3)
  22. {
  23. return syscall(SYS_futex, addr1, op, val1, timeout, addr2, val3);
  24. }
  25. int mutex_lock(int *val)
  26. {
  27. int c;
  28. if ((c = __sync_val_compare_and_swap(val, 0, 1)) != 0)
  29. do {
  30. if(c == 2 || __sync_val_compare_and_swap(val, 1, 2) != 0)
  31. sys_futex(val, FUTEX_WAIT_PRIVATE, 2, NULL, NULL, 0);
  32. } while ((c = __sync_val_compare_and_swap(val, 0, 2)) != 0);
  33. return 0;
  34. }
  35. int mutex_unlock(int *val)
  36. {
  37. if(__sync_fetch_and_sub (val, 1) != 1){
  38. *val = 0;
  39. sys_futex(val, FUTEX_WAKE_PRIVATE, 1, NULL, NULL, 0);
  40. }
  41. return 0;
  42. }
  43. #endif
  44. int myinet_ntop(int af, void *src, char *dst, socklen_t size){
  45. #ifndef NOIPV6
  46. if(af != AF_INET6){
  47. #endif
  48. unsigned u = ntohl(((struct in_addr *)src)->s_addr);
  49. return sprintf(dst, "%u.%u.%u.%u",
  50. ((u&0xFF000000)>>24),
  51. ((u&0x00FF0000)>>16),
  52. ((u&0x0000FF00)>>8),
  53. ((u&0x000000FF)));
  54. #ifndef NOIPV6
  55. }
  56. *dst = 0;
  57. inet_ntop(af, src, dst, size);
  58. return (int)strlen(dst);
  59. #endif
  60. }
  61. char *rotations[] = {
  62. "",
  63. "/min",
  64. "/hour",
  65. "/day",
  66. "/week",
  67. "/month",
  68. "/year",
  69. "",
  70. };
  71. struct extparam conf = {
  72. {1, 5, 30, 60, 180, 1800, 15, 60, 15, 5, 0, 0},
  73. NULL,
  74. NULL,
  75. NULL, NULL,
  76. NULL,
  77. NULL,
  78. NULL,
  79. 0,
  80. 0, -1, 0, 0, 0, 0,
  81. 0, 500, 0, 0, 0, 0, 0, 2,
  82. 6, 600,
  83. 1048576,
  84. NULL, NULL,
  85. NONE, NONE,
  86. NULL,
  87. #ifndef NOIPV6
  88. {AF_INET},{AF_INET6},{AF_INET},
  89. #else
  90. {AF_INET},{AF_INET},
  91. #endif
  92. NULL,
  93. NULL,
  94. doconnect,
  95. lognone,
  96. NULL,
  97. NULL,
  98. NULL, NULL,
  99. NULL,
  100. NULL,
  101. NULL,
  102. NULL,
  103. NULL,
  104. NULL,
  105. (time_t)0, (time_t)0,
  106. 0,0,
  107. '@',
  108. };
  109. int numservers=0;
  110. char* NULLADDR="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
  111. int myrand(void * entropy, int len){
  112. int i;
  113. uint16_t init;
  114. init = randomizer;
  115. for(i=0; i < len/2; i++){
  116. init ^= ((uint16_t *)entropy)[i];
  117. }
  118. srand(rand()+init);
  119. randomizer = rand();
  120. return rand();
  121. }
  122. #ifndef WITH_POLL
  123. #ifndef WITH_WSAPOLL
  124. int
  125. #ifdef _WIN32
  126. WINAPI
  127. #endif
  128. mypoll(struct mypollfd *fds, unsigned int nfds, int timeout){
  129. fd_set readfd;
  130. fd_set writefd;
  131. fd_set oobfd;
  132. struct timeval tv;
  133. unsigned i;
  134. int num;
  135. SOCKET maxfd = 0;
  136. tv.tv_sec = timeout/1000;
  137. tv.tv_usec = (timeout%1000)*1000;
  138. FD_ZERO(&readfd);
  139. FD_ZERO(&writefd);
  140. FD_ZERO(&oobfd);
  141. for(i=0; i<nfds; i++){
  142. if((fds[i].events&POLLIN))FD_SET(fds[i].fd, &readfd);
  143. if((fds[i].events&POLLOUT))FD_SET(fds[i].fd, &writefd);
  144. if((fds[i].events&POLLPRI))FD_SET(fds[i].fd, &oobfd);
  145. fds[i].revents = 0;
  146. if(fds[i].fd > maxfd) maxfd = fds[i].fd;
  147. }
  148. if((num = select(((int)(maxfd))+1, &readfd, &writefd, &oobfd, &tv)) < 1) return num;
  149. for(i=0; i<nfds; i++){
  150. if(FD_ISSET(fds[i].fd, &readfd)) fds[i].revents |= POLLIN;
  151. if(FD_ISSET(fds[i].fd, &writefd)) fds[i].revents |= POLLOUT;
  152. if(FD_ISSET(fds[i].fd, &oobfd)) fds[i].revents |= POLLPRI;
  153. }
  154. return num;
  155. }
  156. #endif
  157. #endif
  158. struct sockfuncs so = {
  159. socket,
  160. accept,
  161. bind,
  162. listen,
  163. connect,
  164. getpeername,
  165. getsockname,
  166. getsockopt,
  167. setsockopt,
  168. #ifndef WITH_POLL
  169. #ifndef WITH_WSAPOLL
  170. mypoll,
  171. #else
  172. WSAPoll,
  173. #endif
  174. #else
  175. poll,
  176. #endif
  177. (void *)send,
  178. (void *)sendto,
  179. (void *)recv,
  180. (void *)recvfrom,
  181. shutdown,
  182. #ifdef _WIN32
  183. closesocket
  184. #else
  185. close
  186. #endif
  187. };
  188. #ifdef _WINCE
  189. static char cebuf[1024];
  190. static char ceargbuf[256];
  191. char * ceargv[32];
  192. char * CEToUnicode (const char *str){
  193. int i;
  194. for(i=0; i<510 && str[i]; i++){
  195. cebuf[(i*2)] = str[i];
  196. cebuf[(i*2)+1] = 0;
  197. }
  198. cebuf[(i*2)] = 0;
  199. cebuf[(i*2)+1] = 0;
  200. return cebuf;
  201. };
  202. int cesystem(const char *str){
  203. STARTUPINFO startupInfo = {0};
  204. startupInfo.cb = sizeof(startupInfo);
  205. PROCESS_INFORMATION processInformation;
  206. return CreateProcessW((LPWSTR)CEToUnicode(str), NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInformation);
  207. }
  208. int ceparseargs(const char *str){
  209. int argc = 0, i;
  210. int space = 1;
  211. for(i=0; i<250 && argc<30 && str[2*i]; i++){
  212. ceargbuf[i] = str[2*i];
  213. if(space && ceargbuf[i]!=' '&& ceargbuf[i]!='\t'&& ceargbuf[i]!='\r'&& ceargbuf[i]!='\n'){
  214. ceargv[argc++] = ceargbuf + i;
  215. space = 0;
  216. }
  217. else if(!space && (ceargbuf[i]==' ' || ceargbuf[i]=='\t' || ceargbuf[i]=='\r' || ceargbuf[i]=='\n')){
  218. ceargbuf[i] = 0;
  219. space = 1;
  220. }
  221. }
  222. return argc;
  223. }
  224. #endif
  225. int parsehost(int family, unsigned char *host, struct sockaddr *sa){
  226. char *sp=NULL,*se=NULL;
  227. unsigned short port=0;
  228. int ret = 0;
  229. if(!host) return 2;
  230. if(*host == '[') se=strchr((char *)host, ']');
  231. if ( (sp = strchr(se?se:(char *)host, ':')) && !strchr(sp+1, ':')) *sp = 0;
  232. if(se){
  233. *se = 0;
  234. }
  235. if(sp){
  236. port = atoi(sp+1);
  237. }
  238. ret = !getip46(family, host + (se!=0), (struct sockaddr *)sa);
  239. if(se) *se = ']';
  240. if(sp) *sp = ':';
  241. if(port)*SAPORT(sa) = htons(port);
  242. return ret;
  243. }
  244. int parsehostname(char *hostname, struct clientparam *param, unsigned short port){
  245. char *sp=NULL,*se=NULL;
  246. int ret = 0;
  247. if(!hostname || !*hostname)return 2;
  248. if(*hostname == '[') se=strchr(hostname, ']');
  249. if ((sp = strchr(se?se:hostname, ':'))) {
  250. if(strchr(sp+1, ':'))sp = NULL;
  251. else *sp = 0;
  252. }
  253. if(se){
  254. *se = 0;
  255. }
  256. if(hostname != (char *)param->hostname){
  257. if(param->hostname) myfree(param->hostname);
  258. param->hostname = (unsigned char *)mystrdup(hostname + (se!=0));
  259. }
  260. if(sp){
  261. port = atoi(sp+1);
  262. }
  263. ret = !getip46(param->srv->family, param->hostname, (struct sockaddr *)&param->req);
  264. if(se) *se = ']';
  265. if(sp) *sp = ':';
  266. *SAPORT(&param->req) = htons(port);
  267. memset(&param->sinsr, 0, sizeof(param->sinsr));
  268. return ret;
  269. }
  270. int parseusername(char *username, struct clientparam *param, int extpasswd){
  271. char *sb = NULL, *se = NULL, *sp = NULL;
  272. if(!username || !*username) return 1;
  273. if(param->srv->needuser && (sb = strchr(username, ':')) && (se = strchr(sb + 1, ':')) && (!extpasswd || (sp = strchr(se + 1, ':')))){
  274. *sb = 0;
  275. *se = 0;
  276. if(sp) *sp = 0;
  277. if(*(sb+1)) {
  278. if(param->password) myfree(param->password);
  279. param->password = (unsigned char *)mystrdup(sb+1);
  280. }
  281. if(*username) {
  282. if(param->username) myfree(param->username);
  283. param->username = (unsigned char *)mystrdup(username);
  284. }
  285. username = se+1;
  286. }
  287. if(extpasswd){
  288. if(!sp) sp = strchr(username, ':');
  289. if(sp){
  290. *sp = 0;
  291. if(param->extpassword) myfree(param->extpassword);
  292. param->extpassword = (unsigned char *) mystrdup(sp+1);
  293. }
  294. }
  295. if(param->extusername) myfree(param->extusername);
  296. param->extusername = (unsigned char *)mystrdup(username);
  297. if(sb) *sb = ':';
  298. if(se) *se = ':';
  299. if(sp) *sp = ':';
  300. return 0;
  301. }
  302. int parseconnusername(char *username, struct clientparam *param, int extpasswd, unsigned short port){
  303. char *sb, *se;
  304. if(!username || !*username) return 1;
  305. if ((sb=strchr(username, conf.delimchar)) == NULL){
  306. if(!param->hostname && param->remsock == INVALID_SOCKET) return 2;
  307. if(param->hostname)parsehostname((char *)param->hostname, param, port);
  308. return parseusername(username, param, extpasswd);
  309. }
  310. while ((se=strchr(sb+1, conf.delimchar)))sb=se;
  311. *(sb) = 0;
  312. if(parseusername(username, param, extpasswd)) return 3;
  313. *(sb) = conf.delimchar;
  314. if(parsehostname(sb+1, param, port)) return 4;
  315. return 0;
  316. }
  317. int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to){
  318. struct pollfd fds[1];
  319. #ifdef _WIN32
  320. unsigned long ul = 1;
  321. ioctlsocket(sock, FIONBIO, &ul);
  322. #else
  323. fcntl(sock,F_SETFL, O_NONBLOCK | fcntl(sock,F_GETFL));
  324. #endif
  325. if(so._connect(sock,sa,size)) {
  326. if(errno != EAGAIN && errno != EINPROGRESS) return (13);
  327. }
  328. memset(fds, 0, sizeof(fds));
  329. fds[0].fd = sock;
  330. fds[0].events = POLLOUT;
  331. if(so._poll(fds, 1, to*1000) <= 0) {
  332. return (13);
  333. }
  334. return 0;
  335. }
  336. int doconnect(struct clientparam * param){
  337. SASIZETYPE size;
  338. if (*SAFAMILY(&param->sincl) == *SAFAMILY(&param->req) && !memcmp(SAADDR(&param->sincl), SAADDR(&param->req), SAADDRLEN(&param->req)) &&
  339. *SAPORT(&param->sincl) == *SAPORT(&param->req)) return 519;
  340. if (param->operation == ADMIN || param->operation == DNSRESOLVE || param->operation == BIND || param->operation == UDPASSOC)
  341. return 0;
  342. if (param->remsock != INVALID_SOCKET){
  343. size = sizeof(param->sinsr);
  344. if(so._getpeername(param->remsock, (struct sockaddr *)&param->sinsr, &size)==-1) {return (14);}
  345. }
  346. else {
  347. struct linger lg = {1,conf.timeouts[SINGLEBYTE_S]};
  348. if(SAISNULL(&param->sinsr)){
  349. if(SAISNULL(&param->req)) {
  350. return 100;
  351. }
  352. *SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req);
  353. memcpy(SAADDR(&param->sinsr), SAADDR(&param->req), SAADDRLEN(&param->req));
  354. }
  355. if(!*SAPORT(&param->sinsr))*SAPORT(&param->sinsr) = *SAPORT(&param->req);
  356. if ((param->remsock=so._socket(SASOCK(&param->sinsr), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);}
  357. setopts(param->remsock, param->srv->srvsockopts);
  358. so._setsockopt(param->remsock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
  359. #ifdef REUSE
  360. {
  361. int opt;
  362. #ifdef SO_REUSEADDR
  363. opt = 1;
  364. so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
  365. #endif
  366. #ifdef SO_REUSEPORT
  367. opt = 1;
  368. so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
  369. #endif
  370. }
  371. #endif
  372. #ifdef SO_BINDTODEVICE
  373. if(param->srv->obindtodevice) {
  374. if(so._setsockopt(param->remsock, SOL_SOCKET, SO_BINDTODEVICE, param->srv->obindtodevice, strlen(param->srv->obindtodevice) + 1))
  375. return 12;
  376. }
  377. #endif
  378. if(SAISNULL(&param->sinsl)){
  379. #ifndef NOIPV6
  380. if(*SAFAMILY(&param->sinsr) == AF_INET6) param->sinsl = param->srv->extsa6;
  381. else
  382. #endif
  383. param->sinsl = param->srv->extsa;
  384. }
  385. *SAPORT(&param->sinsl) = 0;
  386. if(so._bind(param->remsock, (struct sockaddr*)&param->sinsl, SASIZE(&param->sinsl))==-1) {
  387. return 12;
  388. }
  389. if(param->operation >= 256 || (param->operation & CONNECT)){
  390. if(connectwithpoll(param->remsock,(struct sockaddr *)&param->sinsr,SASIZE(&param->sinsr),CONNECT_TO)) {
  391. return 13;
  392. }
  393. }
  394. size = sizeof(param->sinsl);
  395. if(so._getsockname(param->remsock, (struct sockaddr *)&param->sinsl, &size)==-1) {return (15);}
  396. }
  397. return 0;
  398. }
  399. int scanaddr(const unsigned char *s, unsigned long * ip, unsigned long * mask) {
  400. unsigned d1, d2, d3, d4, m;
  401. int res;
  402. if ((res = sscanf((char *)s, "%u.%u.%u.%u/%u", &d1, &d2, &d3, &d4, &m)) < 4) return 0;
  403. if(mask && res == 4) *mask = 0xFFFFFFFF;
  404. else if (mask) *mask = htonl(0xFFFFFFFF << (32 - m));
  405. *ip = htonl ((d1<<24) ^ (d2<<16) ^ (d3<<8) ^ d4);
  406. return res;
  407. }
  408. RESOLVFUNC resolvfunc = NULL;
  409. #ifndef _WIN32
  410. pthread_mutex_t gethostbyname_mutex;
  411. int ghbn_init = 0;
  412. #endif
  413. #ifdef GETHOSTBYNAME_R
  414. struct hostent * my_gethostbyname(char *name, char *buf, struct hostent *hp){
  415. struct hostent *result;
  416. int gherrno;
  417. #ifdef _SOLARIS
  418. return gethostbyname_r(name, hp, buf, 1024, &gherrno);
  419. #else
  420. if(gethostbyname_r(name, hp, buf, 1024, &result, &gherrno) != 0)
  421. return NULL;
  422. return result;
  423. #endif
  424. }
  425. #endif
  426. #ifdef NOIPV6
  427. unsigned long getip(unsigned char *name){
  428. unsigned long retval;
  429. int i;
  430. int ndots = 0;
  431. struct hostent *hp=NULL;
  432. RESOLVFUNC tmpresolv;
  433. #ifdef GETHOSTBYNAME_R
  434. struct hostent he;
  435. char ghbuf[1024];
  436. #define gethostbyname(NAME) my_gethostbyname(NAME, ghbuf, &he)
  437. #endif
  438. if(strlen((char *)name)>255)name[255] = 0;
  439. for(i=0; name[i]; i++){
  440. if(name[i] == '.'){
  441. if(++ndots > 3) break;
  442. continue;
  443. }
  444. if(name[i] <'0' || name[i] >'9') break;
  445. }
  446. if(!name[i] && ndots == 3){
  447. if(scanaddr(name, &retval, NULL) == 4){
  448. return retval;
  449. }
  450. }
  451. if((tmpresolv=resolvfunc)){
  452. if((*tmpresolv)(AF_INET, name, (unsigned char *)&retval)) return retval;
  453. if(conf.demanddialprog) system(conf.demanddialprog);
  454. return (*tmpresolv)(AF_INET, name, (unsigned char *)&retval)?retval:0;
  455. }
  456. #if !defined(_WIN32) && !defined(GETHOSTBYNAME_R)
  457. if(!ghbn_init){
  458. pthread_mutex_init(&gethostbyname_mutex, NULL);
  459. ghbn_init++;
  460. }
  461. pthread_mutex_lock(&gethostbyname_mutex);
  462. #endif
  463. hp=gethostbyname((char *)name);
  464. if (!hp && conf.demanddialprog) {
  465. system(conf.demanddialprog);
  466. hp=gethostbyname((char *)name);
  467. }
  468. retval = hp?*(unsigned long *)hp->h_addr:0;
  469. #if !defined(_WIN32) && !defined(GETHOSTBYNAME_R)
  470. pthread_mutex_unlock(&gethostbyname_mutex);
  471. #endif
  472. #ifdef GETHOSTBYNAME_R
  473. #undef gethostbyname
  474. #endif
  475. return retval;
  476. }
  477. #endif
  478. int afdetect(unsigned char *name){
  479. int ndots=0, ncols=0, nhex=0;
  480. int i;
  481. for(i=0; name[i]; i++){
  482. if(name[i] == '.'){
  483. if(++ndots > 3) {
  484. return -1;
  485. }
  486. }
  487. else if(name[i] == ':'){
  488. if(++ncols > 7) {
  489. return -1;
  490. }
  491. }
  492. else if(name[i] == '%' || (name[i] >= 'a' && name[i] <= 'f') || (name[i] >= 'A' && name[i] <= 'F')){
  493. nhex++;
  494. }
  495. else if(name[i] <'0' || name[i] >'9') {
  496. return -1;
  497. }
  498. }
  499. if(ndots == 3 && ncols == 0 && nhex == 0){
  500. return AF_INET;
  501. }
  502. if(ncols >= 2) {
  503. return AF_INET6;
  504. }
  505. return -1;
  506. }
  507. unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){
  508. #ifndef NOIPV6
  509. int detect;
  510. struct addrinfo *ai, hint;
  511. RESOLVFUNC tmpresolv;
  512. if(!sa) return 0;
  513. if(!family) {
  514. family = 4;
  515. #else
  516. ((struct sockaddr_in *)sa)->sin_family = AF_INET;
  517. return (((struct sockaddr_in *)sa)->sin_addr.s_addr = getip(name))? AF_INET:0;
  518. #endif
  519. #ifndef NOIPV6
  520. }
  521. detect = afdetect(name);
  522. if(detect != -1){
  523. if(family == 4 && detect != AF_INET) return 0;
  524. *SAFAMILY(sa) = (family == 6)? AF_INET6 : detect;
  525. return inet_pton(*SAFAMILY(sa), (char *)name, SAADDR(sa))? *SAFAMILY(sa) : 0;
  526. }
  527. if((tmpresolv = resolvfunc)){
  528. int f = (family == 6 || family == 64)?AF_INET6:AF_INET;
  529. *SAFAMILY(sa) = f;
  530. if(tmpresolv(f, name, SAADDR(sa))) return f;
  531. if(family == 4 || family == 6) return 0;
  532. f = (family == 46)? AF_INET6 : AF_INET;
  533. *SAFAMILY(sa) = f;
  534. if(tmpresolv(f, name, SAADDR(sa))) return f;
  535. return 0;
  536. }
  537. memset(&hint, 0, sizeof(hint));
  538. hint.ai_family = (family == 6 || family == 64)?AF_INET6:AF_INET;
  539. if (getaddrinfo((char *)name, NULL, &hint, &ai)) {
  540. if(family == 64 || family == 46){
  541. hint.ai_family = (family == 64)?AF_INET:AF_INET6;
  542. if (getaddrinfo((char *)name, NULL, &hint, &ai)) return 0;
  543. }
  544. else return 0;
  545. }
  546. if(ai){
  547. if(ai->ai_addr->sa_family == AF_INET || ai->ai_addr->sa_family == AF_INET6){
  548. *SAFAMILY(sa)=ai->ai_addr->sa_family;
  549. memcpy(SAADDR(sa), SAADDR(ai->ai_addr), SAADDRLEN(ai->ai_addr));
  550. freeaddrinfo(ai);
  551. return *SAFAMILY(sa);
  552. }
  553. freeaddrinfo(ai);
  554. }
  555. return 0;
  556. #endif
  557. }