]> git.ipfire.org Git - thirdparty/squid.git/blame - src/comm/TcpAcceptor.h
Docs: Copyright updates for 2018 (#114)
[thirdparty/squid.git] / src / comm / TcpAcceptor.h
CommitLineData
bbc27441 1/*
5b74111a 2 * Copyright (C) 1996-2018 The Squid Software Foundation and contributors
bbc27441
AJ
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
cbff89ba
AJ
9#ifndef SQUID_COMM_TCPACCEPTOR_H
10#define SQUID_COMM_TCPACCEPTOR_H
04f55905 11
fa720bfb 12#include "anyp/forward.h"
69bb9399
AJ
13#include "base/AsyncJob.h"
14#include "base/CbcPointer.h"
5b67dfa4 15#include "base/Subscription.h"
c8407295 16#include "comm/Flag.h"
f9b72e0c 17#include "comm/forward.h"
04f55905 18
6f09127c
AR
19class CommCloseCbParams;
20
97b8ac39
A
21namespace Comm
22{
04f55905 23
5b67dfa4
AJ
24class AcceptLimiter;
25
26/**
27 * Listens on a Comm::Connection for new incoming connections and
28 * emits an active Comm::Connection descriptor for the new client.
29 *
30 * Handles all event limiting required to quash inbound connection
31 * floods within the global FD limits of available Squid_MaxFD and
32 * client_ip_max_connections.
33 *
34 * Fills the emitted connection with all connection details able to
35 * be looked up. Currently these are the local/remote IP:port details
36 * and the listening socket transparent-mode flag.
37 */
cbff89ba 38class TcpAcceptor : public AsyncJob
04f55905 39{
5c2f68b7
AJ
40 CBDATA_CLASS(TcpAcceptor);
41
69bb9399
AJ
42public:
43 typedef CbcPointer<Comm::TcpAcceptor> Pointer;
44
a9870624 45private:
5b67dfa4
AJ
46 virtual void start();
47 virtual bool doneAll() const;
48 virtual void swanSong();
cbff89ba
AJ
49 virtual const char *status() const;
50
51 TcpAcceptor(const TcpAcceptor &); // not implemented.
04f55905
AJ
52
53public:
8bbb16e3 54 TcpAcceptor(const Comm::ConnectionPointer &conn, const char *note, const Subscription::Pointer &aSub);
fa720bfb 55 TcpAcceptor(const AnyP::PortCfgPointer &listenPort, const char *note, const Subscription::Pointer &aSub);
04f55905 56
0ba55a12 57 /** Subscribe a handler to receive calls back about new connections.
cbff89ba 58 * Unsubscribes any existing subscribed handler.
0ba55a12 59 */
5b67dfa4 60 void subscribe(const Subscription::Pointer &aSub);
0ba55a12
AJ
61
62 /** Remove the currently waiting callback subscription.
cbff89ba 63 * Already scheduled callbacks remain scheduled.
0ba55a12 64 */
5b67dfa4 65 void unsubscribe(const char *reason);
0ba55a12 66
4c5518e5
AJ
67 /** Try and accept another connection (synchronous).
68 * If one is pending already the subscribed callback handler will be scheduled
69 * to handle it before this method returns.
0ba55a12 70 */
04f55905 71 void acceptNext();
0ba55a12
AJ
72
73 /// Call the subscribed callback handler with details about a new connection.
c8407295 74 void notify(const Comm::Flag flag, const Comm::ConnectionPointer &details) const;
04f55905 75
1fc32b95 76 /// errno code of the last accept() or listen() action if one occurred.
04f55905
AJ
77 int errcode;
78
cbff89ba 79protected:
5b67dfa4
AJ
80 friend class AcceptLimiter;
81 int32_t isLimited; ///< whether this socket is delayed and on the AcceptLimiter queue.
cbff89ba
AJ
82
83private:
5b67dfa4 84 Subscription::Pointer theCallSub; ///< used to generate AsyncCalls handling our events.
0ba55a12 85
5b67dfa4
AJ
86 /// conn being listened on for new connections
87 /// Reserved for read-only use.
88 ConnectionPointer conn;
a9870624 89
fa720bfb
AJ
90 /// configuration details of the listening port (if provided)
91 AnyP::PortCfgPointer listenPort_;
92
6f09127c
AR
93 /// listen socket closure handler
94 AsyncCall::Pointer closer_;
95
903198a7 96 /// Method to test if there are enough file descriptors to open a new client connection
04f55905
AJ
97 /// if not the accept() will be postponed
98 static bool okToAccept();
99
100 /// Method callback for whenever an FD is ready to accept a client connection.
101 static void doAccept(int fd, void *data);
102
971581ee 103 void acceptOne();
c8407295 104 Comm::Flag oldAccept(Comm::ConnectionPointer &details);
273f66c4 105 void setListen();
6f09127c 106 void handleClosure(const CommCloseCbParams &io);
da6dbcd1
EB
107 /// whether we are listening on one of the squid.conf *ports
108 bool intendedForUserConnections() const { return bool(listenPort_); }
273f66c4 109};
04f55905 110
b0388924 111} // namespace Comm
04f55905 112
cbff89ba 113#endif /* SQUID_COMM_TCPACCEPTOR_H */
f53969cc 114