CSocket: Share code between connect() overloads

Both overloads should know how to set up a notifier callback in case
we get EINPROGRESS from connect().

It might be even better to merge the connect() overloads into a single
function..
This commit is contained in:
Andreas Kling 2019-09-11 19:44:15 +02:00
parent 1427c20f6a
commit 99970d7d4b
Notes: sideshowbarker 2024-07-19 12:09:34 +09:00
2 changed files with 23 additions and 27 deletions

View file

@ -63,8 +63,25 @@ bool CSocket::connect(const CSocketAddress& address, int port)
m_destination_address = address;
m_destination_port = port;
fflush(stdout);
int rc = ::connect(fd(), (struct sockaddr*)&addr, sizeof(addr));
return common_connect((struct sockaddr*)&addr, sizeof(addr));
}
bool CSocket::connect(const CSocketAddress& address)
{
ASSERT(!is_connected());
ASSERT(address.type() == CSocketAddress::Type::Local);
dbg() << *this << " connecting to " << address << "...";
sockaddr_un saddr;
saddr.sun_family = AF_LOCAL;
strcpy(saddr.sun_path, address.to_string().characters());
return common_connect((const sockaddr*)&saddr, sizeof(saddr));
}
bool CSocket::common_connect(const struct sockaddr* addr, socklen_t addrlen)
{
int rc = ::connect(fd(), addr, addrlen);
if (rc < 0) {
if (errno == EINPROGRESS) {
dbg() << *this << " connection in progress (EINPROGRESS)";
@ -78,33 +95,10 @@ bool CSocket::connect(const CSocketAddress& address, int port)
};
return true;
}
perror("connect");
exit(1);
} else {
dbg() << *this << " connected ok!";
m_connected = true;
if (on_connected)
on_connected();
}
return true;
}
bool CSocket::connect(const CSocketAddress& address)
{
ASSERT(!is_connected());
ASSERT(address.type() == CSocketAddress::Type::Local);
dbg() << *this << " connecting to " << address << "...";
sockaddr_un saddr;
saddr.sun_family = AF_LOCAL;
strcpy(saddr.sun_path, address.to_string().characters());
int rc = ::connect(fd(), (const sockaddr*)&saddr, sizeof(saddr));
if (rc < 0) {
perror("connect");
perror("CSocket::common_connect: connect");
return false;
}
dbg() << *this << " connected ok!";
m_connected = true;
if (on_connected)
on_connected();

View file

@ -50,6 +50,8 @@ protected:
private:
virtual bool open(CIODevice::OpenMode) override { ASSERT_NOT_REACHED(); }
bool common_connect(const struct sockaddr*, socklen_t);
Type m_type { Type::Invalid };
OwnPtr<CNotifier> m_notifier;
OwnPtr<CNotifier> m_read_notifier;