• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdecore
 

tdecore

  • tdecore
ksockaddr.cpp
1 /*
2  * This file is part of the KDE libraries
3  * Copyright (C) 2000-2002 Thiago Macieira <thiago.macieira@kdemail.net>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB. If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  **/
20 
21 #include "ksockaddr.h"
22 #include <config.h>
23 
24 #include <sys/types.h>
25 
26 #ifdef Q_OS_UNIX
27 #include <arpa/inet.h>
28 #endif
29 #include <netinet/in.h>
30 
31 #include <limits.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <sys/un.h>
35 #include <unistd.h>
36 
37 #include <tqglobal.h>
38 #include <tqfile.h>
39 
40 #include "kdebug.h"
41 #include "tdelocale.h"
42 //#include "kextsock.h"
43 
44 #ifndef HAVE_STRUCT_SOCKADDR_IN6
45 // The system doesn't have sockaddr_in6
46 // But we can tell netsupp.h to define it for us, according to the RFC
47 #define CLOBBER_IN6
48 #endif
49 
50 #include "netsupp.h"
51 
52 #define V6_CAN_CONVERT_TO_V4(addr) (KDE_IN6_IS_ADDR_V4MAPPED(addr) || KDE_IN6_IS_ADDR_V4COMPAT(addr))
53 
54 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
55 # define MY_MAX(a, b) ((a) > (b) ? (a) : (b))
56 # define MIN_SOCKADDR_LEN MY_MAX(offsetof(sockaddr, sa_family) + sizeof(((sockaddr*)0)->sa_family), \
57  offsetof(sockaddr, sa_len) + sizeof(((sockaddr*)0)->sa_len))
58 #else
59 # define MIN_SOCKADDR_LEN (offsetof(sockaddr, sa_family) + sizeof(((sockaddr*)0)->sa_family))
60 #endif
61 
62 // Minimum size accepted for sockaddr_in6 sockets.
63 // The scopeid field is missing from some implementations
64 // that conform to the obsoleted RFC 2133, e.g. Linux glibc 2.1
65 #define MIN_SOCKADDR_IN6_LEN (offsetof(sockaddr_in6, sin6_addr) + sizeof(((sockaddr_in6*)0)->sin6_addr))
66 
67 #ifdef offsetof
68 #undef offsetof
69 #endif
70 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
71 
72 // This is how it is
73 // 46 == strlen("1234:5678:9abc:def0:1234:5678:255.255.255.255")
74 #ifndef INET6_ADDRSTRLEN
75 #define INET6_ADDRSTRLEN 46
76 #endif
77 
78 
83 TDESocketAddress::TDESocketAddress(const sockaddr* sa, ksocklen_t size)
84 {
85  if ( !sa )
86  init();
87  else {
88  data = (sockaddr*)malloc(size);
89  if (data == NULL)
90  return;
91  memcpy(data, sa, size);
92  datasize = size;
93  owndata = true;
94  }
95 }
96 
97 void TDESocketAddress::init()
98 {
99  data = NULL;
100  datasize = 0;
101  owndata = false;
102 }
103 
104 TDESocketAddress::~TDESocketAddress()
105 {
106  if (owndata && data != NULL)
107  free(data);
108 }
109 
110 TQString TDESocketAddress::pretty() const
111 {
112  return i18n("<unknown socket>");
113 }
114 
115 int TDESocketAddress::family() const
116 {
117  if (data != NULL)
118  return data->sa_family;
119  return AF_UNSPEC;
120 }
121 
122 // This creates a new TDESocketAddress with given sockaddr
123 TDESocketAddress* TDESocketAddress::newAddress(const struct sockaddr* sa, ksocklen_t size)
124 {
125  if (size == 0)
126  {
127  kdWarning() << "TDESocketAddress::newAddress called with size = 0!\n";
128  return NULL;
129  }
130 
131  // make sure we have the right stuff
132  if (size < MIN_SOCKADDR_LEN)
133  {
134  kdWarning() << "TDESocketAddress::newAddress called with invalid size\n";
135  return NULL;
136  }
137 
138  switch (sa->sa_family)
139  {
140  case AF_INET:
141  if (size >= sizeof(sockaddr_in))
142  return new KInetSocketAddress((const sockaddr_in*)sa, size);
143  return NULL;
144 
145 #ifdef AF_INET6
146  case AF_INET6:
147  if (size >= MIN_SOCKADDR_IN6_LEN)
148  return new KInetSocketAddress((const sockaddr_in6*)sa, size);
149  return NULL;
150 #endif
151 
152  case AF_UNIX: // AF_LOCAL
153  return new KUnixSocketAddress((const sockaddr_un*)sa, size);
154  }
155 
156  return new TDESocketAddress(sa, size);
157 }
158 
159 bool TDESocketAddress::isEqual(const TDESocketAddress& other) const
160 {
161  switch(family())
162  {
163  case AF_INET:
164  return KInetSocketAddress::areEqualInet(*this, other, false);
165 #ifdef AF_INET6
166  case AF_INET6:
167  return KInetSocketAddress::areEqualInet6(*this, other, false);
168 #endif
169  case AF_UNIX: // AF_LOCAL
170  return KUnixSocketAddress::areEqualUnix(*this, other, false);
171  }
172 
173  // This is not a known socket type
174  if (other.datasize != datasize)
175  return false; // can't be equal
176  return memcmp(data, other.data, datasize) == 0;
177 }
178 
179 bool TDESocketAddress::isCoreEqual(const TDESocketAddress& other) const
180 {
181  switch(family())
182  {
183  case AF_INET:
184  return KInetSocketAddress::areEqualInet(*this, other, true);
185 #ifdef AF_INET6
186  case AF_INET6:
187  return KInetSocketAddress::areEqualInet6(*this, other, true);
188 #endif
189  case AF_UNIX: // AF_LOCAL
190  return KUnixSocketAddress::areEqualUnix(*this, other, true);
191  }
192 
193  return false;
194 }
195 
196 TQString TDESocketAddress::nodeName() const
197 {
198  return TQString::null;
199 }
200 
201 TQString TDESocketAddress::serviceName() const
202 {
203  return TQString::null;
204 }
205 
206 int TDESocketAddress::ianaFamily(int af)
207 {
208  switch (af)
209  {
210  case AF_INET:
211  return 1;
212 #ifdef AF_INET6
213  case AF_INET6:
214  return 2;
215 #endif
216  default:
217  return 0;
218  }
219 }
220 
221 int TDESocketAddress::fromIanaFamily(int iana)
222 {
223  switch (iana)
224  {
225  case 1:
226  return AF_INET;
227 #ifdef AF_INET6
228  case 2:
229  return AF_INET6;
230 #endif
231  default:
232  return AF_UNSPEC;
233  }
234 }
235 
239 class KInetSocketAddressPrivate
240 {
241 public:
242  int sockfamily;
243  sockaddr_in sin;
244 #ifdef AF_INET6
245  sockaddr_in6 sin6;
246 #endif
247 
248  KInetSocketAddressPrivate() :
249  sockfamily(AF_UNSPEC)
250  {
251  sin.sin_family = AF_INET;
252  sin.sin_port = 0;
253 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
254  sin.sin_len = sizeof(sin);
255 #endif
256 #ifdef AF_INET6
257  sin6.sin6_family = AF_INET6;
258  sin6.sin6_port = 0;
259  sin6.sin6_flowinfo = 0;
260 # ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
261  sin6.sin6_scope_id = 0;
262 # endif
263 # ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
264  sin6.sin6_len = sizeof(sin6);
265 # endif
266 #endif
267  }
268 
269 };
270 
271 KInetSocketAddress::KInetSocketAddress() :
272  d(new KInetSocketAddressPrivate)
273 {
274 }
275 
276 KInetSocketAddress::KInetSocketAddress(const KInetSocketAddress &other) :
277  TDESocketAddress(), d(new KInetSocketAddressPrivate)
278 {
279  setAddress(other);
280 }
281 
282 KInetSocketAddress::KInetSocketAddress(const sockaddr_in* sin, ksocklen_t len) :
283  d(new KInetSocketAddressPrivate)
284 {
285  setAddress(sin, len);
286 }
287 
288 KInetSocketAddress::KInetSocketAddress(const sockaddr_in6* sin6, ksocklen_t len) :
289  d(new KInetSocketAddressPrivate)
290 {
291  setAddress(sin6, len);
292 }
293 
294 KInetSocketAddress::KInetSocketAddress(const in_addr& addr, unsigned short port) :
295  d(new KInetSocketAddressPrivate)
296 {
297  setAddress(addr, port);
298 }
299 
300 KInetSocketAddress::KInetSocketAddress(const in6_addr& addr, unsigned short port) :
301  d(new KInetSocketAddressPrivate)
302 {
303  setAddress(addr, port);
304 }
305 
306 KInetSocketAddress::KInetSocketAddress(const TQString& addr, unsigned short port, int family) :
307  d(new KInetSocketAddressPrivate)
308 {
309  setAddress(addr, port, family);
310 }
311 
312 KInetSocketAddress::~KInetSocketAddress()
313 {
314  delete d;
315 
316  // TDESocketAddress::~TDESocketAddress();
317 }
318 
319 bool KInetSocketAddress::setAddress(const KInetSocketAddress &other)
320 {
321  if (other.family() == AF_INET)
322  return setAddress(other.addressV4(), other.size());
323 #ifdef AF_INET6
324  else if (other.family() == AF_INET6)
325  return setAddress(other.addressV6(), other.size());
326 #endif
327  return false;
328 }
329 
330 bool KInetSocketAddress::setAddress(const sockaddr_in* sin, ksocklen_t len)
331 {
332  // This is supposed to be a AF_INET socket
333  if ((len < sizeof(sockaddr_in)) || (sin->sin_family != AF_INET))
334  {
335  kdWarning() << "KInetSocketAddress::setAddress(sockaddr_in*) called with invalid sockaddr_in\n";
336  return false;
337  }
338 
339  return setHost(sin->sin_addr) && setPort(ntohs(sin->sin_port));
340 }
341 
342 bool KInetSocketAddress::setAddress(const sockaddr_in6* sin6, ksocklen_t len)
343 {
344 #ifdef AF_INET6
345  // should be family AF_INET6
346  if ((len < MIN_SOCKADDR_IN6_LEN) || (sin6->sin6_family != AF_INET6))
347  {
348  kdWarning() << "KInetSocketAddress::setAddress(sockaddr_in6*) called with invalid sockaddr_in6\n";
349  return 0;
350  }
351 
352  memset(&d->sin6, 0, sizeof(d->sin6));
353  if (len > sizeof(d->sin6))
354  len = sizeof(d->sin6);
355  memcpy(&d->sin6, sin6, len);
356 
357  /* Now make a sanity check */
358  d->sockfamily = d->sin6.sin6_family = AF_INET6;
359 # ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
360  d->sin6.sin6_len = sizeof(d->sin6);
361 # endif
362 
363  fromV6();
364  return true;
365 #else // !AF_INET6
366  return false;
367 #endif
368 }
369 
370 bool KInetSocketAddress::setAddress(const in_addr& addr, unsigned short port)
371 {
372  return setHost(addr) && setPort(port);
373 }
374 
375 bool KInetSocketAddress::setAddress(const in6_addr& addr, unsigned short port)
376 {
377  return setHost(addr) && setPort(port);
378 }
379 
380 bool KInetSocketAddress::setAddress(const TQString& addr, unsigned short port, int family)
381 {
382  return setHost(addr, family) && setPort(port);
383 }
384 
385 bool KInetSocketAddress::setHost(const in_addr& addr)
386 {
387  d->sockfamily = AF_INET; // set address to IPv4 type
388  d->sin.sin_addr = addr;
389  fromV4();
390  return true;
391 }
392 
393 bool KInetSocketAddress::setHost(const in6_addr& addr)
394 {
395 #ifdef AF_INET6
396  d->sockfamily = AF_INET6; // set address to IPv6 type
397  d->sin6.sin6_addr = addr;
398  fromV6();
399  return true;
400 #else
401  return false;
402 #endif
403 }
404 
405 bool KInetSocketAddress::setHost(const TQString& addr, int family)
406 {
407  // if family == -1, we'll try to guess the host name
408  if ((family != -1) && (family != AF_INET)
409 #ifdef AF_INET6
410  && (family != AF_INET6)
411 #endif
412  )
413  {
414  kdWarning() << "KInetSocketAddress::setHost(TQString, int) called with unknown family address\n";
415  return false;
416  }
417 
418  if (family == -1)
419  {
420  // guess the family type
421 
422 #ifdef AF_INET6
423  // IPv6 addresses MUST contain colons (:) and IPv4 addresses must not
424  if (addr.find(':') != -1)
425  family = AF_INET6;
426  else
427  family = AF_INET;
428 #else
429 
430  // There's only one guess:
431  family = AF_INET;
432 #endif
433  }
434 
435  /*
436  * FIXME! What is the decoding process for hostnames?
437  */
438  if (family == AF_INET)
439  {
440  inet_pton(family, addr.latin1(), (void*)&(d->sin.sin_addr));
441  fromV4();
442  }
443 #ifdef AF_INET6
444  else
445  {
446  inet_pton(family, addr.latin1(), (void*)&(d->sin6.sin6_addr));
447  fromV6();
448  }
449 #endif
450  d->sockfamily = family;
451  return true;
452 }
453 
454 bool KInetSocketAddress::setPort(unsigned short port)
455 {
456  // set port on all socket types
457  d->sin.sin_port = htons(port);
458 #ifdef AF_INET6
459  d->sin6.sin6_port = htons(port);
460 #endif
461 
462  return true;
463 }
464 
465 bool KInetSocketAddress::setFamily(int _family)
466 {
467  if (_family != AF_INET
468 #ifdef AF_INET6
469  && _family != AF_INET6
470 #endif
471  )
472  {
473  kdWarning() << "KInetSocketAddress::setFamily(int) called with unknown family\n";
474  return false;
475  }
476 
477  d->sockfamily = _family;
478  if (_family == AF_INET)
479  fromV4();
480 #ifdef AF_INET6
481  else if (_family == AF_INET6)
482  fromV6();
483 #endif
484 
485  return true;
486 }
487 
488 bool KInetSocketAddress::setFlowinfo(TQ_UINT32 flowinfo)
489 {
490 #ifdef AF_INET6
491  if (d->sockfamily == AF_INET6)
492  {
493  d->sin6.sin6_flowinfo = flowinfo;
494  return true;
495  }
496 #endif
497  return false;
498 }
499 
500 bool KInetSocketAddress::setScopeId(int scopeid)
501 {
502 #if defined(AF_INET6) && defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID)
503  if (d->sockfamily == AF_INET6)
504  {
505  d->sin6.sin6_scope_id = scopeid;
506  return true;
507  }
508 #endif
509  (void)scopeid;
510  return false;
511 }
512 
513 const sockaddr_in* KInetSocketAddress::addressV4() const
514 {
515  if (d->sockfamily == AF_INET)
516  return &d->sin;
517 #ifdef AF_INET6
518  else if (d->sockfamily == AF_INET6)
519  {
520  // check if this IPv6 address was converted without loss
521  if (V6_CAN_CONVERT_TO_V4(&d->sin6.sin6_addr))
522  return &d->sin;
523  else
524  return NULL; // there was loss, so return nothing
525  }
526 #endif
527 
528  kdWarning() << "KInetSocketAddress::addressV4() called on uninitialized socket\n";
529  return NULL;
530 }
531 
532 const sockaddr_in6* KInetSocketAddress::addressV6() const
533 {
534 #ifdef AF_INET6
535  return &d->sin6;
536 #else
537  return NULL;
538 #endif
539 }
540 
541 in_addr KInetSocketAddress::hostV4() const
542 {
543  // this might be empty
544  return d->sin.sin_addr;
545 }
546 
547 /*
548  * ATTENTION
549  * This function is left undefined if no IPv6 support exists
550  * This is intentional
551  */
552 #ifdef AF_INET6
553 in6_addr KInetSocketAddress::hostV6() const
554 {
555  return d->sin6.sin6_addr;
556 }
557 #endif
558 
559 TQString KInetSocketAddress::pretty() const
560 {
561  if (d->sockfamily != AF_INET
562 #ifdef AF_INET6
563  && d->sockfamily != AF_INET6
564 #endif
565  )
566  {
567  kdWarning() << "KInetSocketAddress::pretty() called on uninitialized class\n";
568  return i18n("<empty>");
569  }
570 
571  return i18n("1: hostname, 2: port number", "%1 port %2").arg(nodeName()).arg(serviceName());
572 }
573 
574 TQString KInetSocketAddress::nodeName() const
575 {
576  char buf[INET6_ADDRSTRLEN]; // INET6_ADDRSTRLEN > INET_ADDRSTRLEN
577 
578  if (d->sockfamily == AF_INET)
579  inet_ntop(d->sockfamily, (void*)&d->sin.sin_addr, buf, sizeof(buf));
580 #ifdef AF_INET6
581  else if (d->sockfamily == AF_INET6)
582  inet_ntop(d->sockfamily, (void*)&d->sin6.sin6_addr, buf, sizeof(buf));
583 #endif
584  else
585  {
586  kdWarning() << "KInetSocketAddress::nodeName() called on uninitialized class\n";
587  return i18n("<empty>");
588  }
589 
590  return TQString::fromLatin1(buf); // FIXME! What's the encoding?
591 }
592 
593 TQString KInetSocketAddress::serviceName() const
594 {
595  return TQString::number(port());
596 }
597 
598 unsigned short KInetSocketAddress::port() const
599 {
600 #ifdef AF_INET6
601  // we prefer sin6 here because fromV6() might make sin.sin_port be 0
602  return ntohs(d->sin6.sin6_port);
603 #else
604  return ntohs(d->sin.sin_port);
605 #endif
606 }
607 
608 TQ_UINT32 KInetSocketAddress::flowinfo() const
609 {
610 #ifdef AF_INET6
611  if (d->sockfamily == AF_INET6)
612  return (TQ_UINT32)d->sin6.sin6_flowinfo;
613 #endif
614  return 0;
615 }
616 
617 ksocklen_t KInetSocketAddress::size() const
618 {
619  if (d->sockfamily == AF_INET)
620  return sizeof(d->sin);
621 #ifdef AF_INET6
622  else if (d->sockfamily == AF_INET6)
623  return sizeof(d->sin6);
624 #endif
625  else
626  return 0;
627 }
628 
629 bool KInetSocketAddress::areEqualInet(const TDESocketAddress &s1, const TDESocketAddress &s2, bool coreOnly)
630 {
631  if (s1.family() != s2.family())
632  return false;
633  if ((s1.size() < sizeof(sockaddr_in)) || (s2.size() < sizeof(sockaddr_in)))
634  return false;
635 
636  struct sockaddr_in *sin1 = (sockaddr_in *) s1.address();
637  struct sockaddr_in *sin2 = (sockaddr_in *) s2.address();
638 
639  if (coreOnly)
640  return (memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(struct in_addr)) == 0);
641  else
642  return (sin1->sin_port == sin2->sin_port) &&
643  (memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(struct in_addr)) == 0);
644 }
645 
646 bool KInetSocketAddress::areEqualInet6(const TDESocketAddress &s1, const TDESocketAddress &s2, bool coreOnly)
647 {
648 #ifdef AF_INET6
649  if (s1.family() != s2.family())
650  return false;
651 
652  if ((s1.size() < sizeof(sockaddr_in6)) || (s2.size() < sizeof(sockaddr_in6)))
653  return false;
654 
655  struct sockaddr_in6 *sin1 = (sockaddr_in6 *) s1.address();
656  struct sockaddr_in6 *sin2 = (sockaddr_in6 *) s2.address();
657 
658  if (coreOnly)
659  return (memcmp(&sin1->sin6_addr, &sin2->sin6_addr, sizeof(struct in6_addr)) == 0);
660  else
661  return (sin1->sin6_port == sin2->sin6_port) &&
662  (sin1->sin6_flowinfo == sin2->sin6_flowinfo) &&
663 #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
664  (sin1->sin6_scope_id == sin2->sin6_scope_id) &&
665 #endif
666  (memcmp(&sin1->sin6_addr, &sin2->sin6_addr, sizeof(struct in6_addr)) == 0);
667 #else
668  return false;
669 #endif
670 }
671 
672 void KInetSocketAddress::fromV4()
673 {
674  // converts an address from v4
675 
676 #ifdef AF_INET6
677  d->sin6.sin6_port = d->sin.sin_port;
678 
679  // Make this a v4-mapped address
680  ((TQ_UINT32*)&d->sin6.sin6_addr)[0] = ((TQ_UINT32*)&d->sin6.sin6_addr)[1] = 0;
681  ((TQ_UINT32*)&d->sin6.sin6_addr)[2] = htonl(0xffff);
682  ((TQ_UINT32*)&d->sin6.sin6_addr)[3] = *(TQ_UINT32*)&d->sin.sin_addr;
683 
684  // Clear flowinfo and scopeid
685  d->sin6.sin6_flowinfo = 0;
686 # ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
687  d->sin6.sin6_scope_id = 0;
688 # endif
689 #endif
690 
691  // data == TDESocketAddress::data
692  data = (sockaddr*)&d->sin;
693  datasize = sizeof( sockaddr_in );
694 }
695 
696 void KInetSocketAddress::fromV6()
697 {
698 #ifdef AF_INET6
699  // convert to v4 only if this is a v4-mapped or v4-compat address
700  if (V6_CAN_CONVERT_TO_V4(&d->sin6.sin6_addr))
701  {
702  d->sin.sin_port = d->sin6.sin6_port;
703  *(TQ_UINT32*)&d->sin.sin_addr = ((TQ_UINT32*)&d->sin6.sin6_addr)[3];
704  }
705  else
706  {
707  d->sin.sin_port = 0;
708  memset(&d->sin.sin_addr, 0, sizeof(d->sin.sin_addr));
709  }
710 
711  data = (sockaddr*)&d->sin6;
712  datasize = sizeof( d->sin6 );
713 #endif
714 }
715 
716 TQString KInetSocketAddress::addrToString(int family, const void* addr)
717 {
718  char buf[INET6_ADDRSTRLEN+1];
719 
720  return TQString::fromLatin1(inet_ntop(family, addr, buf, INET6_ADDRSTRLEN));
721 }
722 
723 bool KInetSocketAddress::stringToAddr(int family, const char *text, void *dest)
724 {
725  return inet_pton(family, text, dest) != 0;
726 }
727 
732 class KUnixSocketAddressPrivate
733 {
734 public:
735  sockaddr_un *m_sun;
736 
737  KUnixSocketAddressPrivate() : m_sun(NULL)
738  { }
739 };
740 
741 KUnixSocketAddress::KUnixSocketAddress() :
742  d(new KUnixSocketAddressPrivate)
743 {
744 }
745 
746 KUnixSocketAddress::KUnixSocketAddress(const sockaddr_un* _sun, ksocklen_t size) :
747  d(new KUnixSocketAddressPrivate)
748 {
749  setAddress(_sun, size);
750 }
751 
752 KUnixSocketAddress::KUnixSocketAddress(TQCString pathname) :
753  d(new KUnixSocketAddressPrivate)
754 {
755  setAddress(pathname);
756 }
757 
758 KUnixSocketAddress::~KUnixSocketAddress()
759 {
760  delete d;
761 }
762 
763 bool KUnixSocketAddress::setAddress(const sockaddr_un* _sun, ksocklen_t _size)
764 {
765  if (_sun->sun_family != AF_UNIX)
766  {
767  kdWarning() << "KUnixSocketAddress::setAddress called with invalid socket\n";
768  return false;
769  }
770 
771  if (owndata && (d->m_sun != NULL) && (datasize >= _size))
772  {
773  // reuse this without reallocating
774  memcpy(d->m_sun, _sun, _size);
775  }
776  else
777  {
778  if (owndata && (d->m_sun != NULL))
779  free(d->m_sun);
780 
781  d->m_sun = (sockaddr_un*)malloc(_size);
782 
783  if (d->m_sun == NULL)
784  {
785  // problems
786  owndata = false;
787  return false;
788  }
789 
790  memcpy(d->m_sun, _sun, _size);
791  }
792 
793  datasize = _size;
794  data = (sockaddr*)d->m_sun;
795  owndata = true;
796 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
797  data->sa_len = _size;
798 #endif
799  return 1;
800 }
801 
802 bool KUnixSocketAddress::setAddress(TQCString path)
803 {
804  // the +1 is necessary for the ending zero
805  ksocklen_t newsize = offsetof(sockaddr_un, sun_path) + path.length() + 1;
806 
807  if (owndata && (d->m_sun != NULL) && (datasize >= newsize))
808  {
809  // we can reuse this
810  strcpy(d->m_sun->sun_path, path);
811 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
812  data->sa_len = newsize;
813 #endif
814  return true;
815  }
816 
817  // nah, we have to do better
818  if (owndata && (d->m_sun != NULL))
819  free(d->m_sun);
820 
821  d->m_sun = (sockaddr_un*) malloc(newsize);
822  if (d->m_sun == NULL)
823  {
824  owndata = false;
825  return false;
826  }
827 
828  d->m_sun->sun_family = AF_UNIX;
829  strcpy(d->m_sun->sun_path, path);
830  data = (sockaddr*)d->m_sun;
831  datasize = newsize;
832 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
833  data->sa_len = newsize;
834 #endif
835  return 1;
836 }
837 
838 TQCString KUnixSocketAddress::pathname() const
839 {
840  if (d->m_sun != NULL)
841  {
842  if (datasize > offsetof(sockaddr_un, sun_path))
843  return d->m_sun->sun_path;
844  return "";
845  }
846  return TQCString(0);
847 }
848 
849 TQString KUnixSocketAddress::pretty() const
850 {
851  TQCString pname = pathname();
852  if (pname.isEmpty())
853  return i18n("<empty UNIX socket>");
854  return TQFile::decodeName(pathname());
855 }
856 
857 TQString KUnixSocketAddress::serviceName() const
858 {
859  return TQString::fromUtf8(pathname());
860 }
861 
862 const sockaddr_un* KUnixSocketAddress::address() const
863 {
864  return d->m_sun;
865 }
866 
867 bool KUnixSocketAddress::areEqualUnix(const TDESocketAddress &s1, const TDESocketAddress &s2, bool /* coreOnly */)
868 {
869  if (s1.family() != s2.family())
870  return false;
871 
872  if ((s1.size() < MIN_SOCKADDR_LEN) || (s2.size() < MIN_SOCKADDR_LEN))
873  return false;
874 
875  struct sockaddr_un *sun1 = (sockaddr_un *) s1.address();
876  struct sockaddr_un *sun2 = (sockaddr_un *) s2.address();
877 
878  if (s1.size() == MIN_SOCKADDR_LEN && s2.size() == MIN_SOCKADDR_LEN)
879  return true; // unnamed Unix sockets
880 
881  return (strcmp(sun1->sun_path, sun2->sun_path) == 0);
882 }
883 
884 void TDESocketAddress::virtual_hook( int, void* )
885 { /*BASE::virtual_hook( id, data );*/ }
886 
887 void KInetSocketAddress::virtual_hook( int id, void* data )
888 { TDESocketAddress::virtual_hook( id, data ); }
889 
890 void KUnixSocketAddress::virtual_hook( int id, void* data )
891 { TDESocketAddress::virtual_hook( id, data ); }
892 
893 
894 #include "ksockaddr.moc"
KInetSocketAddress
An Inet (IPv4 or IPv6) socket address.
Definition: ksockaddr.h:234
KInetSocketAddress::nodeName
virtual TQString nodeName() const
Returns the text representation of the host address.
Definition: ksockaddr.cpp:574
KInetSocketAddress::setAddress
bool setAddress(const KInetSocketAddress &ksa)
Sets this socket to given socket.
Definition: ksockaddr.cpp:319
KInetSocketAddress::~KInetSocketAddress
virtual ~KInetSocketAddress()
Destructor.
Definition: ksockaddr.cpp:312
KInetSocketAddress::KInetSocketAddress
KInetSocketAddress()
Default constructor.
Definition: ksockaddr.cpp:271
KInetSocketAddress::setPort
bool setPort(unsigned short port)
Sets this socket's port number to given port number.
Definition: ksockaddr.cpp:454
KInetSocketAddress::port
unsigned short port() const
Returns the port number.
Definition: ksockaddr.cpp:598
KInetSocketAddress::addressV6
const sockaddr_in6 * addressV6() const
Returns the socket address in IPv6.
Definition: ksockaddr.cpp:532
KInetSocketAddress::pretty
virtual TQString pretty() const
Returns a pretty representation of this address.
Definition: ksockaddr.cpp:559
KInetSocketAddress::setFlowinfo
bool setFlowinfo(TQ_UINT32 flowinfo)
Sets flowinfo information for this socket address if this is IPv6.
Definition: ksockaddr.cpp:488
KInetSocketAddress::addressV4
const sockaddr_in * addressV4() const
Returns the socket address.
Definition: ksockaddr.cpp:513
KInetSocketAddress::stringToAddr
static bool stringToAddr(int family, const char *text, void *dest)
Converts the address given in text form into raw form.
Definition: ksockaddr.cpp:723
KInetSocketAddress::setHost
bool setHost(const in_addr &addr)
Sets this socket's host address to given raw address.
Definition: ksockaddr.cpp:385
KInetSocketAddress::setScopeId
bool setScopeId(int scopeid)
Sets the scope id for this socket if this is IPv6.
Definition: ksockaddr.cpp:500
KInetSocketAddress::setFamily
bool setFamily(int family)
Turns this into an IPv4 or IPv6 address.
Definition: ksockaddr.cpp:465
KInetSocketAddress::size
virtual ksocklen_t size() const
Returns the socket length.
Definition: ksockaddr.cpp:617
KInetSocketAddress::hostV4
in_addr hostV4() const
Returns the host address.
Definition: ksockaddr.cpp:541
KInetSocketAddress::serviceName
virtual TQString serviceName() const
Returns the text representation of the port number.
Definition: ksockaddr.cpp:593
KInetSocketAddress::flowinfo
TQ_UINT32 flowinfo() const
Returns flowinfo for IPv6 socket.
Definition: ksockaddr.cpp:608
KInetSocketAddress::areEqualInet6
static bool areEqualInet6(const TDESocketAddress &s1, const TDESocketAddress &s2, bool coreOnly)
Compares two IPv6 addresses.
Definition: ksockaddr.cpp:646
KInetSocketAddress::hostV6
in6_addr hostV6() const
Returns the host address.
KInetSocketAddress::addrToString
static TQString addrToString(int family, const void *addr)
Convert s the given raw address into text form.
Definition: ksockaddr.cpp:716
KInetSocketAddress::areEqualInet
static bool areEqualInet(const TDESocketAddress &s1, const TDESocketAddress &s2, bool coreOnly)
Compares two IPv4 addresses.
Definition: ksockaddr.cpp:629
KUnixSocketAddress
A Unix socket address.
Definition: ksockaddr.h:585
KUnixSocketAddress::pretty
virtual TQString pretty() const
Returns pretty representation of this socket.
Definition: ksockaddr.cpp:849
KUnixSocketAddress::setAddress
bool setAddress(const sockaddr_un *socket_address, ksocklen_t size)
Sets this to given sockaddr_un.
Definition: ksockaddr.cpp:763
KUnixSocketAddress::~KUnixSocketAddress
virtual ~KUnixSocketAddress()
Destructor.
Definition: ksockaddr.cpp:758
KUnixSocketAddress::pathname
TQCString pathname() const
Returns the pathname.
Definition: ksockaddr.cpp:838
KUnixSocketAddress::serviceName
virtual TQString serviceName() const
Returns the service name for this socket, as KExtendedSocket::lookup expects as the service argument.
Definition: ksockaddr.cpp:857
KUnixSocketAddress::address
const sockaddr_un * address() const
Returns raw socket address.
Definition: ksockaddr.cpp:862
KUnixSocketAddress::KUnixSocketAddress
KUnixSocketAddress()
Default constructor.
Definition: ksockaddr.cpp:741
KUnixSocketAddress::areEqualUnix
static bool areEqualUnix(const TDESocketAddress &s1, const TDESocketAddress &s2, bool coreOnly)
Compares two unix socket addresses.
Definition: ksockaddr.cpp:867
TDESocketAddress
A socket address.
Definition: ksockaddr.h:47
TDESocketAddress::pretty
virtual TQString pretty() const
Returns a string representation of this socket.
Definition: ksockaddr.cpp:110
TDESocketAddress::ianaFamily
int ianaFamily() const
Returns the IANA family number of this address.
Definition: ksockaddr.h:107
TDESocketAddress::fromIanaFamily
static int fromIanaFamily(int iana)
Returns the address family of the given IANA family number.
Definition: ksockaddr.cpp:221
TDESocketAddress::TDESocketAddress
TDESocketAddress()
Creates an empty class.
Definition: ksockaddr.h:53
TDESocketAddress::newAddress
static TDESocketAddress * newAddress(const struct sockaddr *sa, ksocklen_t size)
Creates a new TDESocketAddress or descendant class from given raw socket address.
Definition: ksockaddr.cpp:123
TDESocketAddress::isEqual
virtual bool isEqual(const TDESocketAddress &other) const
Returns true if this equals the other socket.
Definition: ksockaddr.cpp:159
TDESocketAddress::family
int family() const
Returns the family of this address.
Definition: ksockaddr.cpp:115
TDESocketAddress::isCoreEqual
bool isCoreEqual(const TDESocketAddress &other) const
Some sockets may differ in such things as services or port numbers, like Internet sockets.
Definition: ksockaddr.cpp:179
TDESocketAddress::~TDESocketAddress
virtual ~TDESocketAddress()
Destructor.
Definition: ksockaddr.cpp:104
TDESocketAddress::address
const sockaddr * address() const
Returns a sockaddr structure, for passing down to library functions.
Definition: ksockaddr.h:78
TDESocketAddress::serviceName
virtual TQString serviceName() const
Returns the service name for this socket, as KExtendedSocket::lookup expects as the service argument.
Definition: ksockaddr.cpp:201
TDESocketAddress::size
virtual ksocklen_t size() const
Returns sockaddr structure size.
Definition: ksockaddr.h:85
TDESocketAddress::nodeName
virtual TQString nodeName() const
Returns the node name of this socket, as KExtendedSocket::lookup expects as the first argument.
Definition: ksockaddr.cpp:196
tdelocale.h

tdecore

Skip menu "tdecore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdecore

Skip menu "tdecore"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdecore by doxygen 1.9.1
This website is maintained by Timothy Pearson.