[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