]> git.ipfire.org Git - thirdparty/squid.git/blob - src/ipc/StartListening.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / ipc / StartListening.cc
1 /*
2 * Copyright (C) 1996-2016 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 54 Interprocess Communication */
10
11 #include "squid.h"
12 #include "base/TextException.h"
13 #include "comm.h"
14 #include "comm/Connection.h"
15 #include "ipc/SharedListen.h"
16 #include "ipc/StartListening.h"
17 #include "tools.h"
18
19 #include <cerrno>
20
21 Ipc::StartListeningCb::StartListeningCb(): conn(NULL), errNo(0)
22 {
23 }
24
25 Ipc::StartListeningCb::~StartListeningCb()
26 {
27 }
28
29 std::ostream &Ipc::StartListeningCb::startPrint(std::ostream &os) const
30 {
31 return os << "(" << conn << ", err=" << errNo;
32 }
33
34 void
35 Ipc::StartListening(int sock_type, int proto, const Comm::ConnectionPointer &listenConn,
36 FdNoteId fdNote, AsyncCall::Pointer &callback)
37 {
38 StartListeningCb *cbd = dynamic_cast<StartListeningCb*>(callback->getDialer());
39 Must(cbd);
40 cbd->conn = listenConn;
41
42 if (UsingSmp()) { // if SMP is on, share
43 OpenListenerParams p;
44 p.sock_type = sock_type;
45 p.proto = proto;
46 p.addr = listenConn->local;
47 p.flags = listenConn->flags;
48 p.fdNote = fdNote;
49 Ipc::JoinSharedListen(p, callback);
50 return; // wait for the call back
51 }
52
53 enter_suid();
54 comm_open_listener(sock_type, proto, cbd->conn, FdNote(fdNote));
55 cbd->errNo = Comm::IsConnOpen(cbd->conn) ? 0 : errno;
56 leave_suid();
57
58 debugs(54, 3, HERE << "opened listen " << cbd->conn);
59 ScheduleCallHere(callback);
60 }
61