[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