// Worker process for connection listening UINT __cdecl CListener::ListenerWorker(LPVOID v) { CListener * Listener = (CListener *) v; // See _beginthread call for parameter definition SetThreadName("Listener"); Listener->Listen(); return 0; }
int main(int argc, char *argv[]) { signal(SIGCHLD, sigchld_hander); CListener listener = CListener(CHandler::Handler); int ret = listener.Listen(9999); if( ret < 0 ) { return 1; } listener.Run(); return 0; }
virtual bool OnLoad(const CString& sArgStr, CString& sMessage) { if (sArgStr.empty()) return true; // We don't accept any arguments, but for backwards // compatibility we have to do some magic here. sMessage = "Arguments converted to new syntax"; bool bSSL = false; bool bIPv6 = false; bool bShareIRCPorts = true; unsigned short uPort = 8080; CString sArgs(sArgStr); CString sPort; CString sListenHost; while (sArgs.Left(1) == "-") { CString sOpt = sArgs.Token(0); sArgs = sArgs.Token(1, true); if (sOpt.Equals("-IPV6")) { bIPv6 = true; } else if (sOpt.Equals("-IPV4")) { bIPv6 = false; } else if (sOpt.Equals("-noircport")) { bShareIRCPorts = false; } else { // Uhm... Unknown option? Let's just ignore all // arguments, older versions would have returned // an error and denied loading return true; } } // No arguments left: Only port sharing if (sArgs.empty() && bShareIRCPorts) return true; if (sArgs.find(" ") != CString::npos) { sListenHost = sArgs.Token(0); sPort = sArgs.Token(1, true); } else { sPort = sArgs; } if (sPort.Left(1) == "+") { sPort.TrimLeft("+"); bSSL = true; } if (!sPort.empty()) { uPort = sPort.ToUShort(); } if (!bShareIRCPorts) { // Make all existing listeners IRC-only const vector<CListener*>& vListeners = CZNC::Get().GetListeners(); vector<CListener*>::const_iterator it; for (it = vListeners.begin(); it != vListeners.end(); ++it) { (*it)->SetAcceptType(CListener::ACCEPT_IRC); } } // Now turn that into a listener instance CListener *pListener = new CListener(uPort, sListenHost, bSSL, (!bIPv6 ? ADDR_IPV4ONLY : ADDR_ALL), CListener::ACCEPT_HTTP); if (!pListener->Listen()) { sMessage = "Failed to add backwards-compatible listener"; return false; } CZNC::Get().AddListener(pListener); SetArgs(""); return true; }
void CClient::UserPortCommand(CString& sLine) { const CString sCommand = sLine.Token(0); if (sCommand.Equals("LISTPORTS")) { CTable Table; Table.AddColumn("Port"); Table.AddColumn("BindHost"); Table.AddColumn("SSL"); Table.AddColumn("Proto"); Table.AddColumn("IRC/Web"); vector<CListener*>::const_iterator it; const vector<CListener*>& vpListeners = CZNC::Get().GetListeners(); for (it = vpListeners.begin(); it < vpListeners.end(); ++it) { Table.AddRow(); Table.SetCell("Port", CString((*it)->GetPort())); Table.SetCell("BindHost", ((*it)->GetBindHost().empty() ? CString("*") : (*it)->GetBindHost())); Table.SetCell("SSL", CString((*it)->IsSSL())); EAddrType eAddr = (*it)->GetAddrType(); Table.SetCell("Proto", (eAddr == ADDR_ALL ? "All" : (eAddr == ADDR_IPV4ONLY ? "IPv4" : "IPv6"))); CListener::EAcceptType eAccept = (*it)->GetAcceptType(); Table.SetCell("IRC/Web", (eAccept == CListener::ACCEPT_ALL ? "All" : (eAccept == CListener::ACCEPT_IRC ? "IRC" : "Web"))); } PutStatus(Table); return; } CString sPort = sLine.Token(1); CString sAddr = sLine.Token(2); EAddrType eAddr = ADDR_ALL; if (sAddr.Equals("IPV4")) { eAddr = ADDR_IPV4ONLY; } else if (sAddr.Equals("IPV6")) { eAddr = ADDR_IPV6ONLY; } else if (sAddr.Equals("ALL")) { eAddr = ADDR_ALL; } else { sAddr.clear(); } unsigned short uPort = sPort.ToUShort(); if (sCommand.Equals("ADDPORT")) { CListener::EAcceptType eAccept = CListener::ACCEPT_ALL; CString sAccept = sLine.Token(3); if (sAccept.Equals("WEB")) { eAccept = CListener::ACCEPT_HTTP; } else if (sAccept.Equals("IRC")) { eAccept = CListener::ACCEPT_IRC; } else if (sAccept.Equals("ALL")) { eAccept = CListener::ACCEPT_ALL; } else { sAccept.clear(); } if (sPort.empty() || sAddr.empty() || sAccept.empty()) { PutStatus("Usage: AddPort <[+]port> <ipv4|ipv6|all> <web|irc|all> [bindhost]"); } else { bool bSSL = (sPort.Left(1).Equals("+")); const CString sBindHost = sLine.Token(4); CListener* pListener = new CListener(uPort, sBindHost, bSSL, eAddr, eAccept); if (!pListener->Listen()) { delete pListener; PutStatus("Unable to bind [" + CString(strerror(errno)) + "]"); } else { if (CZNC::Get().AddListener(pListener)) PutStatus("Port Added"); else PutStatus("Error?!"); } } } else if (sCommand.Equals("DELPORT")) { if (sPort.empty() || sAddr.empty()) { PutStatus("Usage: DelPort <port> <ipv4|ipv6|all> [bindhost]"); } else { const CString sBindHost = sLine.Token(3); CListener* pListener = CZNC::Get().FindListener(uPort, sBindHost, eAddr); if (pListener) { CZNC::Get().DelListener(pListener); PutStatus("Deleted Port"); } else { PutStatus("Unable to find a matching port"); } } } }