structures.h 19 KB

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