]> git.ipfire.org Git - thirdparty/squid.git/blob - src/fde.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / fde.h
1 /*
2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 #ifndef SQUID_FDE_H
10 #define SQUID_FDE_H
11
12 #include "comm.h"
13 #include "defines.h"
14 #include "ip/Address.h"
15 #include "ip/forward.h"
16 #include "security/forward.h"
17 #include "typedefs.h" //DRCB, DWCB
18
19 #if USE_DELAY_POOLS
20 class ClientInfo;
21 #endif
22
23 /**
24 * READ_HANDLER functions return < 0 if, and only if, they fail with an error.
25 * On error, they must pass back an error code in 'errno'.
26 */
27 typedef int READ_HANDLER(int, char *, int);
28
29 /**
30 * WRITE_HANDLER functions return < 0 if, and only if, they fail with an error.
31 * On error, they must pass back an error code in 'errno'.
32 */
33 typedef int WRITE_HANDLER(int, const char *, int);
34
35 class dwrite_q;
36 class _fde_disk
37 {
38 public:
39 DWCB *wrt_handle;
40 void *wrt_handle_data;
41 dwrite_q *write_q;
42 dwrite_q *write_q_tail;
43 off_t offset;
44 _fde_disk() { memset(this, 0, sizeof(_fde_disk)); }
45 };
46
47 class fde
48 {
49
50 public:
51 fde() { clear(); };
52
53 /// True if comm_close for this fd has been called
54 bool closing() { return flags.close_request; }
55
56 /* NOTE: memset is used on fdes today. 20030715 RBC */
57 static void DumpStats (StoreEntry *);
58
59 char const *remoteAddr() const;
60 void dumpStats (StoreEntry &, int);
61 bool readPending(int);
62 void noteUse();
63
64 public:
65
66 /// global table of FD and their state.
67 static fde* Table;
68
69 unsigned int type;
70 unsigned short remote_port;
71
72 Ip::Address local_addr;
73 tos_t tosToServer; /**< The TOS value for packets going towards the server.
74 See also tosFromServer. */
75 nfmark_t nfmarkToServer; /**< The netfilter mark for packets going towards the server.
76 See also nfmarkFromServer. */
77 int sock_family;
78 char ipaddr[MAX_IPSTRLEN]; /* dotted decimal address of peer */
79 char desc[FD_DESC_SZ];
80
81 struct _fde_flags {
82 bool open;
83 bool close_request; ///< true if file_ or comm_close has been called
84 bool write_daemon;
85 bool socket_eof;
86 bool nolinger;
87 bool nonblocking;
88 bool ipc;
89 bool called_connect;
90 bool nodelay;
91 bool close_on_exec;
92 bool read_pending;
93 //bool write_pending; //XXX seems not to be used
94 bool transparent;
95 } flags;
96
97 int64_t bytes_read;
98 int64_t bytes_written;
99
100 struct {
101 int uses; /* ie # req's over persistent conn */
102 } pconn;
103
104 #if USE_DELAY_POOLS
105 ClientInfo * clientInfo;/* pointer to client info used in client write limiter or NULL if not present */
106 #endif
107 unsigned epoll_state;
108
109 _fde_disk disk;
110 PF *read_handler;
111 void *read_data;
112 PF *write_handler;
113 void *write_data;
114 AsyncCall::Pointer timeoutHandler;
115 time_t timeout;
116 time_t writeStart;
117 void *lifetime_data;
118 AsyncCall::Pointer closeHandler;
119 AsyncCall::Pointer halfClosedReader; /// read handler for half-closed fds
120 READ_HANDLER *read_method;
121 WRITE_HANDLER *write_method;
122 Security::SessionPointer ssl;
123 Security::ContextPointer dynamicTlsContext; ///< cached and then freed when fd is closed
124 #if _SQUID_WINDOWS_
125 struct {
126 long handle;
127 } win32;
128 #endif
129 tos_t tosFromServer; /**< Stores the TOS flags of the packets from the remote server.
130 See FwdState::dispatch(). Note that this differs to
131 tosToServer in that this is the value we *receive* from the,
132 connection, whereas tosToServer is the value to set on packets
133 *leaving* Squid. */
134 unsigned int nfmarkFromServer; /**< Stores the Netfilter mark value of the connection from the remote
135 server. See FwdState::dispatch(). Note that this differs to
136 nfmarkToServer in that this is the value we *receive* from the,
137 connection, whereas nfmarkToServer is the value to set on packets
138 *leaving* Squid. */
139
140 /** Clear the fde class back to NULL equivalent. */
141 inline void clear() {
142 type = 0;
143 remote_port = 0;
144 local_addr.setEmpty();
145 tosToServer = '\0';
146 nfmarkToServer = 0;
147 sock_family = 0;
148 memset(ipaddr, '\0', MAX_IPSTRLEN);
149 memset(desc,'\0',FD_DESC_SZ);
150 memset(&flags,0,sizeof(_fde_flags));
151 bytes_read = 0;
152 bytes_written = 0;
153 pconn.uses = 0;
154 #if USE_DELAY_POOLS
155 clientInfo = NULL;
156 #endif
157 epoll_state = 0;
158 read_handler = NULL;
159 read_data = NULL;
160 write_handler = NULL;
161 write_data = NULL;
162 timeoutHandler = NULL;
163 timeout = 0;
164 writeStart = 0;
165 lifetime_data = NULL;
166 closeHandler = NULL;
167 halfClosedReader = NULL;
168 read_method = NULL;
169 write_method = NULL;
170 ssl.reset();
171 dynamicTlsContext.reset();
172 #if _SQUID_WINDOWS_
173 win32.handle = (long)NULL;
174 #endif
175 tosFromServer = '\0';
176 nfmarkFromServer = 0;
177 }
178 };
179
180 #define fd_table fde::Table
181
182 int fdNFree(void);
183
184 #define FD_READ_METHOD(fd, buf, len) (*fd_table[fd].read_method)(fd, buf, len)
185 #define FD_WRITE_METHOD(fd, buf, len) (*fd_table[fd].write_method)(fd, buf, len)
186
187 #endif /* SQUID_FDE_H */
188