[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-devel
Subject: [PATCH] second try at fixing up socklen issues on Solaris
From: Rob Napier <rnapier () employees ! org>
Date: 2001-04-04 21:22:01
[Download RAW message or body]
This one is a compromise between my original patch and some of
Oswald's comments. Oswald believes we should have a ksocks.h.in (or
other .h.in) to get ksocklen_t defined correctly (Oswald, please
correct me if I'm misquoting you). I don't like .h.in's if I can avoid
them (they make include files platform dependent). Besides, there's no
reason that callers should have to deal with a changeable parameter.
ksock should hide this platform annoyance IMO and simply accept
socklen_t (and define it for anyone who needs it).
My solution gets rid of ksocklen_t in preference to simply using
socklen_t (defining it in ksockaddr.h if needed). I still use ksize_t
in ksocks.cpp. Maybe it's a bad name for it (maybe *this* should be
ksocklen_t? or third_param_to_getsockname_t?), but it's a really good
typedef. I got rid of all the XOPEN checks as Oswald suggested.
Anyway, this seems to compile correctly on Solaris. Checks on Linux
are encouraged. I have not done a complete rebuild on Solaris to make
sure nothing else breaks, but I don't think it'll be a problem.
Thanks,
Rob
Index: kdecore/kextsock.cpp
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/kextsock.cpp,v
retrieving revision 1.11
diff -u -3 -p -r1.11 kextsock.cpp
--- kdecore/kextsock.cpp 2001/04/02 14:16:11 1.11
+++ kdecore/kextsock.cpp 2001/04/04 21:03:52
@@ -635,7 +635,7 @@ int KExtendedSocket::accept(KExtendedSoc
// if we have a timeout in place, we have to place this socket in non-blocking
// mode
bool block = blockingMode();
- ksize_t len = 0; // we don't really need the sockaddr now
+ socklen_t len = 0; // we don't really need the sockaddr now
sock = NULL;
if (d->timeout.tv_sec > 0 || d->timeout.tv_usec > 0)
@@ -822,7 +822,7 @@ int KExtendedSocket::connect()
// this means that an event occurred in the socket
int errcode;
- ksize_t len = sizeof(errcode);
+ socklen_t len = sizeof(errcode);
retval = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char*)&errcode,
&len);
if (retval == -1 || errcode != 0)
@@ -991,7 +991,7 @@ int KExtendedSocket::doLookup(const QStr
return err;
}
-int KExtendedSocket::resolve(sockaddr *sock, ksocklen_t len, QString &host,
+int KExtendedSocket::resolve(sockaddr *sock, socklen_t len, QString &host,
QString &port, int flags)
{
int err;
@@ -1056,7 +1056,7 @@ KSocketAddress *KExtendedSocket::localAd
{
KSocketAddress *local;
struct sockaddr static_sa, *sa = &static_sa;
- ksize_t len = sizeof(static_sa);
+ socklen_t len = sizeof(static_sa);
/* find out the socket length, in advance
* we use a sockaddr allocated on the heap just not to pass down
@@ -1094,7 +1094,7 @@ KSocketAddress *KExtendedSocket::peerAdd
{
KSocketAddress *peer;
struct sockaddr static_sa, *sa = &static_sa;
- ksize_t len = sizeof(static_sa);
+ socklen_t len = sizeof(static_sa);
/* find out the socket length, in advance
* we use a sockaddr allocated on the heap just not to pass down
Index: kdecore/kextsock.h
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/kextsock.h,v
retrieving revision 1.3
diff -u -3 -p -r1.3 kextsock.h
--- kdecore/kextsock.h 2001/03/26 22:17:31 1.3
+++ kdecore/kextsock.h 2001/04/04 21:03:52
@@ -502,7 +502,7 @@ public:
* @param port where the service-port will be written
* @param flags the same flags as getnameinfo()
*/
- static int resolve(sockaddr* sock, ksocklen_t len, QString& host, QString& port, int flags = 0);
+ static int resolve(sockaddr* sock, socklen_t len, QString& host, QString& port, int flags = 0);
static int resolve(KSocketAddress* sock, QString& host, QString& port, int flags = 0);
/**
Index: kdecore/ksock.cpp
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/ksock.cpp,v
retrieving revision 1.74
diff -u -3 -p -r1.74 ksock.cpp
--- kdecore/ksock.cpp 2001/04/02 14:16:11 1.74
+++ kdecore/ksock.cpp 2001/04/04 21:03:52
@@ -90,7 +90,7 @@ KSocket::KSocket( int _sock)
: sock(_sock), readNotifier(0), writeNotifier(0)
{
struct sockaddr_in sin;
- ksize_t len = sizeof(sin);
+ socklen_t len = sizeof(sin);
memset(&sin, 0, len);
Index: kdecore/ksockaddr.cpp
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/ksockaddr.cpp,v
retrieving revision 1.13
diff -u -3 -p -r1.13 ksockaddr.cpp
--- kdecore/ksockaddr.cpp 2001/03/29 04:14:31 1.13
+++ kdecore/ksockaddr.cpp 2001/04/04 21:03:55
@@ -86,7 +86,7 @@ KSocketAddress::KSocketAddress()
owndata = false;
}
-KSocketAddress::KSocketAddress(sockaddr* sa, ksocklen_t size)
+KSocketAddress::KSocketAddress(sockaddr* sa, socklen_t size)
{
if (sa != NULL)
{
@@ -123,7 +123,7 @@ int KSocketAddress::family() const
}
// This creates a new KSocketAddress with given sockaddr
-KSocketAddress* KSocketAddress::newAddress(struct sockaddr* sa, ksocklen_t size)
+KSocketAddress* KSocketAddress::newAddress(struct sockaddr* sa, socklen_t size)
{
if (size == 0)
{
@@ -244,13 +244,13 @@ KInetSocketAddress::KInetSocketAddress()
{
}
-KInetSocketAddress::KInetSocketAddress(const sockaddr_in* sin, ksocklen_t len) :
+KInetSocketAddress::KInetSocketAddress(const sockaddr_in* sin, socklen_t len) :
d(new Private)
{
setAddress(sin, len);
}
-KInetSocketAddress::KInetSocketAddress(const sockaddr_in6* sin6, ksocklen_t len) :
+KInetSocketAddress::KInetSocketAddress(const sockaddr_in6* sin6, socklen_t len) :
d(new Private)
{
setAddress(sin6, len);
@@ -281,7 +281,7 @@ KInetSocketAddress::~KInetSocketAddress(
// KSocketAddress::~KSocketAddress();
}
-bool KInetSocketAddress::setAddress(const sockaddr_in* sin, ksocklen_t len)
+bool KInetSocketAddress::setAddress(const sockaddr_in* sin, socklen_t len)
{
// This is supposed to be a AF_INET socket
if (len < sizeof(sockaddr_in) || sin->sin_family != AF_INET)
@@ -293,7 +293,7 @@ bool KInetSocketAddress::setAddress(cons
return setHost(sin->sin_addr) && setPort(ntohs(sin->sin_port));
}
-bool KInetSocketAddress::setAddress(const sockaddr_in6* sin6, ksocklen_t len)
+bool KInetSocketAddress::setAddress(const sockaddr_in6* sin6, socklen_t len)
{
#ifdef AF_INET6
// should be family AF_INET6
@@ -570,7 +570,7 @@ Q_UINT32 KInetSocketAddress::flowinfo()
return 0;
}
-ksocklen_t KInetSocketAddress::size() const
+socklen_t KInetSocketAddress::size() const
{
if (d->sockfamily == AF_INET)
return sizeof(d->sin);
@@ -659,7 +659,7 @@ KUnixSocketAddress::KUnixSocketAddress()
{
}
-KUnixSocketAddress::KUnixSocketAddress(sockaddr_un* _sun, ksocklen_t size) :
+KUnixSocketAddress::KUnixSocketAddress(sockaddr_un* _sun, socklen_t size) :
d(new Private)
{
setAddress(_sun, size);
@@ -676,7 +676,7 @@ KUnixSocketAddress::~KUnixSocketAddress(
delete d;
}
-bool KUnixSocketAddress::setAddress(sockaddr_un* _sun, ksocklen_t _size)
+bool KUnixSocketAddress::setAddress(sockaddr_un* _sun, socklen_t _size)
{
if (_sun->sun_family != AF_UNIX)
{
Index: kdecore/ksockaddr.h
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/ksockaddr.h,v
retrieving revision 1.6
diff -u -3 -p -r1.6 ksockaddr.h
--- kdecore/ksockaddr.h 2001/03/26 22:15:20 1.6
+++ kdecore/ksockaddr.h 2001/04/04 21:03:55
@@ -29,8 +29,12 @@
/*
* This file defines a class that envelopes most, if not all, socket addresses
*/
-typedef unsigned ksocklen_t;
+/* Not all platforms define socklen_t, so we'll do it for them */
+#ifndef socklen_t
+typedef unsigned socklen_t;
+#endif
+
struct sockaddr;
class KExtendedSocket; // No need to define it fully
@@ -56,7 +60,7 @@ protected:
/**
* Creates with given data
*/
- KSocketAddress(sockaddr* sa, ksocklen_t size);
+ KSocketAddress(sockaddr* sa, socklen_t size);
public:
/**
@@ -78,7 +82,7 @@ public:
/**
* Returns sockaddr structure size
*/
- virtual ksocklen_t size() const
+ virtual socklen_t size() const
{ return datasize; }
/**
@@ -125,7 +129,7 @@ public:
protected:
sockaddr* data;
- ksocklen_t datasize;
+ socklen_t datasize;
bool owndata;
private:
@@ -140,7 +144,7 @@ public:
* @param sa new socket address
* @param size new socket address's length
*/
- static KSocketAddress* newAddress(struct sockaddr*, ksocklen_t size);
+ static KSocketAddress* newAddress(struct sockaddr*, socklen_t size);
/**
* Returns the IANA family number of the given address family
@@ -192,13 +196,13 @@ public:
* Creates an IPv4 socket from raw sockaddr_in
* @param sin a sockaddr_in structure to copy from
*/
- KInetSocketAddress(const sockaddr_in* sin, ksocklen_t len);
+ KInetSocketAddress(const sockaddr_in* sin, socklen_t len);
/**
* Creates an IPv6 socket from raw sockaddr_in6
* @param sin6 a sockaddr_in6 structure to copy from
*/
- KInetSocketAddress(const sockaddr_in6* sin6, ksocklen_t len);
+ KInetSocketAddress(const sockaddr_in6* sin6, socklen_t len);
/**
* Creates a socket from information
@@ -230,13 +234,13 @@ public:
* Sets this socket to given raw socket
* @param sin the raw socket
*/
- bool setAddress(const sockaddr_in* sin, ksocklen_t len);
+ bool setAddress(const sockaddr_in* sin, socklen_t len);
/**
* Sets this socket to given raw socket
* @param sin6 the raw socket
*/
- bool setAddress(const sockaddr_in6* sin6, ksocklen_t len);
+ bool setAddress(const sockaddr_in6* sin6, socklen_t len);
/**
* Sets this socket to raw address and port
@@ -360,7 +364,7 @@ public:
* Returns the socket length
* Will be either sizeof(sockaddr_in) or sizeof(sockaddr_in6)
*/
- virtual ksocklen_t size() const; // should be socklen_t
+ virtual socklen_t size() const; // should be socklen_t
/* comparation */
@@ -427,7 +431,7 @@ public:
* @param raw_data raw data
* @param size data length
*/
- KUnixSocketAddress(sockaddr_un* raw_data, ksocklen_t size);
+ KUnixSocketAddress(sockaddr_un* raw_data, socklen_t size);
/**
* Constructor from pathname
@@ -445,7 +449,7 @@ public:
* @param socket_address socket address
* @param size the socket length
*/
- bool setAddress(sockaddr_un* socket_address, ksocklen_t size);
+ bool setAddress(sockaddr_un* socket_address, socklen_t size);
/**
* Sets this to given pathname
Index: kdecore/ksocks.cpp
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/ksocks.cpp,v
retrieving revision 1.12
diff -u -3 -p -r1.12 ksocks.cpp
--- kdecore/ksocks.cpp 2001/03/30 01:46:27 1.12
+++ kdecore/ksocks.cpp 2001/04/04 21:03:55
@@ -28,8 +28,8 @@
#include <sys/socket.h>
#include <unistd.h>
+#include <config.h>
-
// DO NOT RE-ORDER THESE.
enum SymbolKeys {
S_SOCKSinit = 0,
@@ -52,22 +52,22 @@ enum SymbolKeys {
extern "C" {
// Function pointer table
static int (*F_SOCKSinit) (char *);
-static int (*F_connect) (int, const struct sockaddr *, ksocklen_t);
+static int (*F_connect) (int, const struct sockaddr *, socklen_t);
static signed long int (*F_read) (int, void *, unsigned long int);
static signed long int (*F_write) (int, const void *, unsigned long int);
static int (*F_recvfrom) (int, void *, unsigned long int, int, struct sockaddr *,
- ksocklen_t *);
+ socklen_t *);
static int (*F_sendto) (int, const void *, unsigned long int, int,
- const struct sockaddr *, ksocklen_t);
+ const struct sockaddr *, socklen_t);
static int (*F_recv) (int, void *, unsigned long int, int);
static int (*F_send) (int, const void *, unsigned long int, int);
-static int (*F_getsockname) (int, struct sockaddr *, ksocklen_t *);
-static int (*F_getpeername) (int, struct sockaddr *, ksocklen_t *);
-static int (*F_accept) (int, struct sockaddr *, ksocklen_t *);
+static int (*F_getsockname) (int, struct sockaddr *, socklen_t *);
+static int (*F_getpeername) (int, struct sockaddr *, socklen_t *);
+static int (*F_accept) (int, struct sockaddr *, socklen_t *);
static int (*F_select) (int, fd_set *, fd_set *, fd_set *,
struct timeval *);
static int (*F_listen) (int, int);
-static int (*F_bind) (int, struct sockaddr *, ksocklen_t);
+static int (*F_bind) (int, struct sockaddr *, socklen_t);
};
@@ -292,7 +292,7 @@ KSocks::KSocks() : _socksLib(NULL), _st(
_socksLib->symbol(it.data().latin1());
break;
case S_connect:
- F_connect = (int (*)(int, const struct sockaddr *, ksocklen_t))
+ F_connect = (int (*)(int, const struct sockaddr *, socklen_t))
_socksLib->symbol(it.data().latin1());
break;
case S_read:
@@ -305,12 +305,12 @@ KSocks::KSocks() : _socksLib(NULL), _st(
break;
case S_recvfrom:
F_recvfrom = (int (*)(int, void *, unsigned long int, int,
- struct sockaddr *, ksocklen_t *))
+ struct sockaddr *, socklen_t *))
_socksLib->symbol(it.data().latin1());
break;
case S_sendto:
F_sendto = (int (*)(int, const void *, unsigned long int, int,
- const struct sockaddr *, ksocklen_t))
+ const struct sockaddr *, socklen_t))
_socksLib->symbol(it.data().latin1());
break;
case S_recv:
@@ -322,15 +322,15 @@ KSocks::KSocks() : _socksLib(NULL), _st(
_socksLib->symbol(it.data().latin1());
break;
case S_getsockname:
- F_getsockname = (int (*)(int, struct sockaddr *, ksocklen_t *))
+ F_getsockname = (int (*)(int, struct sockaddr *, socklen_t *))
_socksLib->symbol(it.data().latin1());
break;
case S_getpeername:
- F_getpeername = (int (*)(int, struct sockaddr *, ksocklen_t *))
+ F_getpeername = (int (*)(int, struct sockaddr *, socklen_t *))
_socksLib->symbol(it.data().latin1());
break;
case S_accept:
- F_accept = (int (*)(int, struct sockaddr *, ksocklen_t *))
+ F_accept = (int (*)(int, struct sockaddr *, socklen_t *))
_socksLib->symbol(it.data().latin1());
break;
case S_select:
@@ -342,7 +342,7 @@ KSocks::KSocks() : _socksLib(NULL), _st(
_socksLib->symbol(it.data().latin1());
break;
case S_bind:
- F_bind = (int (*)(int, struct sockaddr *, ksocklen_t))
+ F_bind = (int (*)(int, struct sockaddr *, socklen_t))
_socksLib->symbol(it.data().latin1());
break;
default:
@@ -420,10 +420,10 @@ void KSocks::enableSocks() {
*/
int KSocks::connect (int sockfd, const sockaddr *serv_addr,
- ksocklen_t addrlen) {
+ socklen_t addrlen) {
if (_useSocks && F_connect)
return (*F_connect)(sockfd, serv_addr, addrlen);
- else return ::connect(sockfd, serv_addr, addrlen);
+ else return ::connect(sockfd, serv_addr, (ksize_t *)addrlen);
}
@@ -442,18 +442,18 @@ signed long int KSocks::write (int fd, c
int KSocks::recvfrom (int s, void *buf, unsigned long int len, int flags,
- sockaddr *from, ksocklen_t *fromlen) {
+ sockaddr *from, socklen_t *fromlen) {
if (_useSocks && F_recvfrom)
return (*F_recvfrom)(s, buf, len, flags, from, fromlen);
- else return ::recvfrom(s, buf, len, flags, from, fromlen);
+ else return ::recvfrom(s, buf, len, flags, from, (ksize_t *)fromlen);
}
int KSocks::sendto (int s, const void *msg, unsigned long int len, int flags,
- const sockaddr *to, ksocklen_t tolen) {
+ const sockaddr *to, socklen_t tolen) {
if (_useSocks && F_sendto)
return (*F_sendto)(s, msg, len, flags, to, tolen);
- else return ::sendto(s, msg, len, flags, to, tolen);
+ else return ::sendto(s, msg, len, flags, to, (ksize_t)tolen);
}
@@ -471,24 +471,24 @@ int KSocks::send (int s, const void *msg
}
-int KSocks::getsockname (int s, sockaddr *name, ksocklen_t *namelen) {
+int KSocks::getsockname (int s, sockaddr *name, socklen_t *namelen) {
if (_useSocks && F_getsockname)
return (*F_getsockname)(s, name, namelen);
- else return ::getsockname(s, name, namelen);
+ else return ::getsockname(s, name, (ksize_t *)namelen);
}
-int KSocks::getpeername (int s, sockaddr *name, ksocklen_t *namelen) {
+int KSocks::getpeername (int s, sockaddr *name, socklen_t *namelen) {
if (_useSocks && F_getpeername)
return (*F_getpeername)(s, name, namelen);
- else return ::getpeername(s, name, namelen);
+ else return ::getpeername(s, name, (ksize_t *)namelen);
}
-int KSocks::accept (int s, sockaddr *addr, ksocklen_t *addrlen) {
+int KSocks::accept (int s, sockaddr *addr, socklen_t *addrlen) {
if (_useSocks && F_accept)
return (*F_accept)(s, addr, addrlen);
- else return ::accept(s, addr, addrlen);
+ else return ::accept(s, addr, (ksize_t *)addrlen);
}
@@ -507,10 +507,10 @@ int KSocks::listen (int s, int backlog)
}
-int KSocks::bind (int sockfd, sockaddr *my_addr, ksocklen_t addrlen) {
+int KSocks::bind (int sockfd, sockaddr *my_addr, socklen_t addrlen) {
if (_useSocks && F_bind)
return (*F_bind)(sockfd, my_addr, addrlen);
- else return ::bind(sockfd, my_addr, addrlen);
+ else return ::bind(sockfd, my_addr, (ksize_t)addrlen);
}
Index: kdecore/ksocks.h
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/ksocks.h,v
retrieving revision 1.6
diff -u -3 -p -r1.6 ksocks.h
--- kdecore/ksocks.h 2001/03/29 23:33:10 1.6
+++ kdecore/ksocks.h 2001/04/04 21:03:55
@@ -62,23 +62,23 @@ public:
** REIMPLEMENTATIONS OF LIBC SOCKET FUNCTIONS
**/
int connect (int sockfd, const sockaddr *serv_addr,
- ksocklen_t addrlen);
+ socklen_t addrlen);
signed long int read (int fd, void *buf, unsigned long int count);
signed long int write (int fd, const void *buf, unsigned long int count);
int recvfrom (int s, void *buf, unsigned long int len, int flags,
- sockaddr *from, ksocklen_t *fromlen);
+ sockaddr *from, socklen_t *fromlen);
int sendto (int s, const void *msg, unsigned long int len, int flags,
- const sockaddr *to, ksocklen_t tolen);
+ const sockaddr *to, socklen_t tolen);
int recv (int s, void *buf, unsigned long int len, int flags);
int send (int s, const void *msg, unsigned long int len, int flags);
- int getsockname (int s, sockaddr *name, ksocklen_t *namelen);
- int getpeername (int s, sockaddr *name, ksocklen_t *namelen);
- int accept (int s, sockaddr *addr, ksocklen_t *addrlen);
+ int getsockname (int s, sockaddr *name, socklen_t *namelen);
+ int getpeername (int s, sockaddr *name, socklen_t *namelen);
+ int accept (int s, sockaddr *addr, socklen_t *addrlen);
int select (int n, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
int listen (int s, int backlog);
int bind (int sockfd, sockaddr *my_addr,
- ksocklen_t addrlen);
+ socklen_t addrlen);
/*
* If you're using this, you're probably doing something wrong.
Index: kdecore/netsupp.cpp
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/netsupp.cpp,v
retrieving revision 1.6
diff -u -3 -p -r1.6 netsupp.cpp
--- kdecore/netsupp.cpp 2001/03/26 22:12:28 1.6
+++ kdecore/netsupp.cpp 2001/04/04 21:03:55
@@ -702,7 +702,7 @@ static void findport(unsigned short port
snprintf(serv, servlen, "%u", ntohs(port));
}
-int getnameinfo(const struct sockaddr *sa, ksocklen_t salen,
+int getnameinfo(const struct sockaddr *sa, socklen_t salen,
char *host, size_t hostlen, char *serv, size_t servlen,
int flags)
{
Index: kdecore/netsupp.h
===================================================================
RCS file: /home/projects/kdecvs/cvsroot/kdelibs/kdecore/netsupp.h,v
retrieving revision 1.5
diff -u -3 -p -r1.5 netsupp.h
--- kdecore/netsupp.h 2001/03/25 14:27:46 1.5
+++ kdecore/netsupp.h 2001/04/04 21:03:55
@@ -191,7 +191,7 @@ namespace KDE
extern void freeaddrinfo(struct addrinfo* ai);
extern char *gai_strerror(int errorcode);
extern int getnameinfo(const struct sockaddr *sa,
- ksocklen_t salen,
+ socklen_t salen,
char *host, size_t hostlen,
char *serv, size_t servlen,
int flags);
>> 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