diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/inspsocket.cpp | 6 | ||||
-rw-r--r-- | src/listensocket.cpp | 46 | ||||
-rw-r--r-- | src/socket.cpp | 8 |
3 files changed, 25 insertions, 35 deletions
diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index 5099df882..652799b9c 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -118,11 +118,6 @@ BufferedSocketError BufferedSocket::BeginConnect(const irc::sockets::sockaddrs& void StreamSocket::Close() { - /* Save this, so we dont lose it, - * otherise on failure, error messages - * might be inaccurate. - */ - int save = errno; if (this->fd > -1) { if (IOHook) @@ -142,7 +137,6 @@ void StreamSocket::Close() ServerInstance->SE->Close(this); fd = -1; } - errno = save; } CullResult StreamSocket::cull() diff --git a/src/listensocket.cpp b/src/listensocket.cpp index e77a585ef..6ae598ad3 100644 --- a/src/listensocket.cpp +++ b/src/listensocket.cpp @@ -17,40 +17,34 @@ #include "socket.h" #include "socketengine.h" -ListenSocket::ListenSocket(ConfigTag* tag, const std::string& addr, int port) +ListenSocket::ListenSocket(ConfigTag* tag, const irc::sockets::sockaddrs& bind_to) : bind_tag(tag) { - irc::sockets::sockaddrs bind_to; - - // canonicalize address if it is defined - if (!irc::sockets::aptosa(addr, port, bind_to)) - { - fd = -1; - return; - } irc::sockets::satoap(bind_to, bind_addr, bind_port); bind_desc = irc::sockets::satouser(bind_to); fd = socket(bind_to.sa.sa_family, SOCK_STREAM, 0); - if (this->fd > -1) - { - ServerInstance->SE->SetReuse(fd); - int rv = ServerInstance->SE->Bind(this->fd, bind_to); - if (rv >= 0) - rv = ServerInstance->SE->Listen(this->fd, ServerInstance->Config->MaxConn); + if (this->fd == -1) + return; - if (rv < 0) - { - ServerInstance->SE->Shutdown(this, 2); - ServerInstance->SE->Close(this); - this->fd = -1; - } - else - { - ServerInstance->SE->NonBlocking(this->fd); - ServerInstance->SE->AddFd(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE); - } + ServerInstance->SE->SetReuse(fd); + int rv = ServerInstance->SE->Bind(this->fd, bind_to); + if (rv >= 0) + rv = ServerInstance->SE->Listen(this->fd, ServerInstance->Config->MaxConn); + + if (rv < 0) + { + int errstore = errno; + ServerInstance->SE->Shutdown(this, 2); + ServerInstance->SE->Close(this); + this->fd = -1; + errno = errstore; + } + else + { + ServerInstance->SE->NonBlocking(this->fd); + ServerInstance->SE->AddFd(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE); } } diff --git a/src/socket.cpp b/src/socket.cpp index 0f2fbea22..0ceb40330 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -86,8 +86,9 @@ int InspIRCd::BindPorts(FailedPortList &failed_ports) while (0 != (portno = portrange.GetToken())) { irc::sockets::sockaddrs bindspec; - irc::sockets::aptosa(Addr, portno, bindspec); - std::string bind_readable = irc::sockets::satouser(bindspec); + if (!irc::sockets::aptosa(Addr, portno, bindspec)) + continue; + std::string bind_readable = bindspec.str(); bool skip = false; for (std::vector<ListenSocket*>::iterator n = old_ports.begin(); n != old_ports.end(); ++n) @@ -101,7 +102,8 @@ int InspIRCd::BindPorts(FailedPortList &failed_ports) } if (!skip) { - ListenSocket *ll = new ListenSocket(tag, Addr, portno); + ListenSocket* ll = new ListenSocket(tag, bindspec); + if (ll->GetFd() > -1) { bound++; |