X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspsocket.cpp;h=f075aecc6ab8bae42dba2b27717e3d46e32f97e7;hb=d4685e02b55229e0ca5068b839c87b5a80180f33;hp=684ee051dd96cdc4ede09f68895a785912672ad8;hpb=de7011e54ad88656e01c92a88dd053a94b5acc6b;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index 684ee051d..f075aecc6 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -1,12 +1,18 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2009 Daniel De Graaf - * Copyright (C) 2007-2009 Robin Burchell - * Copyright (C) 2008 Thomas Stagner - * Copyright (C) 2006-2007 Craig Edwards + * Copyright (C) 2020 Matt Schatz + * Copyright (C) 2019 linuxdaemon + * Copyright (C) 2018 Dylan Frank + * Copyright (C) 2013-2016 Attila Molnar + * Copyright (C) 2013, 2017-2020 Sadie Powell + * Copyright (C) 2013 Adam + * Copyright (C) 2012 Robby + * Copyright (C) 2009-2010 Daniel De Graaf + * Copyright (C) 2007-2008 Robin Burchell + * Copyright (C) 2007 John Brooks * Copyright (C) 2007 Dennis Friis - * Copyright (C) 2006 Oliver Lupton + * Copyright (C) 2007 Craig Edwards * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public @@ -44,7 +50,7 @@ BufferedSocket::BufferedSocket(int newfd) Timeout = NULL; this->fd = newfd; this->state = I_CONNECTED; - if (fd > -1) + if (HasFd()) SocketEngine::AddFd(this, FD_WANT_FAST_READ | FD_WANT_EDGE_WRITE); } @@ -61,10 +67,10 @@ void BufferedSocket::DoConnect(const irc::sockets::sockaddrs& dest, const irc::s BufferedSocketError BufferedSocket::BeginConnect(const irc::sockets::sockaddrs& dest, const irc::sockets::sockaddrs& bind, unsigned int timeout) { - if (fd < 0) + if (!HasFd()) fd = socket(dest.family(), SOCK_STREAM, 0); - if (fd < 0) + if (!HasFd()) return I_ERR_SOCKET; if (bind.family() != 0) @@ -99,7 +105,7 @@ void StreamSocket::Close() return; closing = true; - if (this->fd > -1) + if (HasFd()) { // final chance, dump as much of the sendq as we can DoWrite(); @@ -224,7 +230,7 @@ void StreamSocket::DoWrite() return; } - if (!error.empty() || fd < 0) + if (!error.empty() || !HasFd()) { ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "DoWrite on errored or closed socket"); return; @@ -364,7 +370,7 @@ bool StreamSocket::OnSetEndPoint(const irc::sockets::sockaddrs& local, const irc void StreamSocket::WriteData(const std::string &data) { - if (fd < 0) + if (!HasFd()) { ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "Attempt to write data to dead socket: %s", data.c_str()); @@ -505,6 +511,18 @@ IOHook* StreamSocket::GetModHook(Module* mod) const return NULL; } +IOHook* StreamSocket::GetLastHook() const +{ + IOHook* curr = GetIOHook(); + IOHook* last = curr; + + for (; curr; curr = GetNextHook(curr)) + last = curr; + + return last; +} + + void StreamSocket::AddIOHook(IOHook* newhook) { IOHook* curr = GetIOHook(); @@ -541,3 +559,17 @@ size_t StreamSocket::getSendQSize() const } return ret; } + +void StreamSocket::SwapInternals(StreamSocket& other) +{ + if (type != other.type) + return; + + EventHandler::SwapInternals(other); + std::swap(closeonempty, other.closeonempty); + std::swap(closing, other.closing); + std::swap(error, other.error); + std::swap(iohook, other.iohook); + std::swap(recvq, other.recvq); + std::swap(sendq, other.sendq); +}