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

tdecore

  • tdecore
  • network
tdesocketaddress.cpp
1 /*
2  * Copyright (C) 2003 Thiago Macieira <thiago.macieira@kdemail.net>
3  *
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 #include "config.h"
26 
27 #include <sys/types.h>
28 #include <sys/socket.h>
29 #include <sys/un.h>
30 #include <arpa/inet.h>
31 #include <netinet/in.h>
32 #include <string.h>
33 #include <stdlib.h>
34 #include <unistd.h>
35 
36 #include <tqfile.h>
37 #include <tqobject.h>
38 
39 #include "tdelocale.h"
40 #include "tdesocketaddress.h"
41 
42 #include "netsupp.h"
43 
44 using namespace KNetwork;
45 
46 #if 0
47 class KIpAddress_localhostV4 : public KIpAddress
48 {
49 public:
50  KIpAddress_localhostV4()
51  {
52  *m_data = htonl(0x7f000001);
53  m_version = 4;
54  }
55 };
56 
57 class KIpAddress_localhostV6 : public KIpAddress
58 {
59 public:
60  KIpAddress_localhostV6()
61  : KIpAddress(0L, 6)
62  {
63  m_data[3] = htonl(1);
64  }
65 };
66 #endif
67 
68 static const char localhostV4_data[] = { 127, 0, 0, 1 };
69 static const char localhostV6_data[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,1 };
70 
71 const KIpAddress KIpAddress::localhostV4(&localhostV4_data, 4);
72 const KIpAddress KIpAddress::localhostV6(&localhostV6_data, 6);
73 const KIpAddress KIpAddress::anyhostV4(0L, 4);
74 const KIpAddress KIpAddress::anyhostV6(0L, 6);
75 
76 // helper function to test if an IPv6 v4-mapped address is equal to its IPv4 counterpart
77 static bool check_v4mapped(const TQ_UINT32* v6addr, TQ_UINT32 v4addr)
78 {
79  // check that the v6 is a v4-mapped address
80  if (!(v6addr[0] == 0 && v6addr[1] == 0 && v6addr[2] == htonl(0x0000ffff)))
81  return false; // not a v4-mapped address
82 
83  return v6addr[3] == v4addr;
84 }
85 
86 // copy operator
87 KIpAddress& KIpAddress::operator =(const KIpAddress& other)
88 {
89  m_version = other.m_version;
90  if (m_version == 4 || m_version == 6)
91  memcpy(m_data, other.m_data, sizeof(m_data));
92  return *this;
93 }
94 
95 // comparison
96 bool KIpAddress::compare(const KIpAddress& other, bool checkMapped) const
97 {
98  if (m_version == other.m_version)
99  switch (m_version)
100  {
101  case 0:
102  // both objects are empty
103  return true;
104 
105  case 4:
106  // IPv4 address
107  return *m_data == *other.m_data;
108 
109  case 6:
110  // IPv6 address
111  // they are 128-bit long, that is, 16 bytes
112  return memcmp(m_data, other.m_data, 16) == 0;
113  }
114 
115  if (checkMapped)
116  {
117  // check the possibility of a v4-mapped address being compared to an IPv4 one
118  if (m_version == 6 && other.m_version == 4 && check_v4mapped(m_data, *other.m_data))
119  return true;
120 
121  if (other.m_version == 6 && m_version == 4 && check_v4mapped(other.m_data, *m_data))
122  return true;
123  }
124 
125  return false;
126 }
127 
128 // sets the address to the given address
129 bool KIpAddress::setAddress(const TQString& address)
130 {
131  m_version = 0;
132 
133  // try to guess the address version
134  if (address.find(':') != -1)
135  {
136 #ifdef AF_INET6
137  // guessing IPv6
138 
139  TQ_UINT32 buf[4];
140  if (inet_pton(AF_INET6, address.latin1(), buf))
141  {
142  memcpy(m_data, buf, sizeof(m_data));
143  m_version = 6;
144  return true;
145  }
146 #endif
147 
148  return false;
149  }
150  else
151  {
152  TQ_UINT32 buf;
153  if (inet_pton(AF_INET, address.latin1(), &buf))
154  {
155  *m_data = buf;
156  m_version = 4;
157  return true;
158  }
159 
160  return false;
161  }
162 
163  return false; // can never happen!
164 }
165 
166 bool KIpAddress::setAddress(const char* address)
167 {
168  return setAddress(TQString::fromLatin1(address));
169 }
170 
171 // set from binary data
172 bool KIpAddress::setAddress(const void* raw, int version)
173 {
174  // this always succeeds
175  // except if version is invalid
176  if (version != 4 && version != 6)
177  return false;
178 
179  m_version = version;
180  if (raw != 0L)
181  memcpy(m_data, raw, version == 4 ? 4 : 16);
182  else
183  memset(m_data, 0, 16);
184 
185  return true;
186 }
187 
188 // presentation form
189 TQString KIpAddress::toString() const
190 {
191  char buf[sizeof "1111:2222:3333:4444:5555:6666:255.255.255.255" + 2];
192  buf[0] = '\0';
193  switch (m_version)
194  {
195  case 4:
196  inet_ntop(AF_INET, m_data, buf, sizeof(buf) - 1);
197  return TQString::fromLatin1(buf);
198 
199  case 6:
200  {
201 #ifdef AF_INET6
202  inet_ntop(AF_INET6, m_data, buf, sizeof(buf) - 1);
203 #endif
204  return TQString::fromLatin1(buf);
205  }
206  }
207 
208  return TQString::null;
209 }
210 
211 TQ_UINT32 KIpAddress::hostIPv4Addr(bool convertMapped) const
212 {
213  TQ_UINT32 addr = IPv4Addr(convertMapped);
214  return ntohl(addr);
215 }
216 
217 /*
218  * An IPv6 socket address
219  * This is taken from RFC 2553.
220  */
221 struct our_sockaddr_in6
222 {
223 # ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
224  TQ_UINT8 sin6_len;
225  TQ_UINT8 sin6_family;
226 # else
227  TQ_UINT16 sin6_family;
228 # endif
229  TQ_UINT16 sin6_port; /* RFC says in_port_t */
230  TQ_UINT32 sin6_flowinfo;
231  TQ_UINT8 sin6_addr[16]; // 24 bytes up to here
232  TQ_UINT32 sin6_scope_id; // 28 bytes total
233 };
234 
235 // useful definitions
236 #define MIN_SOCKADDR_LEN sizeof(TQ_UINT16)
237 #define SOCKADDR_IN_LEN sizeof(sockaddr_in)
238 #define MIN_SOCKADDR_IN6_LEN ((unsigned long) &(((our_sockaddr_in6*)0)->sin6_scope_id))
239 #define SOCKADDR_IN6_LEN sizeof(our_sockaddr_in6)
240 #define MIN_SOCKADDR_UN_LEN (sizeof(TQ_UINT16) + sizeof(char))
241 
242 
243 class KNetwork::TDESocketAddressData
244 {
245 public:
246  /*
247  * Note: maybe this should be virtual
248  * But since the data is shared via the d pointer, it doesn't really matter
249  * what one class sees, so will the other
250  */
251  class QMixSocketAddressRef : public KInetSocketAddress, public KUnixSocketAddress
252  {
253  public:
254  QMixSocketAddressRef(TDESocketAddressData* d)
255  : KInetSocketAddress(d), KUnixSocketAddress(d)
256  {
257  }
258  };
259  QMixSocketAddressRef ref;
260 
261  union
262  {
263  struct sockaddr *generic;
264  struct sockaddr_in *in;
265  struct our_sockaddr_in6 *in6;
266  struct sockaddr_un *un;
267  } addr;
268  TQ_UINT16 curlen, reallen;
269 
270  TDESocketAddressData()
271  : ref(this)
272  {
273  addr.generic = 0L;
274  curlen = 0;
275  invalidate();
276  }
277 
278  ~TDESocketAddressData()
279  {
280  if (addr.generic != 0L)
281  free(addr.generic);
282  }
283 
284  inline bool invalid() const
285  { return reallen == 0; }
286 
287  inline void invalidate()
288  { reallen = 0; }
289 
290  void dup(const sockaddr* sa, TQ_UINT16 len, bool clear = true);
291 
292  void makeipv4()
293  {
294  short oldport = 0;
295  if (!invalid())
296  switch (addr.generic->sa_family)
297  {
298  case AF_INET:
299  {
300  return; // nothing to do here
301  }
302 #ifdef AF_INET6
303  case AF_INET6:
304  {
305  oldport = addr.in6->sin6_port;
306  break;
307  }
308 #endif
309  }
310 
311  // create new space
312  dup(0L, SOCKADDR_IN_LEN);
313 
314  addr.in->sin_family = AF_INET;
315 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
316  addr.in->sin_len = SOCKADDR_IN_LEN;
317 #endif
318  addr.in->sin_port = oldport;
319  }
320 
321  void makeipv6()
322  {
323  short oldport = 0;
324  if (!invalid())
325  switch (addr.generic->sa_family)
326  {
327  case AF_INET:
328  {
329  oldport = addr.in->sin_port;
330  break;
331  }
332 
333 #ifdef AF_INET6
334  case AF_INET6:
335  {
336  return; // nothing to do here
337  }
338 #endif
339  }
340 
341  // make room
342  dup(0L, SOCKADDR_IN6_LEN);
343 #ifdef AF_INET6
344  addr.in6->sin6_family = AF_INET6;
345 #endif
346 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
347  addr.in6->sin6_len = SOCKADDR_IN6_LEN;
348 #endif
349  addr.in6->sin6_port = oldport;
350  // sin6_scope_id and sin6_flowid are zero
351  }
352 
353 };
354 
355 // create duplicates of
356 void TDESocketAddressData::dup(const sockaddr* sa, TQ_UINT16 len, bool clear)
357 {
358  if (len < MIN_SOCKADDR_LEN)
359  {
360  // certainly invalid
361  invalidate();
362  return;
363  }
364 
365  if (sa && ((sa->sa_family == AF_INET && len < SOCKADDR_IN_LEN) ||
366 #ifdef AF_INET6
367  (sa->sa_family == AF_INET6 && len < MIN_SOCKADDR_IN6_LEN) ||
368 #endif
369  (sa->sa_family == AF_UNIX && len < MIN_SOCKADDR_UN_LEN)))
370  {
371  // also invalid
372  invalidate();
373  return;
374  }
375 
376  // good
377  reallen = len;
378  if (len > curlen)
379  {
380  if (len < 32)
381  curlen = 32; // big enough for sockaddr_in and sockaddr_in6
382  else
383  curlen = len;
384  addr.generic = (sockaddr*)realloc(addr.generic, curlen);
385  }
386 
387  if (sa != 0L)
388  {
389  memcpy(addr.generic, sa, len); // copy
390 
391  // now, normalise the data
392  if (addr.generic->sa_family == AF_INET)
393  reallen = SOCKADDR_IN_LEN; // no need to be larger
394 #ifdef AF_INET6
395  else if (addr.generic->sa_family == AF_INET6)
396  {
397  // set the extra field (sin6_scope_id)
398 
399  // the buffer is never smaller than 32 bytes, so this is always
400  // allowed
401  if (reallen < SOCKADDR_IN6_LEN)
402  addr.in6->sin6_scope_id = 0;
403 
404  reallen = SOCKADDR_IN6_LEN;
405  }
406 #endif
407  else if (addr.generic->sa_family == AF_UNIX)
408  reallen = MIN_SOCKADDR_UN_LEN + strlen(addr.un->sun_path);
409  }
410  else if (clear)
411  {
412  memset(addr.generic, 0, len);
413  addr.generic->sa_family = AF_UNSPEC;
414  }
415 }
416 
417 // default constructor
418 TDESocketAddress::TDESocketAddress()
419  : d(new TDESocketAddressData)
420 {
421 }
422 
423 // constructor from binary data
424 TDESocketAddress::TDESocketAddress(const sockaddr *sa, TQ_UINT16 len)
425  : d(new TDESocketAddressData)
426 {
427  setAddress(sa, len);
428 }
429 
430 TDESocketAddress::TDESocketAddress(const TDESocketAddress& other)
431  : d(new(TDESocketAddressData))
432 {
433  *this = other;
434 }
435 
436 TDESocketAddress::TDESocketAddress(TDESocketAddressData *d2)
437  : d(d2)
438 {
439 }
440 
441 TDESocketAddress::~TDESocketAddress()
442 {
443  // prevent double-deletion, since we're already being deleted
444  if (d)
445  {
446  d->ref.KInetSocketAddress::d = 0L;
447  d->ref.KUnixSocketAddress::d = 0L;
448  delete d;
449  }
450 }
451 
452 TDESocketAddress& TDESocketAddress::operator =(const TDESocketAddress& other)
453 {
454  if (other.d && !other.d->invalid())
455  d->dup(other.d->addr.generic, other.d->reallen);
456  else
457  d->invalidate();
458  return *this;
459 }
460 
461 const sockaddr* TDESocketAddress::address() const
462 {
463  if (d->invalid())
464  return 0L;
465  return d->addr.generic;
466 }
467 
468 sockaddr* TDESocketAddress::address()
469 {
470  if (d->invalid())
471  return 0L;
472  return d->addr.generic;
473 }
474 
475 TDESocketAddress& TDESocketAddress::setAddress(const sockaddr* sa, TQ_UINT16 len)
476 {
477  if (sa != 0L && len >= MIN_SOCKADDR_LEN)
478  d->dup(sa, len);
479  else
480  d->invalidate();
481 
482  return *this;
483 }
484 
485 TQ_UINT16 TDESocketAddress::length() const
486 {
487  if (d->invalid())
488  return 0;
489  return d->reallen;
490 }
491 
492 TDESocketAddress& TDESocketAddress::setLength(TQ_UINT16 len)
493 {
494  d->dup((sockaddr*)0L, len, false);
495 
496  return *this;
497 }
498 
499 int TDESocketAddress::family() const
500 {
501  if (d->invalid())
502  return AF_UNSPEC;
503  return d->addr.generic->sa_family;
504 }
505 
506 TDESocketAddress& TDESocketAddress::setFamily(int family)
507 {
508  if (d->invalid())
509  d->dup((sockaddr*)0L, MIN_SOCKADDR_LEN);
510  d->addr.generic->sa_family = family;
511 
512  return *this;
513 }
514 
515 bool TDESocketAddress::operator ==(const TDESocketAddress& other) const
516 {
517  // if this is invalid, it's only equal if the other one is invalid as well
518  if (d->invalid())
519  return other.d->invalid();
520 
521  // check the family to make sure we don't do unnecessary comparison
522  if (d->addr.generic->sa_family != other.d->addr.generic->sa_family)
523  return false; // not the same family, not equal
524 
525  // same family then
526  // check the ones we know already
527  switch (d->addr.generic->sa_family)
528  {
529  case AF_INET:
530  {
531  Q_ASSERT(d->reallen == SOCKADDR_IN_LEN);
532  Q_ASSERT(other.d->reallen == SOCKADDR_IN_LEN);
533  return memcmp(d->addr.in, other.d->addr.in, SOCKADDR_IN_LEN) == 0;
534  }
535 
536 #ifdef AF_INET6
537  case AF_INET6:
538  {
539  Q_ASSERT(d->reallen >= MIN_SOCKADDR_IN6_LEN);
540  Q_ASSERT(other.d->reallen >= MIN_SOCKADDR_IN6_LEN);
541 
542 # if !defined(HAVE_STRUCT_SOCKADDR_IN6) || defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID)
543  // check for the case where sin6_scope_id isn't present
544  if (d->reallen != other.d->reallen)
545  {
546  if (memcmp(d->addr.in6, other.d->addr.in6, MIN_SOCKADDR_IN6_LEN) != 0)
547  return false; // not equal
548  if (d->reallen > other.d->reallen)
549  return d->addr.in6->sin6_scope_id == 0;
550  else
551  return other.d->addr.in6->sin6_scope_id == 0;
552  }
553 # endif
554 
555  return memcmp(d->addr.in6, other.d->addr.in6, d->reallen) == 0;
556  }
557 #endif
558 
559  case AF_UNIX:
560  Q_ASSERT(d->reallen >= MIN_SOCKADDR_UN_LEN);
561  Q_ASSERT(other.d->reallen >= MIN_SOCKADDR_UN_LEN);
562 
563  // do a string comparison here
564  return strcmp(d->addr.un->sun_path, other.d->addr.un->sun_path) == 0;
565 
566  default:
567  // something else we don't know about
568  // they are equal if and only if they are exactly equal
569  if (d->reallen == other.d->reallen)
570  return memcmp(d->addr.generic, other.d->addr.generic, d->reallen) == 0;
571  }
572 
573  return false; // not equal in any other case
574 }
575 
576 TQString TDESocketAddress::nodeName() const
577 {
578  if (d->invalid())
579  return TQString::null;
580 
581  switch (d->addr.generic->sa_family)
582  {
583 #ifdef AF_INET6
584  case AF_INET6:
585 #endif
586  case AF_INET:
587 #ifdef AF_INET6
588  TQString scopeid("%");
589  if (d->addr.generic->sa_family == AF_INET6 && d->addr.in6->sin6_scope_id)
590  scopeid += TQString::number(d->addr.in6->sin6_scope_id);
591  else
592  scopeid.truncate(0);
593  return d->ref.ipAddress().toString() + scopeid;
594 #else
595  return d->ref.ipAddress().toString();
596 #endif
597  }
598 
599  // any other case, including AF_UNIX
600  return TQString::null;
601 }
602 
603 TQString TDESocketAddress::serviceName() const
604 {
605  if (d->invalid())
606  return TQString::null;
607 
608  switch (d->addr.generic->sa_family)
609  {
610 #ifdef AF_INET6
611  case AF_INET6:
612 #endif
613  case AF_INET:
614  return TQString::number(d->ref.port());
615 
616  case AF_UNIX:
617  return d->ref.pathname();
618  }
619 
620  return TQString::null;
621 }
622 
623 TQString TDESocketAddress::toString() const
624 {
625  if (d->invalid())
626  return TQString::null;
627 
628  TQString fmt;
629 
630  if (d->addr.generic->sa_family == AF_INET)
631  fmt = "%1:%2";
632 #ifdef AF_INET6
633  else if (d->addr.generic->sa_family == AF_INET6)
634  fmt = "[%1]:%2";
635 #endif
636  else if (d->addr.generic->sa_family == AF_UNIX)
637  return TQString::fromLatin1("unix:%1").arg(serviceName());
638  else
639  return i18n("1: the unknown socket address family number",
640  "Unknown family %1").arg(d->addr.generic->sa_family);
641 
642  return fmt.arg(nodeName()).arg(serviceName());
643 }
644 
645 KInetSocketAddress& TDESocketAddress::asInet()
646 {
647  return d->ref;
648 }
649 
650 KInetSocketAddress TDESocketAddress::asInet() const
651 {
652  return d->ref;
653 }
654 
655 KUnixSocketAddress& TDESocketAddress::asUnix()
656 {
657  return d->ref;
658 }
659 
660 KUnixSocketAddress TDESocketAddress::asUnix() const
661 {
662  return d->ref;
663 }
664 
665 int TDESocketAddress::ianaFamily(int af)
666 {
667  switch (af)
668  {
669  case AF_INET:
670  {
671  return 1;
672  }
673 
674 #ifdef AF_INET6
675  case AF_INET6:
676  {
677  return 2;
678  }
679 #endif
680 
681  default:
682  return 0;
683  }
684 }
685 
686 int TDESocketAddress::fromIanaFamily(int iana)
687 {
688  switch (iana)
689  {
690  case 1:
691  {
692  return AF_INET;
693  }
694 
695 #ifdef AF_INET6
696  case 2:
697  {
698  return AF_INET6;
699  }
700 #endif
701 
702  default:
703  return AF_UNSPEC;
704  }
705 }
706 
707 // default constructor
708 KInetSocketAddress::KInetSocketAddress()
709 {
710 }
711 
712 // binary data constructor
713 KInetSocketAddress::KInetSocketAddress(const sockaddr* sa, TQ_UINT16 len)
714  : TDESocketAddress(sa, len)
715 {
716  if (!d->invalid())
717  update();
718 }
719 
720 // create from IP and port
721 KInetSocketAddress::KInetSocketAddress(const KIpAddress& host, TQ_UINT16 port)
722 {
723  setHost(host);
724  setPort(port);
725 }
726 
727 // copy constructor
728 KInetSocketAddress::KInetSocketAddress(const KInetSocketAddress& other)
729  : TDESocketAddress(other)
730 {
731 }
732 
733 // special copy constructor
734 KInetSocketAddress::KInetSocketAddress(const TDESocketAddress& other)
735  : TDESocketAddress(other)
736 {
737  if (!d->invalid())
738  update();
739 }
740 
741 // special constructor
742 KInetSocketAddress::KInetSocketAddress(TDESocketAddressData *d)
743  : TDESocketAddress(d)
744 {
745 }
746 
747 // destructor
748 KInetSocketAddress::~KInetSocketAddress()
749 {
750  /* nothing to do */
751 }
752 
753 // copy operator
754 KInetSocketAddress& KInetSocketAddress::operator =(const KInetSocketAddress& other)
755 {
756  TDESocketAddress::operator =(other);
757  return *this;
758 }
759 
760 // IP version
761 int KInetSocketAddress::ipVersion() const
762 {
763  if (d->invalid())
764  return 0;
765 
766  switch (d->addr.generic->sa_family)
767  {
768  case AF_INET:
769  {
770  return 4;
771  }
772 
773 #ifdef AF_INET6
774  case AF_INET6:
775  {
776  return 6;
777  }
778 #endif
779  }
780 
781  return 0; // for all other cases
782 }
783 
784 KIpAddress KInetSocketAddress::ipAddress() const
785 {
786  if (d->invalid())
787  return KIpAddress(); // return an empty address as well
788 
789  switch (d->addr.generic->sa_family)
790  {
791  case AF_INET:
792  {
793  return KIpAddress(&d->addr.in->sin_addr, 4);
794  }
795 #ifdef AF_INET6
796  case AF_INET6:
797  {
798  return KIpAddress(&d->addr.in6->sin6_addr, 6);
799  }
800 #endif
801  }
802 
803  return KIpAddress(); // empty in all other cases
804 }
805 
806 KInetSocketAddress& KInetSocketAddress::setHost(const KIpAddress& ip)
807 {
808  switch (ip.version())
809  {
810  case 4:
811  makeIPv4();
812  memcpy(&d->addr.in->sin_addr, ip.addr(), sizeof(d->addr.in->sin_addr));
813  break;
814 
815  case 6:
816  makeIPv6();
817  memcpy(&d->addr.in6->sin6_addr, ip.addr(), sizeof(d->addr.in6->sin6_addr));
818  break;
819 
820  default:
821  // empty
822  d->invalidate();
823  }
824 
825  return *this;
826 }
827 
828 // returns the port
829 TQ_UINT16 KInetSocketAddress::port() const
830 {
831  if (d->invalid())
832  return 0;
833 
834  switch (d->addr.generic->sa_family)
835  {
836  case AF_INET:
837  {
838  return ntohs(d->addr.in->sin_port);
839  }
840 
841 #ifdef AF_INET6
842  case AF_INET6:
843  {
844  return ntohs(d->addr.in6->sin6_port);
845  }
846 #endif
847  }
848 
849  return 0;
850 }
851 
852 KInetSocketAddress& KInetSocketAddress::setPort(TQ_UINT16 port)
853 {
854  if (d->invalid())
855  makeIPv4();
856 
857  switch (d->addr.generic->sa_family)
858  {
859  case AF_INET:
860  {
861  d->addr.in->sin_port = htons(port);
862  break;
863  }
864 
865 #ifdef AF_INET6
866  case AF_INET6:
867  {
868  d->addr.in6->sin6_port = htons(port);
869  break;
870  }
871 #endif
872 
873  default:
874  d->invalidate(); // setting the port on something else
875  }
876 
877  return *this;
878 }
879 
880 KInetSocketAddress& KInetSocketAddress::makeIPv4()
881 {
882  d->makeipv4();
883  return *this;
884 }
885 
886 KInetSocketAddress& KInetSocketAddress::makeIPv6()
887 {
888  d->makeipv6();
889  return *this;
890 }
891 
892 TQ_UINT32 KInetSocketAddress::flowinfo() const
893 {
894 #ifndef AF_INET6
895  return 0;
896 #else
897 
898  if (!d->invalid() && d->addr.in6->sin6_family == AF_INET6)
899  return d->addr.in6->sin6_flowinfo;
900  return 0;
901 #endif
902 }
903 
904 KInetSocketAddress& KInetSocketAddress::setFlowinfo(TQ_UINT32 flowinfo)
905 {
906  makeIPv6(); // must set here
907  d->addr.in6->sin6_flowinfo = flowinfo;
908  return *this;
909 }
910 
911 int KInetSocketAddress::scopeId() const
912 {
913 #ifndef AF_INET6
914  return 0;
915 #else
916 
917  if (!d->invalid() && d->addr.in6->sin6_family == AF_INET6)
918  return d->addr.in6->sin6_scope_id;
919  return 0;
920 #endif
921 }
922 
923 KInetSocketAddress& KInetSocketAddress::setScopeId(int scopeid)
924 {
925  makeIPv6(); // must set here
926  d->addr.in6->sin6_scope_id = scopeid;
927  return *this;
928 }
929 
930 void KInetSocketAddress::update()
931 {
932  if (d->addr.generic->sa_family == AF_INET)
933  return;
934 #ifdef AF_INET6
935  else if (d->addr.generic->sa_family == AF_INET6)
936  return;
937 #endif
938  else
939  d->invalidate();
940 }
941 
942 KUnixSocketAddress::KUnixSocketAddress()
943 {
944 }
945 
946 KUnixSocketAddress::KUnixSocketAddress(const sockaddr* sa, TQ_UINT16 len)
947  : TDESocketAddress(sa, len)
948 {
949  if (!d->invalid() && d->addr.un->sun_family != AF_UNIX)
950  d->invalidate();
951 }
952 
953 KUnixSocketAddress::KUnixSocketAddress(const KUnixSocketAddress& other)
954  : TDESocketAddress(other)
955 {
956 }
957 
958 KUnixSocketAddress::KUnixSocketAddress(const TQString& pathname)
959 {
960  setPathname(pathname);
961 }
962 
963 KUnixSocketAddress::KUnixSocketAddress(TDESocketAddressData* d)
964  : TDESocketAddress(d)
965 {
966 }
967 
968 KUnixSocketAddress::~KUnixSocketAddress()
969 {
970 }
971 
972 KUnixSocketAddress& KUnixSocketAddress::operator =(const KUnixSocketAddress& other)
973 {
974  TDESocketAddress::operator =(other);
975  return *this;
976 }
977 
978 TQString KUnixSocketAddress::pathname() const
979 {
980  if (!d->invalid() && d->addr.un->sun_family == AF_UNIX)
981  return TQFile::decodeName(d->addr.un->sun_path);
982  return TQString::null;
983 }
984 
985 KUnixSocketAddress& KUnixSocketAddress::setPathname(const TQString& path)
986 {
987  d->dup(0L, MIN_SOCKADDR_UN_LEN + path.length());
988  d->addr.un->sun_family = AF_UNIX;
989  strcpy(d->addr.un->sun_path, TQFile::encodeName(path));
990 
991 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
992  d->addr.un->sun_len = d->reallen;
993 #endif
994 
995  return *this;
996 }
KNetwork::KIpAddress::anyhostV6
static const KIpAddress anyhostV6
the any host or undefined address in IPv6 (::)
Definition: tdesocketaddress.h:411
KNetwork::KUnixSocketAddress
A Unix (local) socket address.
Definition: tdesocketaddress.h:840
KNetwork::TDESocketAddress::serviceName
virtual TQString serviceName() const
Returns the service name for this socket.
Definition: tdesocketaddress.cpp:603
KNetwork::TDESocketAddress
A generic socket address.
Definition: tdesocketaddress.h:423
KNetwork::TDESocketAddress::setAddress
TDESocketAddress & setAddress(const sockaddr *sa, TQ_UINT16 len)
Sets the address to the given address.
Definition: tdesocketaddress.cpp:475
KNetwork::KInetSocketAddress::flowinfo
TQ_UINT32 flowinfo() const
Returns the flowinfo information from the IPv6 socket address.
Definition: tdesocketaddress.cpp:892
KNetwork::TDESocketAddress::TDESocketAddress
TDESocketAddress()
Default constructor.
Definition: tdesocketaddress.cpp:418
KNetwork::KInetSocketAddress
an Internet socket address
Definition: tdesocketaddress.h:651
KNetwork::KIpAddress
An IP address.
Definition: tdesocketaddress.h:62
KNetwork::TDESocketAddress::toString
virtual TQString toString() const
Returns this socket address as a string suitable for printing.
Definition: tdesocketaddress.cpp:623
KNetwork::TDESocketAddress::operator==
bool operator==(const TDESocketAddress &other) const
Returns true if this equals the other socket.
Definition: tdesocketaddress.cpp:515
KNetwork::KInetSocketAddress::ipAddress
KIpAddress ipAddress() const
Returns the IP address component.
Definition: tdesocketaddress.cpp:784
KNetwork::KIpAddress::hostIPv4Addr
TQ_UINT32 hostIPv4Addr(bool convertMapped=true) const
This is a convenience function.
Definition: tdesocketaddress.cpp:211
KNetwork::TDESocketAddress::asUnix
KUnixSocketAddress & asUnix()
Returns an object reference that can be used to manipulate this socket as a Unix socket address...
Definition: tdesocketaddress.cpp:655
KNetwork::TDESocketAddress::ianaFamily
int ianaFamily() const
Returns the IANA family number of this address.
Definition: tdesocketaddress.h:550
KNetwork::KUnixSocketAddress::setPathname
KUnixSocketAddress & setPathname(const TQString &path)
Sets the pathname for the object.
Definition: tdesocketaddress.cpp:985
KNetwork
A namespace to store all networking-related (socket) classes.
Definition: kbufferedsocket.h:36
KNetwork::KIpAddress::localhostV4
static const KIpAddress localhostV4
localhost in IPv4 (127.0.0.1)
Definition: tdesocketaddress.h:404
KNetwork::KUnixSocketAddress::KUnixSocketAddress
KUnixSocketAddress()
Default constructor.
Definition: tdesocketaddress.cpp:942
KNetwork::TDESocketAddress::setLength
TDESocketAddress & setLength(TQ_UINT16 len)
Sets the length of this socket structure.
Definition: tdesocketaddress.cpp:492
KNetwork::KInetSocketAddress::setFlowinfo
KInetSocketAddress & setFlowinfo(TQ_UINT32 flowinfo)
Sets the flowinfo information for an IPv6 socket address.
Definition: tdesocketaddress.cpp:904
KNetwork::KInetSocketAddress::makeIPv6
KInetSocketAddress & makeIPv6()
Converts this object to an IPv6 socket address.
Definition: tdesocketaddress.cpp:886
KNetwork::KIpAddress::addr
const void * addr() const
Returns a pointer to binary raw data representing the address.
Definition: tdesocketaddress.h:220
tdelocale.h
KNetwork::KUnixSocketAddress::~KUnixSocketAddress
virtual ~KUnixSocketAddress()
Destructor.
Definition: tdesocketaddress.cpp:968
KNetwork::TDESocketAddress::operator=
TDESocketAddress & operator=(const TDESocketAddress &other)
Performs a shallow copy of the other object into this one.
Definition: tdesocketaddress.cpp:452
KNetwork::KIpAddress::setAddress
bool setAddress(const TQString &address)
Sets the address to the given string representation.
Definition: tdesocketaddress.cpp:129
KNetwork::KInetSocketAddress::ipVersion
int ipVersion() const
Returns the IP version of the address this object holds.
Definition: tdesocketaddress.cpp:761
KNetwork::TDESocketAddress::~TDESocketAddress
virtual ~TDESocketAddress()
Destructor.
Definition: tdesocketaddress.cpp:441
KNetwork::KUnixSocketAddress::operator=
KUnixSocketAddress & operator=(const KUnixSocketAddress &other)
Copy operator.
Definition: tdesocketaddress.cpp:972
KNetwork::KIpAddress::anyhostV4
static const KIpAddress anyhostV4
the any host or undefined address in IPv4 (0.0.0.0)
Definition: tdesocketaddress.h:406
KNetwork::KIpAddress::operator=
KIpAddress & operator=(const KIpAddress &other)
Copy operator.
Definition: tdesocketaddress.cpp:87
KNetwork::KInetSocketAddress::~KInetSocketAddress
virtual ~KInetSocketAddress()
Destroys this object.
Definition: tdesocketaddress.cpp:748
KNetwork::KInetSocketAddress::setScopeId
KInetSocketAddress & setScopeId(int scopeid)
Sets the scope id for this IPv6 object.
Definition: tdesocketaddress.cpp:923
KNetwork::TDESocketAddress::address
const sockaddr * address() const
Returns the socket address structure, to be passed down to low level functions.
Definition: tdesocketaddress.cpp:461
KNetwork::KInetSocketAddress::setHost
KInetSocketAddress & setHost(const KIpAddress &addr)
Sets the IP address to the given raw address.
Definition: tdesocketaddress.cpp:806
KNetwork::KIpAddress::toString
TQString toString() const
Returns the address as a string.
Definition: tdesocketaddress.cpp:189
KNetwork::TDESocketAddress::fromIanaFamily
static int fromIanaFamily(int iana)
Returns the address family of the given IANA family number.
Definition: tdesocketaddress.cpp:686
KNetwork::KInetSocketAddress::setPort
KInetSocketAddress & setPort(TQ_UINT16 port)
Sets the port number.
Definition: tdesocketaddress.cpp:852
KNetwork::KInetSocketAddress::scopeId
int scopeId() const
Returns the scope id this IPv6 socket is bound to.
Definition: tdesocketaddress.cpp:911
KNetwork::KInetSocketAddress::operator=
KInetSocketAddress & operator=(const KInetSocketAddress &other)
Copy operator.
Definition: tdesocketaddress.cpp:754
KNetwork::KInetSocketAddress::KInetSocketAddress
KInetSocketAddress()
Public constructor.
Definition: tdesocketaddress.cpp:708
KNetwork::KInetSocketAddress::makeIPv4
KInetSocketAddress & makeIPv4()
Converts this object to an IPv4 socket address.
Definition: tdesocketaddress.cpp:880
KNetwork::KIpAddress::version
int version() const
Retrieves the IP version in this object.
Definition: tdesocketaddress.h:171
KNetwork::TDESocketAddress::nodeName
virtual TQString nodeName() const
Returns the node name of this socket.
Definition: tdesocketaddress.cpp:576
KNetwork::KInetSocketAddress::port
TQ_UINT16 port() const
Retrieves the port number stored in this object.
Definition: tdesocketaddress.cpp:829
KNetwork::TDESocketAddress::asInet
KInetSocketAddress & asInet()
Returns an object reference that can be used to manipulate this socket as an Internet socket address...
Definition: tdesocketaddress.cpp:645
KNetwork::TDESocketAddress::family
int family() const
Returns the family of this address.
Definition: tdesocketaddress.cpp:499
KNetwork::KUnixSocketAddress::pathname
TQString pathname() const
Returns the pathname associated with this object.
Definition: tdesocketaddress.cpp:978
KNetwork::KIpAddress::localhostV6
static const KIpAddress localhostV6
localhost in IPv6 (::1)
Definition: tdesocketaddress.h:409
KNetwork::TDESocketAddress::length
TQ_UINT16 length() const
Returns the length of this socket address structure.
Definition: tdesocketaddress.cpp:485
KNetwork::KIpAddress::IPv4Addr
TQ_UINT32 IPv4Addr(bool convertMapped=true) const
This is a convenience function.
Definition: tdesocketaddress.h:235
KNetwork::KIpAddress::compare
bool compare(const KIpAddress &other, bool checkMapped=true) const
Compares this address against the other, supplied one and return true if they match.
Definition: tdesocketaddress.cpp:96
KNetwork::TDESocketAddress::setFamily
virtual TDESocketAddress & setFamily(int family)
Sets the family of this object.
Definition: tdesocketaddress.cpp:506

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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdecore by doxygen 1.8.8
This website is maintained by Timothy Pearson.