]> git.ipfire.org Git - thirdparty/squid.git/blob - src/fde.cc
Source Format Enforcement (#532)
[thirdparty/squid.git] / src / fde.cc
1 /*
2 * Copyright (C) 1996-2020 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 /* DEBUG: section 05 Comm */
10
11 #include "squid.h"
12 #include "comm/Read.h"
13 #include "Debug.h"
14 #include "fd.h"
15 #include "fde.h"
16 #include "globals.h"
17 #include "SquidTime.h"
18 #include "Store.h"
19
20 fde *fde::Table = nullptr;
21
22 void
23 fde::setIo(READ_HANDLER *reader, WRITE_HANDLER *writer)
24 {
25 assert(reader);
26 assert(writer);
27 assert(!flags.read_pending); // this method is only meant for new FDs
28
29 readMethod_ = reader;
30 writeMethod_ = writer;
31 }
32
33 void
34 fde::useDefaultIo()
35 {
36 debugs(5, 7, "old read_pending=" << flags.read_pending);
37
38 // Some buffering readers are using external-to-them buffers (e.g., inBuf)
39 // and might leave true flags.read_pending behind without losing data. We
40 // must clear the flag here because default I/O methods do not know about it
41 // and will leave it set forever, resulting in I/O loops.
42 flags.read_pending = false;
43
44 readMethod_ = default_read_method;
45 writeMethod_ = default_write_method;
46 }
47
48 /// use I/O methods that maintain an internal-to-them buffer
49 void
50 fde::useBufferedIo(READ_HANDLER *bufferingReader, WRITE_HANDLER *bufferingWriter)
51 {
52 debugs(5, 7, "read_pending=" << flags.read_pending);
53
54 assert(bufferingReader);
55 assert(bufferingWriter);
56 // flags.read_pending ought to be false here, but these buffering methods
57 // can handle a stale true flag so we do not check or reset it
58
59 readMethod_ = bufferingReader;
60 writeMethod_ = bufferingWriter;
61 }
62
63 bool
64 fde::readPending(int fdNumber) const
65 {
66 if (type == FD_SOCKET)
67 return Comm::MonitorsRead(fdNumber);
68
69 return read_handler != nullptr;
70 }
71
72 void
73 fde::dumpStats(StoreEntry &dumpEntry, int fdNumber) const
74 {
75 if (!flags.open)
76 return;
77
78 #if _SQUID_WINDOWS_
79 storeAppendPrintf(&dumpEntry, "%4d 0x%-8lX %-6.6s %4d %7" PRId64 "%c %7" PRId64 "%c %-21s %s\n",
80 fdNumber,
81 win32.handle,
82 #else
83 storeAppendPrintf(&dumpEntry, "%4d %-6.6s %4d %7" PRId64 "%c %7" PRId64 "%c %-21s %s\n",
84 fdNumber,
85 #endif
86 fdTypeStr[type],
87 timeoutHandler ? (int) (timeout - squid_curtime) : 0,
88 bytes_read,
89 readPending(fdNumber) ? '*' : ' ',
90 bytes_written,
91 write_handler ? '*' : ' ',
92 remoteAddr(),
93 desc);
94 }
95
96 void
97 fde::DumpStats(StoreEntry *dumpEntry)
98 {
99 storeAppendPrintf(dumpEntry, "Active file descriptors:\n");
100 #if _SQUID_WINDOWS_
101 storeAppendPrintf(dumpEntry, "%-4s %-10s %-6s %-4s %-7s* %-7s* %-21s %s\n",
102 "File",
103 "Handle",
104 #else
105 storeAppendPrintf(dumpEntry, "%-4s %-6s %-4s %-7s* %-7s* %-21s %s\n",
106 "File",
107 #endif
108 "Type",
109 "Tout",
110 "Nread",
111 "Nwrite",
112 "Remote Address",
113 "Description");
114 #if _SQUID_WINDOWS_
115 storeAppendPrintf(dumpEntry, "---- ---------- ------ ---- -------- -------- --------------------- ------------------------------\n");
116 #else
117 storeAppendPrintf(dumpEntry, "---- ------ ---- -------- -------- --------------------- ------------------------------\n");
118 #endif
119
120 for (int i = 0; i < Squid_MaxFD; ++i) {
121 fde::Table[i].dumpStats(*dumpEntry, i);
122 }
123 }
124
125 char const *
126 fde::remoteAddr() const
127 {
128 static char buf[MAX_IPSTRLEN+7]; // 7 = length of ':port' strings
129 *buf = 0;
130
131 if (type == FD_SOCKET) {
132 if (*ipaddr)
133 snprintf(buf, sizeof(buf), "%s:%u", ipaddr, remote_port);
134 else
135 local_addr.toUrl(buf, sizeof(buf)); // toHostStr does not include port.
136 }
137
138 return buf;
139 }
140