[prev in list] [next in list] [prev in thread] [next in thread]
List: kopete-devel
Subject: [kopete-devel] kopete Yahoo connect failure
From: Sverre Froyen <sverre () viewmark ! com>
Date: 2009-09-24 19:02:48
Message-ID: 200909241302.48883.sverre () viewmark ! com
[Download RAW message or body]
Hi,
The following patch allows kopete to connect to Yahoo Messenger when used on
NetBSD and possibly other BSD type systems.
Here's some background (from my earlier message to the list):
Ever since KDE4 I have been unable to connect to my Yahoo IM account with
kopete. I always get a "There was an error while connecting <user name> to
the Yahoo server. Error message: 17 remote host closed connection" error
message. A packet trace shows that kopete does not even attempt to
authenticate (and that it is the client that closes the connection). The
total set of packets is
client -> yahoo: SYN
yahoo -> client: SYN, ACK
client -> yahoo: ACK
client -> yahoo: FIN, ACK
yahoo -> client: ACK
yahoo -> client: FIN, ACK
client -> yahoo: ACK
After some investigation, I discovered that the root cause of the failure is
that the Yahoo connection socket has its mode set to read-only.
When the socket is set up by KBufferedSocket, the default mode is read-only.
Later the method connect is called with the hostname and port. At this point.
the KBufferedSocket instance is changed to to read-write but the internal
socket device (returned by the socketDevice() call) is still read-only. The
reason for that is that the call to KSocketDevice::connect follows the path
if (kde_connect(m_sockfd, address.address(), address.length()) == -1)
{
if (errno == EISCONN)
return true; <--- we end up here!!!
bypassing the open call (at the bottom of the function) that sets the mode to
read-write.
The following patch corrects this
--- kdecore/network/k3socketdevice.cpp.orig 2009-09-24 09:21:38.000000000
-0600
+++ kdecore/network/k3socketdevice.cpp 2009-09-24 09:23:15.000000000 -0600
@@ -352,9 +352,13 @@ bool KSocketDevice::connect(const KResol
if (kde_connect(m_sockfd, address.address(), address.length()) == -1)
{
if (errno == EISCONN)
- return true; // we're already connected
+ {
+ KActiveSocketBase::open(Unbuffered | mode);
+ return true; // we're already connected
+ }
else if (errno == EALREADY || errno == EINPROGRESS)
{
+ KActiveSocketBase::open(Unbuffered | mode);
setError(InProgress);
return true;
}
Adding the open call in the "else if" clause is not necessary to get kopete
working but seemed reasonable.
Regards,
Sverre
_______________________________________________
kopete-devel mailing list
kopete-devel@kde.org
https://mail.kde.org/mailman/listinfo/kopete-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic