structs.h
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:35k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: structs.h,v 1.276.2.3 1999/02/14 08:35:02 wessels Exp $
  3.  *
  4.  *
  5.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  6.  * ----------------------------------------------------------
  7.  *
  8.  *  Squid is the result of efforts by numerous individuals from the
  9.  *  Internet community.  Development is led by Duane Wessels of the
  10.  *  National Laboratory for Applied Network Research and funded by the
  11.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  12.  *  Duane Wessels and the University of California San Diego.  Please
  13.  *  see the COPYRIGHT file for full details.  Squid incorporates
  14.  *  software developed and/or copyrighted by other sources.  Please see
  15.  *  the CREDITS file for full details.
  16.  *
  17.  *  This program is free software; you can redistribute it and/or modify
  18.  *  it under the terms of the GNU General Public License as published by
  19.  *  the Free Software Foundation; either version 2 of the License, or
  20.  *  (at your option) any later version.
  21.  *  
  22.  *  This program is distributed in the hope that it will be useful,
  23.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  24.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25.  *  GNU General Public License for more details.
  26.  *  
  27.  *  You should have received a copy of the GNU General Public License
  28.  *  along with this program; if not, write to the Free Software
  29.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  30.  *
  31.  */
  32. struct _dlink_node {
  33.     void *data;
  34.     dlink_node *prev;
  35.     dlink_node *next;
  36. };
  37. struct _dlink_list {
  38.     dlink_node *head;
  39.     dlink_node *tail;
  40. };
  41. struct _acl_ip_data {
  42.     struct in_addr addr1; /* if addr2 non-zero then its a range */
  43.     struct in_addr addr2;
  44.     struct in_addr mask;
  45.     acl_ip_data *next; /* used for parsing, not for storing */
  46. };
  47. struct _acl_snmp_comm {
  48.     char *name;
  49.     void *community;
  50.     acl_snmp_comm *next;
  51. };
  52. struct _acl_time_data {
  53.     int weekbits;
  54.     int start;
  55.     int stop;
  56.     acl_time_data *next;
  57. };
  58. struct _acl_name_list {
  59.     char name[ACL_NAME_SZ];
  60.     acl_name_list *next;
  61. };
  62. struct _acl_proxy_auth_user {
  63.     /* first two items must be same as hash_link */
  64.     char *user;
  65.     acl_proxy_auth_user *next;
  66.     /* extra fields for proxy_auth */
  67.     char *passwd;
  68.     int passwd_ok; /* 1 = passwd checked OK */
  69.     long expiretime;
  70. };
  71. struct _acl_deny_info_list {
  72.     int err_page_id;
  73.     char *err_page_name;
  74.     acl_name_list *acl_list;
  75.     acl_deny_info_list *next;
  76. };
  77. #if USE_ARP_ACL
  78. struct _acl_arp_data {
  79.     char eth[6];
  80. };
  81. #endif
  82. struct _String {
  83.     /* never reference these directly! */
  84.     unsigned short int size; /* buffer size; 64K limit */
  85.     unsigned short int len; /* current length  */
  86.     char *buf;
  87. };
  88. #if SQUID_SNMP
  89. struct _snmp_request_t {
  90.     u_char *buf;
  91.     u_char *outbuf;
  92.     int len;
  93.     int sock;
  94.     long reqid;
  95.     int outlen;
  96.     struct sockaddr_in from;
  97.     struct snmp_pdu *PDU;
  98.     aclCheck_t *acl_checklist;
  99.     u_char *community;
  100. };
  101. #endif
  102. struct _acl {
  103.     char name[ACL_NAME_SZ];
  104.     squid_acl type;
  105.     void *data;
  106.     char *cfgline;
  107.     acl *next;
  108. };
  109. struct _acl_list {
  110.     int op;
  111.     acl *acl;
  112.     acl_list *next;
  113. };
  114. struct _acl_access {
  115.     int allow;
  116.     acl_list *acl_list;
  117.     char *cfgline;
  118.     acl_access *next;
  119. };
  120. struct _aclCheck_t {
  121.     const acl_access *access_list;
  122.     struct in_addr src_addr;
  123.     struct in_addr dst_addr;
  124.     struct in_addr my_addr;
  125.     request_t *request;
  126. #if USE_IDENT
  127.     ConnStateData *conn; /* hack for ident */
  128.     char ident[USER_IDENT_SZ];
  129. #endif
  130.     char browser[BROWSERNAMELEN];
  131.     acl_proxy_auth_user *auth_user;
  132.     acl_lookup_state state[ACL_ENUM_MAX];
  133. #if SQUID_SNMP
  134.     char *snmp_community;
  135. #endif
  136.     PF *callback;
  137.     void *callback_data;
  138. };
  139. struct _aio_result_t {
  140.     int aio_return;
  141.     int aio_errno;
  142. };
  143. struct _wordlist {
  144.     char *key;
  145.     wordlist *next;
  146. };
  147. struct _intlist {
  148.     int i;
  149.     intlist *next;
  150. };
  151. struct _intrange {
  152.     int i;
  153.     int j;
  154.     intrange *next;
  155. };
  156. struct _ushortlist {
  157.     u_short i;
  158.     ushortlist *next;
  159. };
  160. struct _relist {
  161.     char *pattern;
  162.     regex_t regex;
  163.     relist *next;
  164. };
  165. #if DELAY_POOLS
  166. struct _delaySpec {
  167.     int restore_bps;
  168.     int max_bytes;
  169. };
  170. /* malloc()'d only as far as used (class * sizeof(delaySpec)!
  171.  * order of elements very important!
  172.  */
  173. struct _delaySpecSet {
  174.     delaySpec aggregate;
  175.     delaySpec individual;
  176.     delaySpec network;
  177. };
  178. struct _delayConfig {
  179.     unsigned short pools;
  180.     unsigned short initial;
  181.     unsigned char *class;
  182.     delaySpecSet **rates;
  183.     acl_access **access;
  184. };
  185. #endif
  186. struct _SquidConfig {
  187.     struct {
  188. size_t maxSize;
  189. int highWaterMark;
  190. int lowWaterMark;
  191.     } Swap;
  192.     size_t memMaxSize;
  193.     struct {
  194. char *relayHost;
  195. u_short relayPort;
  196. peer *peer;
  197.     } Wais;
  198.     struct {
  199. size_t min;
  200. int pct;
  201. size_t max;
  202.     } quickAbort;
  203.     time_t referenceAge;
  204.     time_t negativeTtl;
  205.     time_t negativeDnsTtl;
  206.     time_t positiveDnsTtl;
  207.     time_t shutdownLifetime;
  208.     struct {
  209. time_t read;
  210. time_t lifetime;
  211. time_t connect;
  212. time_t request;
  213. time_t pconn;
  214. time_t siteSelect;
  215. time_t deadPeer;
  216. int icp_query; /* msec */
  217. int mcast_icp_query; /* msec */
  218. #if USE_IDENT
  219. time_t ident;
  220. #endif
  221.     } Timeout;
  222.     size_t maxRequestSize;
  223.     struct {
  224. ushortlist *http;
  225. u_short icp;
  226. #if USE_HTCP
  227. u_short htcp;
  228. #endif
  229. #if SQUID_SNMP
  230. u_short snmp;
  231. #endif
  232.     } Port;
  233. #if SQUID_SNMP
  234.     struct {
  235. char *configFile;
  236. char *agentInfo;
  237. u_short localPort;
  238.     } Snmp;
  239. #endif
  240.     char *as_whois_server;
  241.     struct {
  242. char *log;
  243. char *access;
  244. char *store;
  245. char *swap;
  246. char *useragent;
  247. int rotateNumber;
  248.     } Log;
  249.     char *adminEmail;
  250.     char *effectiveUser;
  251.     char *effectiveGroup;
  252.     struct {
  253. char *dnsserver;
  254. char *redirect;
  255. wordlist *authenticate;
  256. char *pinger;
  257. char *unlinkd;
  258.     } Program;
  259.     int dnsChildren;
  260.     int redirectChildren;
  261.     int authenticateChildren;
  262.     int authenticateTTL;
  263.     struct {
  264. char *host;
  265. u_short port;
  266.     } Accel;
  267.     char *appendDomain;
  268.     size_t appendDomainLen;
  269.     char *debugOptions;
  270.     char *pidFilename;
  271.     char *mimeTablePathname;
  272.     char *visibleHostname;
  273.     char *uniqueHostname;
  274.     char *errHtmlText;
  275.     struct {
  276. char *host;
  277. char *file;
  278. time_t period;
  279. u_short port;
  280.     } Announce;
  281.     struct {
  282. struct in_addr tcp_incoming;
  283. struct in_addr tcp_outgoing;
  284. struct in_addr udp_incoming;
  285. struct in_addr udp_outgoing;
  286. #if SQUID_SNMP
  287. struct in_addr snmp_incoming;
  288. struct in_addr snmp_outgoing;
  289. #endif
  290. struct in_addr client_netmask;
  291.     } Addrs;
  292.     size_t tcpRcvBufsz;
  293.     size_t udpMaxHitObjsz;
  294.     wordlist *hierarchy_stoplist;
  295.     wordlist *mcast_group_list;
  296.     wordlist *dns_testname_list;
  297.     wordlist *dns_nameservers;
  298.     peer *peers;
  299.     int npeers;
  300.     struct {
  301. int size;
  302. int low;
  303. int high;
  304.     } ipcache;
  305.     struct {
  306. int size;
  307.     } fqdncache;
  308.     int minDirectHops;
  309.     cachemgr_passwd *passwd_list;
  310.     struct {
  311. int objectsPerBucket;
  312. size_t avgObjectSize;
  313. size_t maxObjectSize;
  314.     } Store;
  315.     struct {
  316. int high;
  317. int low;
  318. time_t period;
  319.     } Netdb;
  320.     struct {
  321. int log_udp;
  322. int enable_purge;
  323. int res_defnames;
  324. int anonymizer;
  325. int client_db;
  326. int query_icmp;
  327. int icp_hit_stale;
  328. int buffered_logs;
  329. #if ALLOW_SOURCE_PING
  330. int source_ping;
  331. #endif
  332. int common_log;
  333. int log_mime_hdrs;
  334. int log_fqdn;
  335. int announce;
  336. int accel_with_proxy;
  337. int mem_pools;
  338. int test_reachability;
  339. int half_closed_clients;
  340. #if HTTP_VIOLATIONS
  341. int reload_into_ims;
  342. #endif
  343. int offline;
  344. int redir_rewrites_host;
  345. int persistent_client_posts;
  346. int prefer_direct;
  347. int strip_query_terms;
  348.     } onoff;
  349.     acl *aclList;
  350.     struct {
  351. acl_access *http;
  352. acl_access *icp;
  353. acl_access *miss;
  354. acl_access *NeverDirect;
  355. acl_access *AlwaysDirect;
  356. acl_access *ASlists;
  357. acl_access *noCache;
  358. #if SQUID_SNMP
  359. acl_access *snmp;
  360. #endif
  361. acl_access *brokenPosts;
  362. #if USE_IDENT
  363. acl_access *identLookup;
  364. #endif
  365.     } accessList;
  366.     acl_deny_info_list *denyInfoList;
  367.     char *proxyAuthRealm;
  368.     struct {
  369. size_t list_width;
  370. int list_wrap;
  371. char *anon_user;
  372.     } Ftp;
  373.     refresh_t *Refresh;
  374.     struct _cacheSwap {
  375. SwapDir *swapDirs;
  376. int n_allocated;
  377. int n_configured;
  378.     } cacheSwap;
  379.     char *fake_ua;
  380.     struct {
  381. char *directory;
  382.     } icons;
  383.     char *errorDirectory;
  384.     struct {
  385. time_t timeout;
  386. int maxtries;
  387.     } retry;
  388.     struct {
  389. size_t limit;
  390.     } MemPools;
  391. #if DELAY_POOLS
  392.     delayConfig Delay;
  393. #endif
  394.     struct {
  395. int icp_average;
  396. int http_average;
  397. int icp_min_poll;
  398. int http_min_poll;
  399.     } comm_incoming;
  400.     int max_open_disk_fds;
  401.     int uri_whitespace;
  402.     size_t rangeOffsetLimit;
  403. #if MULTICAST_MISS_STREAM
  404.     struct {
  405. struct in_addr addr;
  406. unsigned short port;
  407. char *encode_key;
  408.     } mcast_miss;
  409. #endif
  410.     HttpHeaderMask anonymize_headers;
  411. };
  412. struct _SquidConfig2 {
  413.     struct {
  414. char *prefix;
  415. int on;
  416.     } Accel;
  417. };
  418. struct _close_handler {
  419.     PF *handler;
  420.     void *data;
  421.     close_handler *next;
  422. };
  423. struct _dread_ctrl {
  424.     int fd;
  425.     off_t offset;
  426.     int req_len;
  427.     char *buf;
  428.     int end_of_file;
  429.     DRCB *handler;
  430.     void *client_data;
  431. };
  432. struct _dnsserver_t {
  433.     int id;
  434.     int inpipe;
  435.     int outpipe;
  436.     time_t answer;
  437.     off_t offset;
  438.     size_t size;
  439.     char ip_inbuf[DNS_INBUF_SZ];
  440.     struct timeval dispatch_time;
  441.     void *data;
  442. };
  443. struct _dnsStatData {
  444.     int requests;
  445.     int replies;
  446.     int hist[DefaultDnsChildrenMax];
  447. };
  448. struct _dwrite_q {
  449.     off_t file_offset;
  450.     char *buf;
  451.     int len;
  452.     off_t buf_offset;
  453.     dwrite_q *next;
  454.     FREE *free_func;
  455. };
  456. /* ETag support is rudimantal;
  457.  * this struct is likely to change
  458.  * Note: "str" points to memory in HttpHeaderEntry (for now)
  459.  *       so ETags should be used as tmp variables only (for now) */
  460. struct _ETag {
  461.     const char *str; /* quoted-string */
  462.     int weak; /* true if it is a weak validator */
  463. };
  464. struct _fde {
  465.     unsigned int type;
  466.     u_short local_port;
  467.     u_short remote_port;
  468.     char ipaddr[16]; /* dotted decimal address of peer */
  469.     char desc[FD_DESC_SZ];
  470.     struct {
  471. unsigned int open:1;
  472. unsigned int close_request:1;
  473. unsigned int write_daemon:1;
  474. unsigned int closing:1;
  475. unsigned int socket_eof:1;
  476. unsigned int nolinger:1;
  477. unsigned int nonblocking:1;
  478. unsigned int ipc:1;
  479. unsigned int called_connect:1;
  480. #ifdef OPTIMISTIC_IO
  481. unsigned int calling_io_handler:1;
  482. #endif
  483.     } flags;
  484.     int bytes_read;
  485.     int bytes_written;
  486.     int uses; /* ie # req's over persistent conn */
  487.     struct _fde_disk {
  488. DWCB *wrt_handle;
  489. void *wrt_handle_data;
  490. dwrite_q *write_q;
  491. dwrite_q *write_q_tail;
  492. off_t offset;
  493.     } disk;
  494.     PF *read_handler;
  495.     void *read_data;
  496.     PF *write_handler;
  497.     void *write_data;
  498.     PF *timeout_handler;
  499.     time_t timeout;
  500.     void *timeout_data;
  501.     void *lifetime_data;
  502.     close_handler *close_handler; /* linked list */
  503.     DEFER *defer_check; /* check if we should defer read */
  504.     void *defer_data;
  505.     CommWriteStateData *rwstate; /* State data for comm_write */
  506. };
  507. struct _fileMap {
  508.     int max_n_files;
  509.     int n_files_in_map;
  510.     int toggle;
  511.     int nwords;
  512.     unsigned long *file_map;
  513. };
  514. /* auto-growing memory-resident buffer with printf interface */
  515. /* note: when updating this struct, update MemBufNULL #define */
  516. struct _MemBuf {
  517.     /* public, read-only */
  518.     char *buf;
  519.     mb_size_t size; /* used space, does not count 0-terminator */
  520.     /* private, stay away; use interface function instead */
  521.     mb_size_t max_capacity; /* when grows: assert(new_capacity <= max_capacity) */
  522.     mb_size_t capacity; /* allocated space */
  523.     FREE *freefunc; /* what to use to free the buffer, NULL after memBufFreeFunc() is called */
  524. };
  525. /* see Packer.c for description */
  526. struct _Packer {
  527.     /* protected, use interface functions instead */
  528.     append_f append;
  529.     vprintf_f vprintf;
  530.     void *real_handler; /* first parameter to real append and vprintf */
  531. };
  532. /* http status line */
  533. struct _HttpStatusLine {
  534.     /* public, read only */
  535.     float version;
  536.     const char *reason; /* points to a _constant_ string (default or supplied), never free()d */
  537.     http_status status;
  538. };
  539. /*
  540.  * Note: HttpBody is used only for messages with a small content that is
  541.  * known a priory (e.g., error messages).
  542.  */
  543. struct _HttpBody {
  544.     /* private */
  545.     MemBuf mb;
  546. };
  547. /* http header extention field */
  548. struct _HttpHdrExtField {
  549.     String name; /* field-name  from HTTP/1.1 (no column after name) */
  550.     String value; /* field-value from HTTP/1.1 */
  551. };
  552. /* http cache control header field */
  553. struct _HttpHdrCc {
  554.     int mask;
  555.     int max_age;
  556. };
  557. /* http byte-range-spec */
  558. struct _HttpHdrRangeSpec {
  559.     size_t offset;
  560.     size_t length;
  561. };
  562. /* There may be more than one byte range specified in the request.
  563.  * This object holds all range specs in order of their appearence
  564.  * in the request because we SHOULD preserve that order.
  565.  */
  566. struct _HttpHdrRange {
  567.     Stack specs;
  568. };
  569. /* http content-range header field */
  570. struct _HttpHdrContRange {
  571.     HttpHdrRangeSpec spec;
  572.     size_t elength; /* entity length, not content length */
  573. };
  574. /* some fields can hold either time or etag specs (e.g. If-Range) */
  575. struct _TimeOrTag {
  576.     ETag tag; /* entity tag */
  577.     time_t time;
  578.     int valid; /* true if struct is usable */
  579. };
  580. /* data for iterating thru range specs */
  581. struct _HttpHdrRangeIter {
  582.     HttpHdrRangePos pos;
  583.     const HttpHdrRangeSpec *spec; /* current spec at pos */
  584.     size_t debt_size; /* bytes left to send from the current spec */
  585.     size_t prefix_size; /* the size of the incoming HTTP msg prefix */
  586.     String boundary; /* boundary for multipart responses */
  587. };
  588. /* constant attributes of http header fields */
  589. struct _HttpHeaderFieldAttrs {
  590.     const char *name;
  591.     http_hdr_type id;
  592.     field_type type;
  593. };
  594. /* per field statistics */
  595. struct _HttpHeaderFieldStat {
  596.     int aliveCount; /* created but not destroyed (count) */
  597.     int seenCount; /* #fields we've seen */
  598.     int parsCount; /* #parsing attempts */
  599.     int errCount; /* #pasring errors */
  600.     int repCount; /* #repetitons */
  601. };
  602. /* compiled version of HttpHeaderFieldAttrs plus stats */
  603. struct _HttpHeaderFieldInfo {
  604.     http_hdr_type id;
  605.     String name;
  606.     field_type type;
  607.     HttpHeaderFieldStat stat;
  608. };
  609. struct _HttpHeaderEntry {
  610.     http_hdr_type id;
  611.     String name;
  612.     String value;
  613. };
  614. struct _HttpHeader {
  615.     /* protected, do not use these, use interface functions instead */
  616.     Array entries; /* parsed fields in raw format */
  617.     HttpHeaderMask mask; /* bit set <=> entry present */
  618.     http_hdr_owner_type owner; /* request or reply */
  619.     int len; /* length when packed, not counting terminating '' */
  620. };
  621. struct _HttpReply {
  622.     /* unsupported, writable, may disappear/change in the future */
  623.     int hdr_sz; /* sums _stored_ status-line, headers, and <CRLF> */
  624.     /* public, readable; never update these or their .hdr equivalents directly */
  625.     int content_length;
  626.     time_t date;
  627.     time_t last_modified;
  628.     time_t expires;
  629.     String content_type;
  630.     HttpHdrCc *cache_control;
  631.     HttpHdrContRange *content_range;
  632.     short int keep_alive;
  633.     /* public, readable */
  634.     HttpMsgParseState pstate; /* the current parsing state */
  635.     /* public, writable, but use httpReply* interfaces when possible */
  636.     HttpStatusLine sline;
  637.     HttpHeader header;
  638.     HttpBody body; /* for small constant memory-resident text bodies only */
  639. };
  640. struct _http_state_flags {
  641.     unsigned int proxying:1;
  642.     unsigned int keepalive:1;
  643.     unsigned int only_if_cached:1;
  644. };
  645. struct _HttpStateData {
  646.     StoreEntry *entry;
  647.     request_t *request;
  648.     char *reply_hdr;
  649.     int reply_hdr_state;
  650.     peer *peer; /* peer request made to */
  651.     int eof; /* reached end-of-object? */
  652.     request_t *orig_request;
  653.     int fd;
  654.     http_state_flags flags;
  655.     FwdState *fwd;
  656. };
  657. struct _icpUdpData {
  658.     struct sockaddr_in address;
  659.     void *msg;
  660.     size_t len;
  661.     icpUdpData *next;
  662. #ifndef LESS_TIMING
  663.     struct timeval start;
  664. #endif
  665.     log_type logcode;
  666.     struct timeval queue_time;
  667. };
  668. struct _ping_data {
  669.     struct timeval start;
  670.     struct timeval stop;
  671.     int n_sent;
  672.     int n_recv;
  673.     int n_replies_expected;
  674.     int timeout; /* msec */
  675.     int timedout;
  676.     int w_rtt;
  677.     int p_rtt;
  678. };
  679. struct _HierarchyLogEntry {
  680.     hier_code code;
  681.     char host[SQUIDHOSTNAMELEN];
  682.     ping_data ping;
  683.     char cd_host[SQUIDHOSTNAMELEN]; /* the host of selected by cd peer */
  684.     peer_select_alg_t alg; /* peer selection algorithm */
  685.     lookup_t cd_lookup; /* cd prediction: none, miss, hit */
  686.     int n_choices; /* #peers we selected from (cd only) */
  687.     int n_ichoices; /* #peers with known rtt we selected from (cd only) */
  688.     struct timeval peer_select_start;
  689.     struct timeval store_complete_stop;
  690. };
  691. struct _AccessLogEntry {
  692.     const char *url;
  693.     struct {
  694. method_t method;
  695. int code;
  696. const char *content_type;
  697. float version;
  698.     } http;
  699.     struct {
  700. icp_opcode opcode;
  701.     } icp;
  702.     struct {
  703. struct in_addr caddr;
  704. size_t size;
  705. log_type code;
  706. int msec;
  707. const char *ident;
  708.     } cache;
  709.     struct {
  710. char *request;
  711. char *reply;
  712.     } headers;
  713.     struct {
  714. const char *method_str;
  715.     } private;
  716.     HierarchyLogEntry hier;
  717. };
  718. struct _clientHttpRequest {
  719.     ConnStateData *conn;
  720.     request_t *request; /* Parsed URL ... */
  721.     char *uri;
  722.     char *log_uri;
  723.     struct {
  724. off_t offset;
  725. size_t size;
  726.     } out;
  727.     HttpHdrRangeIter range_iter; /* data for iterating thru range specs */
  728.     size_t req_sz; /* raw request size on input, not current request size */
  729.     StoreEntry *entry;
  730.     StoreEntry *old_entry;
  731.     log_type log_type;
  732. #if USE_CACHE_DIGESTS
  733.     const char *lookup_type; /* temporary hack: storeGet() result: HIT/MISS/NONE */
  734. #endif
  735.     http_status http_code;
  736.     struct timeval start;
  737.     float http_ver;
  738.     int redirect_state;
  739.     aclCheck_t *acl_checklist; /* need ptr back so we can unreg if needed */
  740.     clientHttpRequest *next;
  741.     AccessLogEntry al;
  742.     struct {
  743. unsigned int accel:1;
  744. unsigned int internal:1;
  745. unsigned int done_copying:1;
  746.     } flags;
  747.     struct {
  748. http_status status;
  749. char *location;
  750.     } redirect;
  751.     dlink_node active;
  752. };
  753. struct _ConnStateData {
  754.     int fd;
  755.     struct {
  756. char *buf;
  757. off_t offset;
  758. size_t size;
  759.     } in;
  760.     clientHttpRequest *chr;
  761.     struct sockaddr_in peer;
  762.     struct sockaddr_in me;
  763.     struct in_addr log_addr;
  764.     char ident[USER_IDENT_SZ];
  765.     int nrequests;
  766.     int persistent;
  767.     struct {
  768. int n;
  769. time_t until;
  770.     } defer;
  771. };
  772. struct _ipcache_addrs {
  773.     struct in_addr *in_addrs;
  774.     unsigned char *bad_mask;
  775.     unsigned char count;
  776.     unsigned char cur;
  777.     unsigned char badcount;
  778. };
  779. struct _ip_pending {
  780.     IPH *handler;
  781.     void *handlerData;
  782.     ip_pending *next;
  783. };
  784. struct _ipcache_entry {
  785.     /* first two items must be equivalent to hash_link */
  786.     char *name;
  787.     ipcache_entry *next;
  788.     time_t lastref;
  789.     time_t expires;
  790.     ipcache_addrs addrs;
  791.     ip_pending *pending_head;
  792.     char *error_message;
  793.     struct timeval request_time;
  794.     dlink_node lru;
  795.     u_char locks;
  796.     ipcache_status_t status:3;
  797. };
  798. struct _fqdn_pending {
  799.     FQDNH *handler;
  800.     void *handlerData;
  801.     fqdn_pending *next;
  802. };
  803. struct _fqdncache_entry {
  804.     /* first two items must be equivalent to hash_link */
  805.     char *name;
  806.     fqdncache_entry *next;
  807.     time_t lastref;
  808.     time_t expires;
  809.     unsigned char name_count;
  810.     char *names[FQDN_MAX_NAMES + 1];
  811.     fqdn_pending *pending_head;
  812.     char *error_message;
  813.     struct timeval request_time;
  814.     dlink_node lru;
  815.     unsigned char locks;
  816.     fqdncache_status_t status:3;
  817. };
  818. struct _domain_ping {
  819.     char *domain;
  820.     int do_ping; /* boolean */
  821.     domain_ping *next;
  822. };
  823. struct _domain_type {
  824.     char *domain;
  825.     peer_t type;
  826.     domain_type *next;
  827. };
  828. #if USE_CACHE_DIGESTS
  829. struct _Version {
  830.     short int current; /* current version */
  831.     short int required; /* minimal version that can safely handle current version */
  832. };
  833. /* digest control block; used for transmission and storage */
  834. struct _StoreDigestCBlock {
  835.     Version ver;
  836.     int capacity;
  837.     int count;
  838.     int del_count;
  839.     int mask_size;
  840.     unsigned char bits_per_entry;
  841.     unsigned char hash_func_count;
  842.     short int reserved_short;
  843.     int reserved[32 - 6];
  844. };
  845. struct _DigestFetchState {
  846.     PeerDigest *pd;
  847.     StoreEntry *entry;
  848.     StoreEntry *old_entry;
  849.     request_t *request;
  850.     int offset;
  851.     int mask_offset;
  852.     time_t start_time;
  853.     time_t resp_time;
  854.     time_t expires;
  855.     struct {
  856. int msg;
  857. int bytes;
  858.     } sent, recv;
  859. };
  860. /* statistics for cache digests and other hit "predictors" */
  861. struct _cd_guess_stats {
  862.     /* public, read-only */
  863.     int true_hits;
  864.     int false_hits;
  865.     int true_misses;
  866.     int false_misses;
  867.     int close_hits; /* tmp, remove it later */
  868. };
  869. struct _PeerDigest {
  870.     peer *peer; /* pointer back to peer structure, argh */
  871.     CacheDigest *cd; /* actual digest structure */
  872.     String host; /* copy of peer->host */
  873.     const char *req_result; /* text status of the last request */
  874.     struct {
  875. unsigned int needed:1; /* there were requests for this digest */
  876. unsigned int usable:1; /* can be used for lookups */
  877. unsigned int requested:1; /* in process of receiving [fresh] digest */
  878.     } flags;
  879.     struct {
  880. /* all times are absolute unless augmented with _delay */
  881. time_t initialized; /* creation */
  882. time_t needed; /* first lookup/use by a peer */
  883. time_t next_check; /* next scheduled check/refresh event */
  884. time_t retry_delay; /* delay before re-checking _invalid_ digest */
  885. time_t requested; /* requested a fresh copy of a digest */
  886. time_t req_delay; /* last request response time */
  887. time_t received; /* received the current copy of a digest */
  888. time_t disabled; /* disabled for good */
  889.     } times;
  890.     struct {
  891. cd_guess_stats guess;
  892. int used_count;
  893. struct {
  894.     int msgs;
  895.     kb_t kbytes;
  896. } sent, recv;
  897.     } stats;
  898. };
  899. #endif
  900. struct _peer {
  901.     char *host;
  902.     peer_t type;
  903.     struct sockaddr_in in_addr;
  904.     struct {
  905. int pings_sent;
  906. int pings_acked;
  907. int fetches;
  908. int rtt;
  909. int ignored_replies;
  910. int n_keepalives_sent;
  911. int n_keepalives_recv;
  912. time_t last_query;
  913. time_t last_reply;
  914. int logged_state; /* so we can print dead/revived msgs */
  915.     } stats;
  916.     struct {
  917. int version;
  918. int counts[ICP_END];
  919. u_short port;
  920.     } icp;
  921. #if USE_HTCP
  922.     struct {
  923. double version;
  924. int counts[2];
  925. u_short port;
  926.     } htcp;
  927. #endif
  928.     u_short http_port;
  929.     domain_ping *peer_domain;
  930.     domain_type *typelist;
  931.     acl_access *access;
  932.     struct {
  933. unsigned int proxy_only:1;
  934. unsigned int no_query:1;
  935. unsigned int no_digest:1;
  936. unsigned int default_parent:1;
  937. unsigned int roundrobin:1;
  938. unsigned int mcast_responder:1;
  939. unsigned int closest_only:1;
  940. #if USE_HTCP
  941. unsigned int htcp:1;
  942. #endif
  943. unsigned int no_netdb_exchange:1;
  944. #if DELAY_POOLS
  945. unsigned int no_delay:1;
  946. #endif
  947.     } options;
  948.     int weight;
  949.     struct {
  950. double avg_n_members;
  951. int n_times_counted;
  952. int n_replies_expected;
  953. int ttl;
  954. int id;
  955. struct {
  956.     unsigned int count_event_pending:1;
  957.     unsigned int counting:1;
  958. } flags;
  959.     } mcast;
  960. #if USE_CACHE_DIGESTS
  961.     PeerDigest *digest;
  962. #endif
  963.     int tcp_up; /* 0 if a connect() fails */
  964.     time_t last_fail_time;
  965.     struct in_addr addresses[10];
  966.     int n_addresses;
  967.     int rr_count;
  968.     peer *next;
  969.     int test_fd;
  970. #if USE_CARP
  971.     struct {
  972. unsigned long hash;
  973. unsigned long load_multiplier;
  974. float load_factor;
  975.     } carp;
  976. #endif
  977.     char *login; /* Proxy authorization */
  978. };
  979. struct _net_db_name {
  980.     char *name;
  981.     net_db_name *htbl_next;
  982.     net_db_name *next;
  983.     netdbEntry *net_db_entry;
  984. };
  985. struct _net_db_peer {
  986.     char *peername;
  987.     double hops;
  988.     double rtt;
  989.     time_t expires;
  990. };
  991. struct _netdbEntry {
  992.     /* first two items must be equivalent to hash_link */
  993.     char *key;
  994.     netdbEntry *next;
  995.     char network[16];
  996.     int pings_sent;
  997.     int pings_recv;
  998.     double hops;
  999.     double rtt;
  1000.     time_t next_ping_time;
  1001.     time_t last_use_time;
  1002.     int link_count;
  1003.     net_db_name *hosts;
  1004.     net_db_peer *peers;
  1005.     int n_peers_alloc;
  1006.     int n_peers;
  1007. };
  1008. struct _ps_state {
  1009.     request_t *request;
  1010.     StoreEntry *entry;
  1011.     int always_direct;
  1012.     int never_direct;
  1013.     int direct;
  1014.     PSC *callback;
  1015.     void *callback_data;
  1016.     FwdServer *servers;
  1017.     /*
  1018.      * Why are these struct sockaddr_in instead of peer *?  Because a
  1019.      * peer structure can become invalid during the peer selection
  1020.      * phase, specifically after a reconfigure.  Thus we need to lookup
  1021.      * the peer * based on the address when we are finally ready to
  1022.      * reference the peer structure.
  1023.      */
  1024.     struct sockaddr_in first_parent_miss;
  1025.     struct sockaddr_in closest_parent_miss;
  1026.     /*
  1027.      * ->hit and ->secho can be peer* because they should only be
  1028.      * accessed during the thread when they are set
  1029.      */
  1030.     peer *hit;
  1031.     peer_t hit_type;
  1032. #if ALLOW_SOURCE_PING
  1033.     peer *secho;
  1034. #endif
  1035.     ping_data ping;
  1036.     aclCheck_t *acl_checklist;
  1037. };
  1038. struct _pingerEchoData {
  1039.     struct in_addr to;
  1040.     unsigned char opcode;
  1041.     int psize;
  1042.     char payload[PINGER_PAYLOAD_SZ];
  1043. };
  1044. struct _pingerReplyData {
  1045.     struct in_addr from;
  1046.     unsigned char opcode;
  1047.     int rtt;
  1048.     int hops;
  1049.     int psize;
  1050.     char payload[PINGER_PAYLOAD_SZ];
  1051. };
  1052. struct _icp_common_t {
  1053.     unsigned char opcode; /* opcode */
  1054.     unsigned char version; /* version number */
  1055.     unsigned short length; /* total length (bytes) */
  1056.     u_num32 reqnum; /* req number (req'd for UDP) */
  1057.     u_num32 flags;
  1058.     u_num32 pad;
  1059.     u_num32 shostid; /* sender host id */
  1060. };
  1061. struct _iostats {
  1062.     struct {
  1063. int reads;
  1064. int reads_deferred;
  1065. int read_hist[16];
  1066. int writes;
  1067. int write_hist[16];
  1068.     } Http, Ftp, Gopher, Wais;
  1069. };
  1070. struct _mem_node {
  1071.     char *data;
  1072.     int len;
  1073.     mem_node *next;
  1074. };
  1075. struct _mem_hdr {
  1076.     mem_node *head;
  1077.     mem_node *tail;
  1078.     int origin_offset;
  1079. };
  1080. /* keep track each client receiving data from that particular StoreEntry */
  1081. struct _store_client {
  1082.     int type;
  1083.     off_t copy_offset;
  1084.     off_t seen_offset;
  1085.     size_t copy_size;
  1086.     char *copy_buf;
  1087.     STCB *callback;
  1088.     void *callback_data;
  1089.     StoreEntry *entry; /* ptr to the parent StoreEntry, argh! */
  1090.     int swapin_fd;
  1091.     struct {
  1092. unsigned int disk_io_pending:1;
  1093. unsigned int store_copying:1;
  1094. unsigned int copy_event_pending:1;
  1095.     } flags;
  1096.     store_client *next;
  1097. #if DELAY_POOLS
  1098.     delay_id delay_id;
  1099. #endif
  1100. };
  1101. /* This structure can be freed while object is purged out from memory */
  1102. struct _MemObject {
  1103.     method_t method;
  1104.     char *url;
  1105.     mem_hdr data_hdr;
  1106.     off_t inmem_hi;
  1107.     off_t inmem_lo;
  1108.     store_client *clients;
  1109.     int nclients;
  1110.     struct {
  1111. off_t queue_offset; /* relative to in-mem data */
  1112. off_t done_offset; /* relative to swap file with meta headers! */
  1113. int fd;
  1114. void *ctrl;
  1115.     } swapout;
  1116.     HttpReply *reply;
  1117.     request_t *request;
  1118.     struct timeval start_ping;
  1119.     IRCB *ping_reply_callback;
  1120.     void *ircb_data;
  1121.     int fd; /* FD of client creating this entry */
  1122.     struct {
  1123. STABH *callback;
  1124. void *data;
  1125.     } abort;
  1126.     char *log_url;
  1127.     dlink_node lru;
  1128.     int id;
  1129.     ssize_t object_sz;
  1130.     size_t swap_hdr_sz;
  1131. };
  1132. struct _StoreEntry {
  1133.     /* first two items must be same as hash_link */
  1134.     const cache_key *key;
  1135.     StoreEntry *next;
  1136.     MemObject *mem_obj;
  1137.     time_t timestamp;
  1138.     time_t lastref;
  1139.     time_t expires;
  1140.     time_t lastmod;
  1141.     size_t swap_file_sz;
  1142.     u_short refcount;
  1143.     u_short flags;
  1144.     int swap_file_number;
  1145.     dlink_node lru;
  1146.     u_short lock_count; /* Assume < 65536! */
  1147.     mem_status_t mem_status:3;
  1148.     ping_status_t ping_status:3;
  1149.     store_status_t store_status:3;
  1150.     swap_status_t swap_status:3;
  1151. };
  1152. struct _SwapDir {
  1153.     char *path;
  1154.     int l1;
  1155.     int l2;
  1156.     int cur_size;
  1157.     int max_size;
  1158.     int suggest;
  1159.     fileMap *map;
  1160.     int swaplog_fd;
  1161.     struct {
  1162. unsigned int selected:1;
  1163. unsigned int read_only:1;
  1164.     } flags;
  1165. };
  1166. struct _request_flags {
  1167.     unsigned int range:1;
  1168.     unsigned int nocache:1;
  1169.     unsigned int ims:1;
  1170.     unsigned int auth:1;
  1171.     unsigned int cachable:1;
  1172.     unsigned int hierarchical:1;
  1173.     unsigned int loopdetect:1;
  1174.     unsigned int proxy_keepalive:1;
  1175.     unsigned int proxying:1;
  1176.     unsigned int refresh:1;
  1177.     unsigned int used_proxy_auth:1;
  1178.     unsigned int redirected:1;
  1179.     unsigned int need_validation:1;
  1180. #if HTTP_VIOLATIONS
  1181.     unsigned int nocache_hack:1; /* for changing/ignoring no-cache requests */
  1182. #endif
  1183.     unsigned int accelerated:1;
  1184.     unsigned int internal:1;
  1185. };
  1186. struct _request_t {
  1187.     method_t method;
  1188.     protocol_t protocol;
  1189.     char login[MAX_LOGIN_SZ];
  1190.     char host[SQUIDHOSTNAMELEN + 1];
  1191.     char user_ident[USER_IDENT_SZ]; /* from proxy auth or ident server */
  1192.     u_short port;
  1193.     String urlpath;
  1194.     char *canonical;
  1195.     int link_count; /* free when zero */
  1196.     request_flags flags;
  1197.     HttpHdrCc *cache_control;
  1198.     HttpHdrRange *range;
  1199.     float http_ver;
  1200.     time_t ims;
  1201.     int imslen;
  1202.     int max_forwards;
  1203.     struct in_addr client_addr;
  1204.     struct in_addr my_addr;
  1205.     HttpHeader header;
  1206.     char *body;
  1207.     size_t body_sz;
  1208.     HierarchyLogEntry hier;
  1209.     err_type err_type;
  1210.     char *peer_login; /* Configured peer login:password */
  1211. };
  1212. struct _cachemgr_passwd {
  1213.     char *passwd;
  1214.     wordlist *actions;
  1215.     cachemgr_passwd *next;
  1216. };
  1217. struct _refresh_t {
  1218.     char *pattern;
  1219.     regex_t compiled_pattern;
  1220.     time_t min;
  1221.     double pct;
  1222.     time_t max;
  1223.     refresh_t *next;
  1224.     struct {
  1225. unsigned int icase:1;
  1226. #if HTTP_VIOLATIONS
  1227. unsigned int override_expire:1;
  1228. unsigned int override_lastmod:1;
  1229. unsigned int reload_into_ims:1;
  1230. unsigned int ignore_reload:1;
  1231. #endif
  1232.     } flags;
  1233. };
  1234. struct _CommWriteStateData {
  1235.     char *buf;
  1236.     size_t size;
  1237.     off_t offset;
  1238.     CWCB *handler;
  1239.     void *handler_data;
  1240.     FREE *free_func;
  1241. };
  1242. struct _ErrorState {
  1243.     err_type type;
  1244.     int page_id;
  1245.     http_status http_status;
  1246.     request_t *request;
  1247.     char *url;
  1248.     int xerrno;
  1249.     char *host;
  1250.     u_short port;
  1251.     char *dnsserver_msg;
  1252.     time_t ttl;
  1253.     struct in_addr src_addr;
  1254.     char *redirect_url;
  1255.     ERCB *callback;
  1256.     void *callback_data;
  1257.     struct {
  1258. unsigned int flag_cbdata:1;
  1259.     } flags;
  1260.     struct {
  1261. char *request;
  1262. char *reply;
  1263.     } ftp;
  1264.     char *request_hdrs;
  1265.     wordlist *ftp_server_msg;
  1266. };
  1267. /*
  1268.  * "very generic" histogram; 
  1269.  * see important comments on hbase_f restrictions in StatHist.c
  1270.  */
  1271. struct _StatHist {
  1272.     int *bins;
  1273.     int capacity;
  1274.     double min;
  1275.     double max;
  1276.     double scale;
  1277.     hbase_f *val_in; /* e.g., log() for log-based histogram */
  1278.     hbase_f *val_out; /* e.g., exp() for log based histogram */
  1279. };
  1280. /*
  1281.  * if you add a field to StatCounters, 
  1282.  * you MUST sync statCountersInitSpecial, statCountersClean, and statCountersCopy
  1283.  */
  1284. struct _StatCounters {
  1285.     struct {
  1286. int clients;
  1287. int requests;
  1288. int hits;
  1289. int errors;
  1290. kb_t kbytes_in;
  1291. kb_t kbytes_out;
  1292. kb_t hit_kbytes_out;
  1293. StatHist miss_svc_time;
  1294. StatHist nm_svc_time;
  1295. StatHist nh_svc_time;
  1296. StatHist hit_svc_time;
  1297. StatHist all_svc_time;
  1298.     } client_http;
  1299.     struct {
  1300. struct {
  1301.     int requests;
  1302.     int errors;
  1303.     kb_t kbytes_in;
  1304.     kb_t kbytes_out;
  1305. } all , http, ftp, other;
  1306.     } server;
  1307.     struct {
  1308. int pkts_sent;
  1309. int queries_sent;
  1310. int replies_sent;
  1311. int pkts_recv;
  1312. int queries_recv;
  1313. int replies_recv;
  1314. int hits_sent;
  1315. int hits_recv;
  1316. int replies_queued;
  1317. int replies_dropped;
  1318. kb_t kbytes_sent;
  1319. kb_t q_kbytes_sent;
  1320. kb_t r_kbytes_sent;
  1321. kb_t kbytes_recv;
  1322. kb_t q_kbytes_recv;
  1323. kb_t r_kbytes_recv;
  1324. StatHist query_svc_time;
  1325. StatHist reply_svc_time;
  1326. int query_timeouts;
  1327. int times_used;
  1328.     } icp;
  1329.     struct {
  1330. int requests;
  1331.     } unlink;
  1332.     struct {
  1333. StatHist svc_time;
  1334.     } dns;
  1335.     struct {
  1336. int times_used;
  1337. kb_t kbytes_sent;
  1338. kb_t kbytes_recv;
  1339. kb_t memory;
  1340. int msgs_sent;
  1341. int msgs_recv;
  1342. #if USE_CACHE_DIGESTS
  1343. cd_guess_stats guess;
  1344. #endif
  1345. StatHist on_xition_count;
  1346.     } cd;
  1347.     struct {
  1348. int times_used;
  1349.     } netdb;
  1350.     int page_faults;
  1351.     int select_loops;
  1352.     int select_fds;
  1353.     double select_time;
  1354.     double cputime;
  1355.     struct timeval timestamp;
  1356.     StatHist comm_icp_incoming;
  1357.     StatHist comm_http_incoming;
  1358.     StatHist select_fds_hist;
  1359.     struct {
  1360. struct {
  1361.     int opens;
  1362.     int closes;
  1363.     int reads;
  1364.     int writes;
  1365.     int seeks;
  1366.     int unlinks;
  1367. } disk;
  1368. struct {
  1369.     int accepts;
  1370.     int sockets;
  1371.     int connects;
  1372.     int binds;
  1373.     int closes;
  1374.     int reads;
  1375.     int writes;
  1376.     int recvfroms;
  1377.     int sendtos;
  1378. } sock;
  1379. #if HAVE_POLL
  1380. int polls;
  1381. #else
  1382. int selects;
  1383. #endif
  1384.     } syscalls;
  1385.     int swap_files_cleaned;
  1386.     int aborted_requests;
  1387. };
  1388. /* per header statistics */
  1389. struct _HttpHeaderStat {
  1390.     const char *label;
  1391.     HttpHeaderMask *owner_mask;
  1392.     StatHist hdrUCountDistr;
  1393.     StatHist fieldTypeDistr;
  1394.     StatHist ccTypeDistr;
  1395.     int parsedCount;
  1396.     int ccParsedCount;
  1397.     int destroyedCount;
  1398.     int busyDestroyedCount;
  1399. };
  1400. struct _tlv {
  1401.     char type;
  1402.     int length;
  1403.     void *value;
  1404.     tlv *next;
  1405. };
  1406. struct _storeSwapLogData {
  1407.     char op;
  1408.     int swap_file_number;
  1409.     time_t timestamp;
  1410.     time_t lastref;
  1411.     time_t expires;
  1412.     time_t lastmod;
  1413.     size_t swap_file_sz;
  1414.     u_short refcount;
  1415.     u_short flags;
  1416.     unsigned char key[MD5_DIGEST_CHARS];
  1417. };
  1418. /* object to track per-action memory usage (e.g. #idle objects) */
  1419. struct _MemMeter {
  1420.     size_t level; /* current level (count or volume) */
  1421.     size_t hwater_level; /* high water mark */
  1422.     time_t hwater_stamp; /* timestamp of last high water mark change */
  1423. };
  1424. /* object to track per-pool memory usage (alloc = inuse+idle) */
  1425. struct _MemPoolMeter {
  1426.     MemMeter alloc;
  1427.     MemMeter inuse;
  1428.     MemMeter idle;
  1429.     gb_t saved;
  1430.     gb_t total;
  1431. };
  1432. /* a pool is a [growing] space for objects of the same size */
  1433. struct _MemPool {
  1434.     const char *label;
  1435.     size_t obj_size;
  1436.     Stack pstack; /* stack for free pointers */
  1437.     MemPoolMeter meter;
  1438. };
  1439. struct _ClientInfo {
  1440.     /* first two items must be equivalent to hash_link */
  1441.     char *key;
  1442.     ClientInfo *next;
  1443.     struct in_addr addr;
  1444.     struct {
  1445. int result_hist[LOG_TYPE_MAX];
  1446. int n_requests;
  1447. kb_t kbytes_in;
  1448. kb_t kbytes_out;
  1449. kb_t hit_kbytes_out;
  1450.     } Http, Icp;
  1451.     struct {
  1452. time_t time;
  1453. int n_req;
  1454. int n_denied;
  1455.     } cutoff;
  1456. };
  1457. struct _CacheDigest {
  1458.     /* public, read-only */
  1459.     char *mask; /* bit mask */
  1460.     size_t mask_size; /* mask size in bytes */
  1461.     int capacity; /* expected maximum for .count, not a hard limit */
  1462.     int bits_per_entry; /* number of bits allocated for each entry from capacity */
  1463.     int count; /* number of digested entries */
  1464.     int del_count; /* number of deletions performed so far */
  1465. };
  1466. struct _FwdServer {
  1467.     peer *peer; /* NULL --> origin server */
  1468.     hier_code code;
  1469.     FwdServer *next;
  1470. };
  1471. struct _FwdState {
  1472.     int client_fd;
  1473.     StoreEntry *entry;
  1474.     request_t *request;
  1475.     FwdServer *servers;
  1476.     int server_fd;
  1477.     ErrorState *err;
  1478.     time_t start;
  1479.     int n_tries;
  1480.     struct {
  1481. unsigned int dont_retry:1;
  1482.     } flags;
  1483. };
  1484. #if USE_HTCP
  1485. struct _htcpReplyData {
  1486.     int hit;
  1487.     HttpHeader hdr;
  1488.     u_num32 msg_id;
  1489.     double version;
  1490.     struct {
  1491. /* cache-to-origin */
  1492. double rtt;
  1493. int samp;
  1494. int hops;
  1495.     } cto;
  1496. };
  1497. #endif
  1498. struct _helper_request {
  1499.     char *buf;
  1500.     HLPCB *callback;
  1501.     void *data;
  1502. };
  1503. struct _helper {
  1504.     wordlist *cmdline;
  1505.     dlink_list servers;
  1506.     dlink_list queue;
  1507.     const char *id_name;
  1508.     int n_to_start;
  1509.     int n_running;
  1510.     int ipc_type;
  1511.     time_t last_queue_warn;
  1512.     struct {
  1513. int requests;
  1514. int replies;
  1515. int queue_size;
  1516. int avg_svc_time;
  1517.     } stats;
  1518. };
  1519. struct _helper_server {
  1520.     int index;
  1521.     int rfd;
  1522.     int wfd;
  1523.     char *buf;
  1524.     size_t buf_sz;
  1525.     off_t offset;
  1526.     struct timeval dispatch_time;
  1527.     struct timeval answer_time;
  1528.     dlink_node link;
  1529.     helper *parent;
  1530.     helper_request *request;
  1531.     struct _helper_flags {
  1532. unsigned int alive:1;
  1533. unsigned int busy:1;
  1534. unsigned int closing:1;
  1535. unsigned int shutdown:1;
  1536.     } flags;
  1537.     struct {
  1538. int uses;
  1539.     } stats;
  1540. };
  1541. /*
  1542.  * use this when you need to pass callback data to a blocking
  1543.  * operation, but you don't want to add that pointer to cbdata
  1544.  */
  1545. struct _generic_cbdata {
  1546.     void *data;
  1547. };