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