[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-devel
Subject: Re: Bug in KServerSocket
From: Matthias Welwarsky <matze () stud ! fbi ! fh-darmstadt ! de>
Date: 2001-06-24 14:39:45
[Download RAW message or body]
On Saturday 23 June 2001 15:46, Dawit Alemayehu wrote:
> On Friday 22 June 2001 18:52, Matthias Welwarsky wrote:
> > This bug should be fixed by the patch I sent to the list about a week
> > ago. http://lists.kde.org/?l=kde-devel&m=99285500522803&w=2
> >
> > Can someony please review this patch and decide if it's worth to become
> > included?
>
> Looks good to me, but I forwarded this message to the maintainer just the
> same. If he does not respond, I will commit it.
Just noticed that the patch introduces a bug (or at least changes the
behaviour of KSocket/KServerSocket::ipv4_addr()). Revised patch attached.
However ipv4_addr() is marked deprecated, according to the documentation,
still it used to return an ip address as long int in host byte order.
regards,
Matze
["ksock.cpp.patch" (text/x-c++)]
Index: ksock.cpp
===================================================================
RCS file: /cvs/kdelibs/kdecore/ksock.cpp,v
retrieving revision 1.79
diff -u -r1.79 ksock.cpp
--- ksock.cpp 2001/06/11 00:32:41 1.79
+++ ksock.cpp 2001/06/24 14:38:04
@@ -214,22 +214,19 @@
unsigned long KSocket::ipv4_addr()
{
unsigned long retval = 0;
- KSocketAddress *sa = KExtendedSocket::peerAddress(sock);
- if (sa == NULL)
+
+ // MW use KInetSocketAddress, no need to duplicate code
+ KInetSocketAddress *sa = dynamic_cast<KInetSocketAddress*>(KExtendedSocket::peerAddress(sock));
+ if (sa == NULL) // MW not a KInetSocketAddress or empty
return 0;
- if (sa->address() != NULL && (sa->address()->sa_family == PF_INET
-#ifdef PF_INET6
- || sa->address()->sa_family == PF_INET6
-#endif
- ))
- {
- KInetSocketAddress *ksin = (KInetSocketAddress*)sa;
- const sockaddr_in *sin = ksin->addressV4();
- if (sin != NULL)
- retval = *(unsigned long*)&sin->sin_addr; // I told you this was dumb
- }
- delete sa;
+ const sockaddr_in *sin = sa->addressV4();
+ if (sin != NULL) // MW V4 or convertible V6
+ retval = ntohl(sin->sin_addr.s_addr);
+
+ kdDebug() << "KSocket::ipv4_addr() = " << inet_ntoa(sin->sin_addr) << endl;
+
+ delete sa; // KExtendedSocket::peerAddress() allocates a new object, needs to be freed
return retval;
}
@@ -382,47 +379,33 @@
{
if (d == NULL || d->ks == NULL || sock == -1)
return 0;
- const KSocketAddress *sa = d->ks->localAddress();
- if (sa == NULL)
+
+ // MW use KInetSocketAddress
+ // why would we want to duplicate code?
+ const KInetSocketAddress *sa = dynamic_cast<const KInetSocketAddress*>(d->ks->localAddress());
+ if (sa == NULL) // MW not a KInetSocketAddress or empty
return 0;
- // we can use sockaddr_in here even if it isn't IPv4
- sockaddr_in *sin = (sockaddr_in*)sa->address();
+ return sa->port();
- if (sin->sin_family == PF_INET)
- // correct family
- return sin->sin_port;
-#ifdef PF_INET6
- else if (sin->sin_family == PF_INET6)
- {
- kde_sockaddr_in6 *sin6 = (kde_sockaddr_in6*)sin;
- return sin6->sin6_port;
- }
-#endif
- return 0; // not a port we know
}
unsigned long KServerSocket::ipv4_addr()
{
if (d == NULL || d->ks == NULL || sock == -1)
return 0;
- const KSocketAddress *sa = d->ks->localAddress();
-
- const sockaddr_in *sin = (sockaddr_in*)sa->address();
- if (sin->sin_family == PF_INET)
- // correct family
- return ntohl(*(unsigned long*)&sin->sin_addr);
-#ifdef PF_INET6
- else if (sin->sin_family == PF_INET6)
- {
- KInetSocketAddress *ksin = (KInetSocketAddress*)sa;
- sin = ksin->addressV4();
- if (sin != NULL)
- return *(unsigned long*)&sin->sin_addr;
- }
-#endif
- return 0; // this is dumb, isn't it?
+ const KInetSocketAddress *sa = dynamic_cast<const KInetSocketAddress*>(d->ks->localAddress());
+ if (sa == NULL) // MW not a KInetSocketAddress or empty
+ return 0;
+
+ const sockaddr_in *sin = sa->addressV4();
+ if (sin == NULL) // MW not convertible
+ return 0;
+
+ kdDebug() << "KServerSocket::ipv4_addr() = " << inet_ntoa(sin->sin_addr) << endl;
+
+ return ntohl(sin->sin_addr.s_addr);
}
void KServerSocket::slotAccept( int )
@@ -436,7 +419,7 @@
kdWarning(170) << "Error accepting\n";
return;
}
-
+
int new_sock = s->fd();
s->release(); // we're getting rid of the KExtendedSocket
delete s;
>> Visit http://master.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic