BufferedSocketError BufferedSocket::BeginConnect(const irc::sockets::sockaddrs& dest, const irc::sockets::sockaddrs& bind, unsigned long timeout) { if (fd < 0) fd = socket(dest.sa.sa_family, SOCK_STREAM, 0); if (fd < 0) return I_ERR_SOCKET; if (bind.sa.sa_family != 0) { if (SocketEngine::Bind(fd, bind) < 0) return I_ERR_BIND; } SocketEngine::NonBlocking(fd); if (SocketEngine::Connect(this, &dest.sa, dest.sa_size()) == -1) { if (errno != EINPROGRESS) return I_ERR_CONNECT; } this->state = I_CONNECTING; if (!SocketEngine::AddFd(this, FD_WANT_NO_READ | FD_WANT_SINGLE_WRITE | FD_WRITE_WILL_BLOCK)) return I_ERR_NOMOREFDS; this->Timeout = new SocketTimeout(this->GetFd(), this, timeout); ServerInstance->Timers.AddTimer(this->Timeout); ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "BufferedSocket::DoConnect success"); return I_ERR_NONE; }
int SocketEngine::Bind(int fd, const irc::sockets::sockaddrs& addr) { return bind(fd, &addr.sa, addr.sa_size()); }