structures.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. /*
  2. 3APA3A simpliest proxy server
  3. (c) 2002-2016 by Vladimir Dubrovin <3proxy@3proxy.ru>
  4. please read License Agreement
  5. */
  6. #ifndef _STRUCTURES_H_
  7. #define _STRUCTURES_H_
  8. #include <time.h>
  9. #include <stdio.h>
  10. #include <fcntl.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <stdint.h>
  14. #include <inttypes.h>
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. #ifndef _WIN32
  19. #include <sys/socket.h>
  20. #include <netinet/in.h>
  21. #include <netinet/ip.h>
  22. #include <netinet/tcp.h>
  23. #include <arpa/inet.h>
  24. #include <netdb.h>
  25. #include <pthread.h>
  26. #define SASIZETYPE socklen_t
  27. #define SOCKET int
  28. #define INVALID_SOCKET (-1)
  29. #ifdef WITH_LINUX_FUTEX
  30. #define _GNU_SOURCE
  31. #include <unistd.h>
  32. #include <sys/syscall.h>
  33. #include <linux/kernel.h>
  34. #include <linux/futex.h>
  35. #define pthread_mutex_t int
  36. #define pthread_mutex_init(x, y) (*(x)=0)
  37. #define pthread_mutex_destroy(x) (*(x)=0)
  38. #define pthread_mutex_lock(x) mutex_lock(x)
  39. #define pthread_mutex_unlock(x) mutex_unlock(x)
  40. int mutex_lock(int *val);
  41. int mutex_unlock(int *val);
  42. #else
  43. #endif
  44. #else
  45. #include <winsock2.h>
  46. #include <Ws2tcpip.h>
  47. #define pthread_mutex_t CRITICAL_SECTION
  48. #define pthread_mutex_init(x, y) InitializeCriticalSection(x)
  49. #define pthread_mutex_lock(x) EnterCriticalSection(x)
  50. #define pthread_mutex_unlock(x) LeaveCriticalSection(x)
  51. #define pthread_mutex_destroy(x) DeleteCriticalSection(x)
  52. #ifdef MSVC
  53. #pragma warning (disable : 4996)
  54. #endif
  55. #ifndef PRIu64
  56. #define PRIu64 "I64u"
  57. #endif
  58. #ifndef PRIi64
  59. #define PRIi64 "I64i"
  60. #endif
  61. #ifndef SCNx64
  62. #define SCNx64 "I64x"
  63. #endif
  64. #endif
  65. #define MAXBANDLIMS 10
  66. #ifdef WITH_POLL
  67. #include <poll.h>
  68. #else
  69. #ifdef WITH_WSAPOLL
  70. #define poll(A,B,C) WSAPoll(A,B,C)
  71. #else
  72. struct mypollfd {
  73. SOCKET fd; /* file descriptor */
  74. short events; /* events to look for */
  75. short revents; /* events returned */
  76. };
  77. #define pollfd mypollfd
  78. int
  79. #ifdef _WIN32
  80. WINAPI
  81. #endif
  82. mypoll(struct mypollfd *fds, unsigned int nfds, int timeout);
  83. #ifndef POLLIN
  84. #define POLLIN 1
  85. #endif
  86. #ifndef POLLOUT
  87. #define POLLOUT 2
  88. #endif
  89. #ifndef POLLPRI
  90. #define POLLPRI 4
  91. #endif
  92. #ifndef POLLERR
  93. #define POLLERR 8
  94. #endif
  95. #ifndef POLLHUP
  96. #define POLLHUP 16
  97. #endif
  98. #ifndef POLLNVAL
  99. #define POLLNVAL 32
  100. #endif
  101. #endif
  102. #endif
  103. #define ALLOW 0
  104. #define DENY 1
  105. #define REDIRECT 2
  106. #define BANDLIM 3
  107. #define NOBANDLIM 4
  108. #define COUNTIN 5
  109. #define NOCOUNTIN 6
  110. #define COUNTOUT 7
  111. #define NOCOUNTOUT 8
  112. #define CONNLIM 9
  113. #define NOCONNLIM 10
  114. #define COUNTALL 11
  115. #define NOCOUNTALL 12
  116. #define CONNECT 0x00000001
  117. #define BIND 0x00000002
  118. #define UDPASSOC 0x00000004
  119. #define ICMPASSOC 0x00000008 /* reserved */
  120. #define HTTP_GET 0x00000100
  121. #define HTTP_PUT 0x00000200
  122. #define HTTP_POST 0x00000400
  123. #define HTTP_HEAD 0x00000800
  124. #define HTTP_CONNECT 0x00001000
  125. #define HTTP_OTHER 0x00008000
  126. #define HTTP 0x0000EF00 /* all except HTTP_CONNECT */
  127. #define HTTPS HTTP_CONNECT
  128. #define FTP_GET 0x00010000
  129. #define FTP_PUT 0x00020000
  130. #define FTP_LIST 0x00040000
  131. #define FTP_DATA 0x00080000
  132. #define FTP 0x000F0000
  133. #define DNSRESOLVE 0x00100000
  134. #define ADMIN 0x01000000
  135. #define SAFAMILY(sa) (&(((struct sockaddr_in *)sa)->sin_family))
  136. #ifndef NOIPV6
  137. #define SAPORT(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? &((struct sockaddr_in6 *)sa)->sin6_port : &((struct sockaddr_in *)sa)->sin_port)
  138. #define SAADDR(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
  139. #define SAADDRLEN(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)
  140. #define SASOCK(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? PF_INET6:PF_INET)
  141. #define SASIZE(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in))
  142. #define SAISNULL(sa) (!memcmp(((struct sockaddr_in *)sa)->sin_family == AF_INET6? (char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr, NULLADDR, (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)))
  143. #else
  144. #define SAPORT(sa) (&((struct sockaddr_in *)sa)->sin_port)
  145. #define SAADDR(sa) ((char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
  146. #define SAADDRLEN(sa) (4)
  147. #define SASOCK(sa) (PF_INET)
  148. #define SASIZE(sa) (sizeof(struct sockaddr_in))
  149. #define SAISNULL(sa) (((struct sockaddr_in *)sa)->sin_addr.s_addr == 0)
  150. #endif
  151. extern char* NULLADDR;
  152. typedef enum {
  153. CLIENT,
  154. SERVER
  155. } DIRECTION;
  156. typedef enum {
  157. S_NOSERVICE,
  158. S_PROXY,
  159. S_TCPPM,
  160. S_POP3P,
  161. S_SOCKS4 = 4, /* =4 */
  162. S_SOCKS5 = 5, /* =5 */
  163. S_UDPPM,
  164. S_SOCKS,
  165. S_SOCKS45,
  166. S_ADMIN,
  167. S_DNSPR,
  168. S_FTPPR,
  169. S_SMTPP,
  170. S_REVLI,
  171. S_REVCO,
  172. S_ZOMBIE
  173. }PROXYSERVICE;
  174. struct clientparam;
  175. struct node;
  176. struct symbol;
  177. struct pluginlink;
  178. struct srvparam;
  179. struct LOGFUNC;
  180. struct LOGGER;
  181. typedef int (*AUTHFUNC)(struct clientparam * param);
  182. typedef void * (*REDIRECTFUNC)(struct clientparam * param);
  183. typedef unsigned long (*RESOLVFUNC)(int af, char *name, char *value);
  184. typedef unsigned (*BANDLIMFUNC)(struct clientparam * param, unsigned nbytesin, unsigned nbytesout);
  185. typedef void (*TRAFCOUNTFUNC)(struct clientparam * param);
  186. typedef void * (*EXTENDFUNC) (struct node *node);
  187. typedef void (*CBFUNC)(void *cb, char * buf, int inbuf);
  188. typedef void (*PRINTFUNC) (struct node *node, CBFUNC cbf, void*cb);
  189. #ifdef WIN32
  190. #define PLUGINAPI __declspec(dllexport)
  191. typedef int (__cdecl *PLUGINFUNC) (struct pluginlink *pluginlink, int argc, char** argv);
  192. #define PLUGINCALL __cdecl
  193. #else
  194. #define PLUGINCALL
  195. #define PLUGINAPI
  196. typedef int (*PLUGINFUNC)(struct pluginlink *pluginlink, int argc, char** argv);
  197. #endif
  198. struct auth {
  199. struct auth *next;
  200. AUTHFUNC preauthorize;
  201. AUTHFUNC authenticate;
  202. AUTHFUNC authorize;
  203. char * desc;
  204. };
  205. struct iplist {
  206. struct iplist *next;
  207. int family;
  208. #ifndef NOIPV6
  209. struct in6_addr ip_from;
  210. struct in6_addr ip_to;
  211. #else
  212. struct in_addr ip_from;
  213. struct in_addr ip_to;
  214. #endif
  215. };
  216. struct portlist {
  217. struct portlist * next;
  218. unsigned short startport;
  219. unsigned short endport;
  220. };
  221. struct userlist {
  222. struct userlist * next;
  223. char * user;
  224. };
  225. typedef enum {
  226. SYS,
  227. CL,
  228. CR,
  229. NT,
  230. LM,
  231. UN
  232. }PWTYPE;
  233. struct passwords {
  234. struct passwords *next;
  235. char * user;
  236. char * password;
  237. int pwtype;
  238. };
  239. typedef enum {
  240. R_TCP,
  241. R_CONNECT,
  242. R_SOCKS4,
  243. R_SOCKS5,
  244. R_HTTP,
  245. R_POP3,
  246. R_SMTP,
  247. R_FTP,
  248. R_CONNECTP,
  249. R_SOCKS4P,
  250. R_SOCKS5P,
  251. R_SOCKS4B,
  252. R_SOCKS5B,
  253. R_ADMIN,
  254. R_EXTIP
  255. } REDIRTYPE;
  256. struct chain {
  257. struct chain * next;
  258. int type;
  259. #ifndef NOIPV6
  260. struct sockaddr_in6 addr;
  261. #else
  262. struct sockaddr_in addr;
  263. #endif
  264. char * exthost;
  265. char * extuser;
  266. char * extpass;
  267. unsigned short weight;
  268. unsigned short cidr;
  269. };
  270. struct period {
  271. struct period *next;
  272. int fromtime;
  273. int totime;
  274. };
  275. #define MATCHBEGIN 1
  276. #define MATCHEND 2
  277. struct hostname {
  278. struct hostname *next;
  279. char * name;
  280. int matchtype;
  281. };
  282. struct ace {
  283. struct ace *next;
  284. int action;
  285. int operation;
  286. int wdays;
  287. int weight;
  288. int nolog;
  289. struct period *periods;
  290. struct userlist *users;
  291. struct iplist *src, *dst;
  292. struct hostname *dstnames;
  293. struct portlist *ports;
  294. struct chain *chains;
  295. };
  296. struct bandlim {
  297. struct bandlim *next;
  298. struct ace *ace;
  299. time_t basetime;
  300. unsigned nexttime;
  301. unsigned rate;
  302. };
  303. struct connlim {
  304. struct connlim *next;
  305. struct ace *ace;
  306. time_t basetime;
  307. uint64_t rating;
  308. unsigned period;
  309. unsigned rate;
  310. };
  311. typedef enum {NONE, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, ANNUALLY, NEVER} ROTATION;
  312. struct schedule {
  313. struct schedule *next;
  314. ROTATION type;
  315. void *data;
  316. int (*function)(void *);
  317. time_t start_time;
  318. };
  319. struct trafcount {
  320. struct trafcount *next;
  321. struct ace *ace;
  322. unsigned number;
  323. ROTATION type;
  324. uint64_t traf64;
  325. uint64_t traflim64;
  326. char * comment;
  327. int disabled;
  328. time_t cleared;
  329. time_t updated;
  330. };
  331. struct LOGFUNC {
  332. struct LOGFUNC* next;
  333. int (*init)(struct LOGGER *logger);
  334. int (*dobuf)(struct clientparam * param, char * buf, int bufsize, const char *s);
  335. void (*log)(const char * buf, int len, struct LOGGER *logger);
  336. void (*rotate)(struct LOGGER *logger);
  337. void (*flush)(struct LOGGER *logger);
  338. void (*close)(struct LOGGER *logger);
  339. char* prefix;
  340. };
  341. extern struct LOGFUNC *logfuncs;
  342. extern void(*prelog)(struct clientparam * param);
  343. struct LOGGER {
  344. struct LOGGER *next;
  345. struct LOGGER *prev;
  346. char * selector;
  347. void * data;
  348. struct LOGFUNC *logfunc;
  349. int rotate;
  350. time_t rotated;
  351. int registered;
  352. };
  353. struct LOGGER * registerlog(const char * logstring, int logtype);
  354. void unregisterlog (struct LOGGER * log);
  355. void flushlogs(void);
  356. struct nserver {
  357. #ifndef NOIPV6
  358. struct sockaddr_in6 addr;
  359. #else
  360. struct sockaddr_in addr;
  361. #endif
  362. int usetcp;
  363. };
  364. extern int numservers;
  365. typedef void * (* PROXYFUNC)(struct clientparam *);
  366. typedef enum {
  367. PASS,
  368. CONTINUE,
  369. HANDLED,
  370. REJECT,
  371. REMOVE
  372. } FILTER_ACTION;
  373. typedef void* FILTER_OPEN(void * idata, struct srvparam * param);
  374. typedef FILTER_ACTION FILTER_CLIENT(void *fo, struct clientparam * param, void** fc);
  375. typedef FILTER_ACTION FILTER_PREDATA(void *fc, struct clientparam * param);
  376. typedef FILTER_ACTION FILTER_BUFFER(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p);
  377. typedef void FILTER_CLOSE(void *fo);
  378. struct filter {
  379. struct filter * next;
  380. char * instance;
  381. void * data;
  382. FILTER_OPEN *filter_open;
  383. FILTER_CLIENT *filter_client;
  384. FILTER_BUFFER *filter_request;
  385. FILTER_BUFFER *filter_header_cli;
  386. FILTER_BUFFER *filter_header_srv;
  387. FILTER_PREDATA *filter_predata;
  388. FILTER_BUFFER *filter_data_cli;
  389. FILTER_BUFFER *filter_data_srv;
  390. FILTER_CLOSE *filter_clear;
  391. FILTER_CLOSE *filter_close;
  392. };
  393. struct filterp {
  394. struct filter *filter;
  395. void *data;
  396. };
  397. #define MAX_FILTERS 16
  398. struct srvparam {
  399. struct srvparam *next;
  400. struct srvparam *prev;
  401. struct clientparam *child;
  402. PROXYSERVICE service;
  403. AUTHFUNC authfunc;
  404. PROXYFUNC pf;
  405. SOCKET srvsock, cbsock;
  406. int childcount;
  407. int maxchild;
  408. int paused, version;
  409. int singlepacket;
  410. int usentlm;
  411. int needuser;
  412. int silent;
  413. int transparent;
  414. int nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv;
  415. int family;
  416. int stacksize;
  417. int noforce;
  418. int anonymous;
  419. int logtype;
  420. int clisockopts, srvsockopts, lissockopts, cbcsockopts, cbssockopts;
  421. #ifdef WITHSPLICE
  422. int usesplice;
  423. #endif
  424. unsigned bufsize;
  425. unsigned logdumpsrv, logdumpcli;
  426. #ifndef NOIPV6
  427. struct sockaddr_in6 intsa;
  428. struct sockaddr_in6 extsa6;
  429. struct sockaddr_in6 extsa;
  430. struct sockaddr_in6 extNat;
  431. #else
  432. struct sockaddr_in intsa;
  433. struct sockaddr_in extsa;
  434. struct sockaddr_in extNat;
  435. #endif
  436. pthread_mutex_t counter_mutex;
  437. struct pollfd fds;
  438. FILE *stdlog;
  439. char * target;
  440. #ifdef SO_BINDTODEVICE
  441. char * ibindtodevice;
  442. char * obindtodevice;
  443. #endif
  444. struct auth *authenticate;
  445. struct pollfd * srvfds;
  446. struct ace *preacl, *acl;
  447. struct auth *authfuncs;
  448. struct filter *filter;
  449. char * logtarget;
  450. char * logformat;
  451. char * nonprintable;
  452. struct LOGGER *log;
  453. unsigned short targetport;
  454. char replace;
  455. time_t time_start;
  456. };
  457. struct clientparam {
  458. struct clientparam *next,
  459. *prev;
  460. struct srvparam *srv;
  461. REDIRECTFUNC redirectfunc;
  462. BANDLIMFUNC bandlimfunc;
  463. TRAFCOUNTFUNC trafcountfunc;
  464. struct filterp *filters,
  465. **reqfilters,
  466. **hdrfilterscli, **hdrfilterssrv,
  467. **predatfilters, **datfilterscli, **datfilterssrv;
  468. uint64_t waitclient64,
  469. waitserver64,
  470. cycles;
  471. SOCKET clisock,
  472. remsock,
  473. ctrlsock,
  474. ctrlsocksrv;
  475. SOCKET * monitorsock;
  476. int monaction;
  477. PROXYSERVICE service;
  478. REDIRTYPE redirtype;
  479. int redirected,
  480. operation,
  481. nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv,
  482. unsafefilter,
  483. preauthorized,
  484. bandlimver;
  485. int res,
  486. status;
  487. int pwtype,
  488. threadid,
  489. weight,
  490. nolog,
  491. nolongdatfilter,
  492. nooverwritefilter,
  493. transparent,
  494. chunked,
  495. paused,
  496. version;
  497. char *hostname,
  498. *username,
  499. *password,
  500. *extusername,
  501. *extpassword,
  502. *clibuf,
  503. *srvbuf;
  504. unsigned cliinbuf,
  505. srvinbuf,
  506. clioffset,
  507. srvoffset,
  508. clibufsize,
  509. srvbufsize,
  510. msec_start;
  511. uint64_t
  512. maxtrafin64,
  513. maxtrafout64;
  514. #ifndef NOIPV6
  515. struct sockaddr_in6 sincl, sincr, sinsl, sinsr, req;
  516. #else
  517. struct sockaddr_in sincl, sincr, sinsl, sinsr, req;
  518. #endif
  519. uint64_t statscli64,
  520. statssrv64;
  521. unsigned long
  522. nreads,
  523. nwrites,
  524. nconnects;
  525. struct bandlim *bandlims[MAXBANDLIMS],
  526. *bandlimsout[MAXBANDLIMS];
  527. time_t time_start;
  528. };
  529. struct filemon {
  530. char * path;
  531. struct stat sb;
  532. struct filemon *next;
  533. };
  534. struct extparam {
  535. int timeouts[12];
  536. struct ace * acl;
  537. char * conffile;
  538. struct bandlim * bandlimiter, *bandlimiterout;
  539. struct connlim * connlimiter;
  540. struct trafcount * trafcounter;
  541. struct srvparam *services;
  542. int stacksize,
  543. threadinit, counterd, haveerror, rotate, paused, archiverc,
  544. demon, maxchild, needreload, timetoexit, version, noforce, bandlimver, parentretries;
  545. int authcachetype, authcachetime;
  546. int filtermaxsize;
  547. char **archiver;
  548. ROTATION logtype, countertype;
  549. char * counterfile;
  550. #ifndef NOIPV6
  551. struct sockaddr_in6 intsa;
  552. struct sockaddr_in6 extsa6;
  553. struct sockaddr_in6 extsa;
  554. #else
  555. struct sockaddr_in intsa;
  556. struct sockaddr_in extsa;
  557. #endif
  558. struct passwords *pwl;
  559. struct auth * authenticate;
  560. AUTHFUNC authfunc;
  561. BANDLIMFUNC bandlimfunc;
  562. TRAFCOUNTFUNC trafcountfunc;
  563. void (*prelog)(struct clientparam * param);
  564. char *logtarget, *logformat;
  565. struct filemon * fmon;
  566. struct filter * filters;
  567. struct auth *authfuncs;
  568. char* demanddialprog;
  569. char **stringtable;
  570. time_t time;
  571. unsigned logdumpsrv, logdumpcli;
  572. char delimchar;
  573. };
  574. struct property {
  575. struct property * next;
  576. char * name;
  577. EXTENDFUNC e_f;
  578. int type;
  579. char * description;
  580. };
  581. struct datatype {
  582. char * type;
  583. EXTENDFUNC i_f;
  584. PRINTFUNC p_f;
  585. struct property * properties;
  586. };
  587. struct node {
  588. void * value;
  589. void * iteration;
  590. struct node * parent;
  591. int type;
  592. };
  593. struct dictionary {
  594. char * name;
  595. struct node * node;
  596. EXTENDFUNC array_f;
  597. int arraysize;
  598. };
  599. struct commands {
  600. struct commands *next;
  601. char * command;
  602. int (* handler)(int argc, char ** argv);
  603. int minargs;
  604. int maxargs;
  605. };
  606. struct symbol {
  607. struct symbol *next;
  608. char * name;
  609. void * value;
  610. };
  611. struct proxydef {
  612. PROXYFUNC pf;
  613. unsigned short port;
  614. int isudp;
  615. int service;
  616. char * helpmessage;
  617. };
  618. extern struct proxydef childdef;
  619. struct child {
  620. int argc;
  621. char **argv;
  622. };
  623. struct hashentry {
  624. char hash[sizeof(unsigned)*4];
  625. time_t expires;
  626. struct hashentry *next;
  627. char value[4];
  628. };
  629. struct hashtable {
  630. unsigned hashsize;
  631. unsigned recsize;
  632. unsigned rnd[4];
  633. struct hashentry ** hashtable;
  634. void * hashvalues;
  635. struct hashentry * hashempty;
  636. };
  637. extern struct hashtable dns_table;
  638. extern struct hashtable dns6_table;
  639. struct sockfuncs {
  640. #ifdef _WIN32
  641. SOCKET (WINAPI *_socket)(int domain, int type, int protocol);
  642. SOCKET (WINAPI *_accept)(SOCKET s, struct sockaddr * addr, int * addrlen);
  643. int (WINAPI *_bind)(SOCKET s, const struct sockaddr *addr, int addrlen);
  644. int (WINAPI *_listen)(SOCKET s, int backlog);
  645. int (WINAPI *_connect)(SOCKET s, const struct sockaddr *name, int namelen);
  646. int (WINAPI *_getpeername)(SOCKET s, struct sockaddr * name, int * namelen);
  647. int (WINAPI *_getsockname)(SOCKET s, struct sockaddr * name, int * namelen);
  648. int (WINAPI *_getsockopt)(SOCKET s, int level, int optname, char * optval, int * optlen);
  649. int (WINAPI *_setsockopt)(SOCKET s, int level, int optname, const char *optval, int optlen);
  650. int (WINAPI *_poll)(struct pollfd *fds, unsigned int nfds, int timeout);
  651. int (WINAPI *_send)(SOCKET s, const char *msg, int len, int flags);
  652. int (WINAPI *_sendto)(SOCKET s, const char *msg, int len, int flags, const struct sockaddr *to, int tolen);
  653. int (WINAPI *_recv)(SOCKET s, char *buf, int len, int flags);
  654. int (WINAPI *_recvfrom)(SOCKET s, char * buf, int len, int flags, struct sockaddr * from, int * fromlen);
  655. int (WINAPI *_shutdown)(SOCKET s, int how);
  656. int (WINAPI *_closesocket)(SOCKET s);
  657. #else
  658. SOCKET (*_socket)(int domain, int type, int protocol);
  659. SOCKET (*_accept)(SOCKET s, struct sockaddr * addr, socklen_t * addrlen);
  660. int (*_bind)(SOCKET s, const struct sockaddr *addr, socklen_t addrlen);
  661. int (*_listen)(SOCKET s, int backlog);
  662. int (*_connect)(SOCKET s, const struct sockaddr *name, socklen_t namelen);
  663. int (*_getpeername)(SOCKET s, struct sockaddr * name, socklen_t * namelen);
  664. int (*_getsockname)(SOCKET s, struct sockaddr * name, socklen_t * namelen);
  665. int (*_getsockopt)(SOCKET s, int level, int optname, void * optval, socklen_t * optlen);
  666. int (*_setsockopt)(int s, int level, int optname, const void *optval, socklen_t optlen);
  667. int (*_poll)(struct pollfd *fds, unsigned int nfds, int timeout);
  668. size_t (*_send)(SOCKET s, const void *msg, size_t len, int flags);
  669. size_t (*_sendto)(SOCKET s, const void *msg, size_t len, int flags, const struct sockaddr *to, SASIZETYPE tolen);
  670. size_t (*_recv)(SOCKET s, void *buf, size_t len, int flags);
  671. size_t (*_recvfrom)(SOCKET s, void * buf, size_t len, int flags, struct sockaddr * from, SASIZETYPE * fromlen);
  672. int (*_shutdown)(SOCKET s, int how);
  673. int (*_closesocket)(SOCKET s);
  674. #endif
  675. };
  676. extern struct sockfuncs so;
  677. struct pluginlink {
  678. struct symbol symbols;
  679. struct extparam *conf;
  680. struct nserver *nservers;
  681. int * linenum;
  682. struct auth *authfuncs;
  683. struct commands * commandhandlers;
  684. void * (*findbyname)(const char *name);
  685. int (*socksend)(SOCKET sock, char * buf, int bufsize, int to);
  686. int (*socksendto)(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to, SOCKET monsock, int monaction);
  687. int (*sockrecvfrom)(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to, SOCKET monsock, int monaction);
  688. int (*sockgetcharcli)(struct clientparam * param, int timeosec, int timeousec);
  689. int (*sockgetcharsrv)(struct clientparam * param, int timeosec, int timeousec);
  690. int (*sockgetlinebuf)(struct clientparam * param, DIRECTION which, char * buf, int bufsize, int delim, int to);
  691. int (*myinet_ntop)(int af, void *src, char *dst, socklen_t size);
  692. int (*dobuf)(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec);
  693. int (*dobuf2)(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec, struct tm* tm, char * format);
  694. int (*scanaddr)(const char *s, unsigned long * ip, unsigned long * mask);
  695. unsigned long (*getip46)(int family, char *name, struct sockaddr *sa);
  696. int (*sockmap)(struct clientparam * param, int timeo, int usesplice);
  697. int (*ACLMatches)(struct ace* acentry, struct clientparam * param);
  698. int (*alwaysauth)(struct clientparam * param);
  699. int (*checkACL)(struct clientparam * param);
  700. int (*checkpreACL)(struct clientparam * param);
  701. void (*nametohash)(const char * name, char *hash);
  702. unsigned (*hashindex)(const char* hash);
  703. char* (*en64)(const char *in, char *out, int inlen);
  704. int (*de64)(const char *in, char *out, int maxlen);
  705. void (*tohex)(char *in, char *out, int len);
  706. void (*fromhex)(char *in, char *out, int len);
  707. void (*decodeurl)(char *s, int allowcr);
  708. int (*parsestr) (char *str, char **argm, int nitems, char ** buff, int *inbuf, int *bufsize);
  709. struct ace * (*make_ace) (int argc, char ** argv);
  710. void * (*mallocfunc)(size_t size);
  711. void (*freefunc)(void *ptr);
  712. void *(*reallocfunc)(void *ptr, size_t size);
  713. char * (*strdupfunc)(const char *str);
  714. TRAFCOUNTFUNC trafcountfunc;
  715. char ** proxy_table;
  716. struct schedule ** schedule;
  717. void (*freeacl)(struct ace*);
  718. char ** admin_table;
  719. struct proxydef * childdef;
  720. int (*start_proxy_thread)(struct child * chp);
  721. void (*freeparam)(struct clientparam * param);
  722. int (*parsehostname)(char *hostname, struct clientparam *param, unsigned short port);
  723. int (*parseusername)(char *username, struct clientparam *param, int extpasswd);
  724. int (*parseconnusername)(char *username, struct clientparam *param, int extpasswd, unsigned short port);
  725. struct sockfuncs *so;
  726. char * (*dologname) (char *buf, int bufsize, char *name, const char *ext, ROTATION lt, time_t t);
  727. };
  728. struct counter_header {
  729. char sig[4];
  730. time_t updated;
  731. };
  732. struct counter_record {
  733. uint64_t traf64;
  734. time_t cleared;
  735. time_t updated;
  736. };
  737. extern struct pluginlink pluginlink;
  738. extern char *rotations[];
  739. typedef enum {
  740. SINGLEBYTE_S,
  741. SINGLEBYTE_L,
  742. STRING_S,
  743. STRING_L,
  744. CONNECTION_S,
  745. CONNECTION_L,
  746. DNS_TO,
  747. CHAIN_TO,
  748. CONNECT_TO,
  749. CONNBACK_TO
  750. }TIMEOUT;
  751. typedef enum {
  752. TYPE_INTEGER,
  753. TYPE_SHORT,
  754. TYPE_CHAR,
  755. TYPE_UNSIGNED,
  756. TYPE_UNSIGNED64,
  757. TYPE_TRAFFIC,
  758. TYPE_PORT,
  759. TYPE_IP,
  760. TYPE_SA,
  761. TYPE_CIDR,
  762. TYPE_STRING,
  763. TYPE_DATETIME,
  764. TYPE_OPERATIONS,
  765. TYPE_ROTATION,
  766. TYPE_PORTLIST,
  767. TYPE_IPLIST,
  768. TYPE_USERLIST,
  769. TYPE_PWLIST,
  770. TYPE_CHAIN,
  771. TYPE_ACE,
  772. TYPE_BANDLIMIT,
  773. TYPE_TRAFCOUNTER,
  774. TYPE_CLIENT,
  775. TYPE_WEEKDAYS,
  776. TYPE_TIME,
  777. TYPE_PERIOD,
  778. TYPE_SERVER
  779. }DATA_TYPE;
  780. #ifdef __cplusplus
  781. }
  782. #endif
  783. #endif