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

kdecore

  • kdecore
  • network
ksocketaddress.cpp
1 /* -*- C++ -*-
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 "klocale.h"
40 #include "ksocketaddress.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 #ifdef AF_INET6
201  inet_ntop(AF_INET6, m_data, buf, sizeof(buf) - 1);
202 #endif
203  return TQString::fromLatin1(buf);
204  }
205 
206  return TQString::null;
207 }
208 
209 TQ_UINT32 KIpAddress::hostIPv4Addr(bool convertMapped) const
210 {
211  TQ_UINT32 addr = IPv4Addr(convertMapped);
212  return ntohl(addr);
213 }
214 
215 /*
216  * An IPv6 socket address
217  * This is taken from RFC 2553.
218  */
219 struct our_sockaddr_in6
220 {
221 # ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
222  TQ_UINT8 sin6_len;
223  TQ_UINT8 sin6_family;
224 # else
225  TQ_UINT16 sin6_family;
226 # endif
227  TQ_UINT16 sin6_port; /* RFC says in_port_t */
228  TQ_UINT32 sin6_flowinfo;
229  TQ_UINT8 sin6_addr[16]; // 24 bytes up to here
230  TQ_UINT32 sin6_scope_id; // 28 bytes total
231 };
232 
233 // useful definitions
234 #define MIN_SOCKADDR_LEN sizeof(TQ_UINT16)
235 #define SOCKADDR_IN_LEN sizeof(sockaddr_in)
236 #define MIN_SOCKADDR_IN6_LEN ((unsigned long) &(((our_sockaddr_in6*)0)->sin6_scope_id))
237 #define SOCKADDR_IN6_LEN sizeof(our_sockaddr_in6)
238 #define MIN_SOCKADDR_UN_LEN (sizeof(TQ_UINT16) + sizeof(char))
239 
240 
241 class KNetwork::KSocketAddressData
242 {
243 public:
244  /*
245  * Note: maybe this should be virtual
246  * But since the data is shared via the d pointer, it doesn't really matter
247  * what one class sees, so will the other
248  */
249  class QMixSocketAddressRef : public KInetSocketAddress, public KUnixSocketAddress
250  {
251  public:
252  QMixSocketAddressRef(KSocketAddressData* d)
253  : KInetSocketAddress(d), KUnixSocketAddress(d)
254  {
255  }
256  };
257  QMixSocketAddressRef ref;
258 
259  union
260  {
261  struct sockaddr *generic;
262  struct sockaddr_in *in;
263  struct our_sockaddr_in6 *in6;
264  struct sockaddr_un *un;
265  } addr;
266  TQ_UINT16 curlen, reallen;
267 
268  KSocketAddressData()
269  : ref(this)
270  {
271  addr.generic = 0L;
272  curlen = 0;
273  invalidate();
274  }
275 
276  ~KSocketAddressData()
277  {
278  if (addr.generic != 0L)
279  free(addr.generic);
280  }
281 
282  inline bool invalid() const
283  { return reallen == 0; }
284 
285  inline void invalidate()
286  { reallen = 0; }
287 
288  void dup(const sockaddr* sa, TQ_UINT16 len, bool clear = true);
289 
290  void makeipv4()
291  {
292  short oldport = 0;
293  if (!invalid())
294  switch (addr.generic->sa_family)
295  {
296  case AF_INET:
297  return; // nothing to do here
298 #ifdef AF_INET6
299  case AF_INET6:
300  oldport = addr.in6->sin6_port;
301  break;
302 #endif
303  }
304 
305  // create new space
306  dup(0L, SOCKADDR_IN_LEN);
307 
308  addr.in->sin_family = AF_INET;
309 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
310  addr.in->sin_len = SOCKADDR_IN_LEN;
311 #endif
312  addr.in->sin_port = oldport;
313  }
314 
315  void makeipv6()
316  {
317  short oldport = 0;
318  if (!invalid())
319  switch (addr.generic->sa_family)
320  {
321  case AF_INET:
322  oldport = addr.in->sin_port;
323  break;
324 
325 #ifdef AF_INET6
326  case AF_INET6:
327  return; // nothing to do here
328 #endif
329  }
330 
331  // make room
332  dup(0L, SOCKADDR_IN6_LEN);
333 #ifdef AF_INET6
334  addr.in6->sin6_family = AF_INET6;
335 #endif
336 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
337  addr.in6->sin6_len = SOCKADDR_IN6_LEN;
338 #endif
339  addr.in6->sin6_port = oldport;
340  // sin6_scope_id and sin6_flowid are zero
341  }
342 
343 };
344 
345 // create duplicates of
346 void KSocketAddressData::dup(const sockaddr* sa, TQ_UINT16 len, bool clear)
347 {
348  if (len < MIN_SOCKADDR_LEN)
349  {
350  // certainly invalid
351  invalidate();
352  return;
353  }
354 
355  if (sa && ((sa->sa_family == AF_INET && len < SOCKADDR_IN_LEN) ||
356 #ifdef AF_INET6
357  (sa->sa_family == AF_INET6 && len < MIN_SOCKADDR_IN6_LEN) ||
358 #endif
359  (sa->sa_family == AF_UNIX && len < MIN_SOCKADDR_UN_LEN)))
360  {
361  // also invalid
362  invalidate();
363  return;
364  }
365 
366  // good
367  reallen = len;
368  if (len > curlen)
369  {
370  if (len < 32)
371  curlen = 32; // big enough for sockaddr_in and sockaddr_in6
372  else
373  curlen = len;
374  addr.generic = (sockaddr*)realloc(addr.generic, curlen);
375  }
376 
377  if (sa != 0L)
378  {
379  memcpy(addr.generic, sa, len); // copy
380 
381  // now, normalise the data
382  if (addr.generic->sa_family == AF_INET)
383  reallen = SOCKADDR_IN_LEN; // no need to be larger
384 #ifdef AF_INET6
385  else if (addr.generic->sa_family == AF_INET6)
386  {
387  // set the extra field (sin6_scope_id)
388 
389  // the buffer is never smaller than 32 bytes, so this is always
390  // allowed
391  if (reallen < SOCKADDR_IN6_LEN)
392  addr.in6->sin6_scope_id = 0;
393 
394  reallen = SOCKADDR_IN6_LEN;
395  }
396 #endif
397  else if (addr.generic->sa_family == AF_UNIX)
398  reallen = MIN_SOCKADDR_UN_LEN + strlen(addr.un->sun_path);
399  }
400  else if (clear)
401  {
402  memset(addr.generic, 0, len);
403  addr.generic->sa_family = AF_UNSPEC;
404  }
405 }
406 
407 // default constructor
408 KSocketAddress::KSocketAddress()
409  : d(new KSocketAddressData)
410 {
411 }
412 
413 // constructor from binary data
414 KSocketAddress::KSocketAddress(const sockaddr *sa, TQ_UINT16 len)
415  : d(new KSocketAddressData)
416 {
417  setAddress(sa, len);
418 }
419 
420 KSocketAddress::KSocketAddress(const KSocketAddress& other)
421  : d(new(KSocketAddressData))
422 {
423  *this = other;
424 }
425 
426 KSocketAddress::KSocketAddress(KSocketAddressData *d2)
427  : d(d2)
428 {
429 }
430 
431 KSocketAddress::~KSocketAddress()
432 {
433  // prevent double-deletion, since we're already being deleted
434  if (d)
435  {
436  d->ref.KInetSocketAddress::d = 0L;
437  d->ref.KUnixSocketAddress::d = 0L;
438  delete d;
439  }
440 }
441 
442 KSocketAddress& KSocketAddress::operator =(const KSocketAddress& other)
443 {
444  if (other.d && !other.d->invalid())
445  d->dup(other.d->addr.generic, other.d->reallen);
446  else
447  d->invalidate();
448  return *this;
449 }
450 
451 const sockaddr* KSocketAddress::address() const
452 {
453  if (d->invalid())
454  return 0L;
455  return d->addr.generic;
456 }
457 
458 sockaddr* KSocketAddress::address()
459 {
460  if (d->invalid())
461  return 0L;
462  return d->addr.generic;
463 }
464 
465 KSocketAddress& KSocketAddress::setAddress(const sockaddr* sa, TQ_UINT16 len)
466 {
467  if (sa != 0L && len >= MIN_SOCKADDR_LEN)
468  d->dup(sa, len);
469  else
470  d->invalidate();
471 
472  return *this;
473 }
474 
475 TQ_UINT16 KSocketAddress::length() const
476 {
477  if (d->invalid())
478  return 0;
479  return d->reallen;
480 }
481 
482 KSocketAddress& KSocketAddress::setLength(TQ_UINT16 len)
483 {
484  d->dup((sockaddr*)0L, len, false);
485 
486  return *this;
487 }
488 
489 int KSocketAddress::family() const
490 {
491  if (d->invalid())
492  return AF_UNSPEC;
493  return d->addr.generic->sa_family;
494 }
495 
496 KSocketAddress& KSocketAddress::setFamily(int family)
497 {
498  if (d->invalid())
499  d->dup((sockaddr*)0L, MIN_SOCKADDR_LEN);
500  d->addr.generic->sa_family = family;
501 
502  return *this;
503 }
504 
505 bool KSocketAddress::operator ==(const KSocketAddress& other) const
506 {
507  // if this is invalid, it's only equal if the other one is invalid as well
508  if (d->invalid())
509  return other.d->invalid();
510 
511  // check the family to make sure we don't do unnecessary comparison
512  if (d->addr.generic->sa_family != other.d->addr.generic->sa_family)
513  return false; // not the same family, not equal
514 
515  // same family then
516  // check the ones we know already
517  switch (d->addr.generic->sa_family)
518  {
519  case AF_INET:
520  Q_ASSERT(d->reallen == SOCKADDR_IN_LEN);
521  Q_ASSERT(other.d->reallen == SOCKADDR_IN_LEN);
522  return memcmp(d->addr.in, other.d->addr.in, SOCKADDR_IN_LEN) == 0;
523 
524 #ifdef AF_INET6
525  case AF_INET6:
526  Q_ASSERT(d->reallen >= MIN_SOCKADDR_IN6_LEN);
527  Q_ASSERT(other.d->reallen >= MIN_SOCKADDR_IN6_LEN);
528 
529 # if !defined(HAVE_STRUCT_SOCKADDR_IN6) || defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID)
530  // check for the case where sin6_scope_id isn't present
531  if (d->reallen != other.d->reallen)
532  {
533  if (memcmp(d->addr.in6, other.d->addr.in6, MIN_SOCKADDR_IN6_LEN) != 0)
534  return false; // not equal
535  if (d->reallen > other.d->reallen)
536  return d->addr.in6->sin6_scope_id == 0;
537  else
538  return other.d->addr.in6->sin6_scope_id == 0;
539  }
540 # endif
541 
542  return memcmp(d->addr.in6, other.d->addr.in6, d->reallen) == 0;
543 #endif
544 
545  case AF_UNIX:
546  Q_ASSERT(d->reallen >= MIN_SOCKADDR_UN_LEN);
547  Q_ASSERT(other.d->reallen >= MIN_SOCKADDR_UN_LEN);
548 
549  // do a string comparison here
550  return strcmp(d->addr.un->sun_path, other.d->addr.un->sun_path) == 0;
551 
552  default:
553  // something else we don't know about
554  // they are equal if and only if they are exactly equal
555  if (d->reallen == other.d->reallen)
556  return memcmp(d->addr.generic, other.d->addr.generic, d->reallen) == 0;
557  }
558 
559  return false; // not equal in any other case
560 }
561 
562 TQString KSocketAddress::nodeName() const
563 {
564  if (d->invalid())
565  return TQString::null;
566 
567  switch (d->addr.generic->sa_family)
568  {
569  case AF_INET:
570 #ifdef AF_INET6
571  case AF_INET6:
572 
573  TQString scopeid("%");
574  if (d->addr.generic->sa_family == AF_INET6 && d->addr.in6->sin6_scope_id)
575  scopeid += TQString::number(d->addr.in6->sin6_scope_id);
576  else
577  scopeid.truncate(0);
578  return d->ref.ipAddress().toString() + scopeid;
579 #else
580  return d->ref.ipAddress().toString();
581 #endif
582  }
583 
584  // any other case, including AF_UNIX
585  return TQString::null;
586 }
587 
588 TQString KSocketAddress::serviceName() const
589 {
590  if (d->invalid())
591  return TQString::null;
592 
593  switch (d->addr.generic->sa_family)
594  {
595  case AF_INET:
596 #ifdef AF_INET6
597  case AF_INET6:
598 #endif
599  return TQString::number(d->ref.port());
600 
601  case AF_UNIX:
602  return d->ref.pathname();
603  }
604 
605  return TQString::null;
606 }
607 
608 TQString KSocketAddress::toString() const
609 {
610  if (d->invalid())
611  return TQString::null;
612 
613  TQString fmt;
614 
615  if (d->addr.generic->sa_family == AF_INET)
616  fmt = "%1:%2";
617 #ifdef AF_INET6
618  else if (d->addr.generic->sa_family == AF_INET6)
619  fmt = "[%1]:%2";
620 #endif
621  else if (d->addr.generic->sa_family == AF_UNIX)
622  return TQString::fromLatin1("unix:%1").arg(serviceName());
623  else
624  return i18n("1: the unknown socket address family number",
625  "Unknown family %1").arg(d->addr.generic->sa_family);
626 
627  return fmt.arg(nodeName()).arg(serviceName());
628 }
629 
630 KInetSocketAddress& KSocketAddress::asInet()
631 {
632  return d->ref;
633 }
634 
635 KInetSocketAddress KSocketAddress::asInet() const
636 {
637  return d->ref;
638 }
639 
640 KUnixSocketAddress& KSocketAddress::asUnix()
641 {
642  return d->ref;
643 }
644 
645 KUnixSocketAddress KSocketAddress::asUnix() const
646 {
647  return d->ref;
648 }
649 
650 int KSocketAddress::ianaFamily(int af)
651 {
652  switch (af)
653  {
654  case AF_INET:
655  return 1;
656 
657 #ifdef AF_INET6
658  case AF_INET6:
659  return 2;
660 #endif
661 
662  default:
663  return 0;
664  }
665 }
666 
667 int KSocketAddress::fromIanaFamily(int iana)
668 {
669  switch (iana)
670  {
671  case 1:
672  return AF_INET;
673 
674 #ifdef AF_INET6
675  case 2:
676  return AF_INET6;
677 #endif
678 
679  default:
680  return AF_UNSPEC;
681  }
682 }
683 
684 // default constructor
685 KInetSocketAddress::KInetSocketAddress()
686 {
687 }
688 
689 // binary data constructor
690 KInetSocketAddress::KInetSocketAddress(const sockaddr* sa, TQ_UINT16 len)
691  : KSocketAddress(sa, len)
692 {
693  if (!d->invalid())
694  update();
695 }
696 
697 // create from IP and port
698 KInetSocketAddress::KInetSocketAddress(const KIpAddress& host, TQ_UINT16 port)
699 {
700  setHost(host);
701  setPort(port);
702 }
703 
704 // copy constructor
705 KInetSocketAddress::KInetSocketAddress(const KInetSocketAddress& other)
706  : KSocketAddress(other)
707 {
708 }
709 
710 // special copy constructor
711 KInetSocketAddress::KInetSocketAddress(const KSocketAddress& other)
712  : KSocketAddress(other)
713 {
714  if (!d->invalid())
715  update();
716 }
717 
718 // special constructor
719 KInetSocketAddress::KInetSocketAddress(KSocketAddressData *d)
720  : KSocketAddress(d)
721 {
722 }
723 
724 // destructor
725 KInetSocketAddress::~KInetSocketAddress()
726 {
727  /* nothing to do */
728 }
729 
730 // copy operator
731 KInetSocketAddress& KInetSocketAddress::operator =(const KInetSocketAddress& other)
732 {
733  KSocketAddress::operator =(other);
734  return *this;
735 }
736 
737 // IP version
738 int KInetSocketAddress::ipVersion() const
739 {
740  if (d->invalid())
741  return 0;
742 
743  switch (d->addr.generic->sa_family)
744  {
745  case AF_INET:
746  return 4;
747 
748 #ifdef AF_INET6
749  case AF_INET6:
750  return 6;
751 #endif
752  }
753 
754  return 0; // for all other cases
755 }
756 
757 KIpAddress KInetSocketAddress::ipAddress() const
758 {
759  if (d->invalid())
760  return KIpAddress(); // return an empty address as well
761 
762  switch (d->addr.generic->sa_family)
763  {
764  case AF_INET:
765  return KIpAddress(&d->addr.in->sin_addr, 4);
766 #ifdef AF_INET6
767  case AF_INET6:
768  return KIpAddress(&d->addr.in6->sin6_addr, 6);
769 #endif
770  }
771 
772  return KIpAddress(); // empty in all other cases
773 }
774 
775 KInetSocketAddress& KInetSocketAddress::setHost(const KIpAddress& ip)
776 {
777  switch (ip.version())
778  {
779  case 4:
780  makeIPv4();
781  memcpy(&d->addr.in->sin_addr, ip.addr(), sizeof(d->addr.in->sin_addr));
782  break;
783 
784  case 6:
785  makeIPv6();
786  memcpy(&d->addr.in6->sin6_addr, ip.addr(), sizeof(d->addr.in6->sin6_addr));
787  break;
788 
789  default:
790  // empty
791  d->invalidate();
792  }
793 
794  return *this;
795 }
796 
797 // returns the port
798 TQ_UINT16 KInetSocketAddress::port() const
799 {
800  if (d->invalid())
801  return 0;
802 
803  switch (d->addr.generic->sa_family)
804  {
805  case AF_INET:
806  return ntohs(d->addr.in->sin_port);
807 
808 #ifdef AF_INET6
809  case AF_INET6:
810  return ntohs(d->addr.in6->sin6_port);
811 #endif
812  }
813 
814  return 0;
815 }
816 
817 KInetSocketAddress& KInetSocketAddress::setPort(TQ_UINT16 port)
818 {
819  if (d->invalid())
820  makeIPv4();
821 
822  switch (d->addr.generic->sa_family)
823  {
824  case AF_INET:
825  d->addr.in->sin_port = htons(port);
826  break;
827 
828 #ifdef AF_INET6
829  case AF_INET6:
830  d->addr.in6->sin6_port = htons(port);
831  break;
832 #endif
833 
834  default:
835  d->invalidate(); // setting the port on something else
836  }
837 
838  return *this;
839 }
840 
841 KInetSocketAddress& KInetSocketAddress::makeIPv4()
842 {
843  d->makeipv4();
844  return *this;
845 }
846 
847 KInetSocketAddress& KInetSocketAddress::makeIPv6()
848 {
849  d->makeipv6();
850  return *this;
851 }
852 
853 TQ_UINT32 KInetSocketAddress::flowinfo() const
854 {
855 #ifndef AF_INET6
856  return 0;
857 #else
858 
859  if (!d->invalid() && d->addr.in6->sin6_family == AF_INET6)
860  return d->addr.in6->sin6_flowinfo;
861  return 0;
862 #endif
863 }
864 
865 KInetSocketAddress& KInetSocketAddress::setFlowinfo(TQ_UINT32 flowinfo)
866 {
867  makeIPv6(); // must set here
868  d->addr.in6->sin6_flowinfo = flowinfo;
869  return *this;
870 }
871 
872 int KInetSocketAddress::scopeId() const
873 {
874 #ifndef AF_INET6
875  return 0;
876 #else
877 
878  if (!d->invalid() && d->addr.in6->sin6_family == AF_INET6)
879  return d->addr.in6->sin6_scope_id;
880  return 0;
881 #endif
882 }
883 
884 KInetSocketAddress& KInetSocketAddress::setScopeId(int scopeid)
885 {
886  makeIPv6(); // must set here
887  d->addr.in6->sin6_scope_id = scopeid;
888  return *this;
889 }
890 
891 void KInetSocketAddress::update()
892 {
893  if (d->addr.generic->sa_family == AF_INET)
894  return;
895 #ifdef AF_INET6
896  else if (d->addr.generic->sa_family == AF_INET6)
897  return;
898 #endif
899  else
900  d->invalidate();
901 }
902 
903 KUnixSocketAddress::KUnixSocketAddress()
904 {
905 }
906 
907 KUnixSocketAddress::KUnixSocketAddress(const sockaddr* sa, TQ_UINT16 len)
908  : KSocketAddress(sa, len)
909 {
910  if (!d->invalid() && d->addr.un->sun_family != AF_UNIX)
911  d->invalidate();
912 }
913 
914 KUnixSocketAddress::KUnixSocketAddress(const KUnixSocketAddress& other)
915  : KSocketAddress(other)
916 {
917 }
918 
919 KUnixSocketAddress::KUnixSocketAddress(const TQString& pathname)
920 {
921  setPathname(pathname);
922 }
923 
924 KUnixSocketAddress::KUnixSocketAddress(KSocketAddressData* d)
925  : KSocketAddress(d)
926 {
927 }
928 
929 KUnixSocketAddress::~KUnixSocketAddress()
930 {
931 }
932 
933 KUnixSocketAddress& KUnixSocketAddress::operator =(const KUnixSocketAddress& other)
934 {
935  KSocketAddress::operator =(other);
936  return *this;
937 }
938 
939 TQString KUnixSocketAddress::pathname() const
940 {
941  if (!d->invalid() && d->addr.un->sun_family == AF_UNIX)
942  return TQFile::decodeName(d->addr.un->sun_path);
943  return TQString::null;
944 }
945 
946 KUnixSocketAddress& KUnixSocketAddress::setPathname(const TQString& path)
947 {
948  d->dup(0L, MIN_SOCKADDR_UN_LEN + path.length());
949  d->addr.un->sun_family = AF_UNIX;
950  strcpy(d->addr.un->sun_path, TQFile::encodeName(path));
951 
952 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
953  d->addr.un->sun_len = d->reallen;
954 #endif
955 
956  return *this;
957 }
KNetwork::KIpAddress::anyhostV6
static const KIpAddress anyhostV6
the any host or undefined address in IPv6 (::)
Definition: ksocketaddress.h:411
KNetwork::KUnixSocketAddress
A Unix (local) socket address.
Definition: ksocketaddress.h:840
KNetwork::KSocketAddress::nodeName
virtual TQString nodeName() const
Returns the node name of this socket.
Definition: ksocketaddress.cpp:562
KNetwork::KInetSocketAddress::flowinfo
TQ_UINT32 flowinfo() const
Returns the flowinfo information from the IPv6 socket address.
Definition: ksocketaddress.cpp:853
KNetwork::KSocketAddress::serviceName
virtual TQString serviceName() const
Returns the service name for this socket.
Definition: ksocketaddress.cpp:588
KNetwork::KInetSocketAddress
an Internet socket address
Definition: ksocketaddress.h:651
KNetwork::KIpAddress
An IP address.
Definition: ksocketaddress.h:62
KNetwork::KSocketAddress::~KSocketAddress
virtual ~KSocketAddress()
Destructor.
Definition: ksocketaddress.cpp:431
KNetwork::KSocketAddress
A generic socket address.
Definition: ksocketaddress.h:423
KNetwork::KInetSocketAddress::ipAddress
KIpAddress ipAddress() const
Returns the IP address component.
Definition: ksocketaddress.cpp:757
KNetwork::KSocketAddress::address
const sockaddr * address() const
Returns the socket address structure, to be passed down to low level functions.
Definition: ksocketaddress.cpp:451
klocale.h
KNetwork::KIpAddress::hostIPv4Addr
TQ_UINT32 hostIPv4Addr(bool convertMapped=true) const
This is a convenience function.
Definition: ksocketaddress.cpp:209
KNetwork::KSocketAddress::setLength
KSocketAddress & setLength(TQ_UINT16 len)
Sets the length of this socket structure.
Definition: ksocketaddress.cpp:482
KNetwork::KSocketAddress::setFamily
virtual KSocketAddress & setFamily(int family)
Sets the family of this object.
Definition: ksocketaddress.cpp:496
KNetwork::KUnixSocketAddress::setPathname
KUnixSocketAddress & setPathname(const TQString &path)
Sets the pathname for the object.
Definition: ksocketaddress.cpp:946
KNetwork
A namespace to store all networking-related (socket) classes.
Definition: kbufferedsocket.h:36
KNetwork::KSocketAddress::family
int family() const
Returns the family of this address.
Definition: ksocketaddress.cpp:489
KNetwork::KIpAddress::localhostV4
static const KIpAddress localhostV4
localhost in IPv4 (127.0.0.1)
Definition: ksocketaddress.h:404
KNetwork::KUnixSocketAddress::KUnixSocketAddress
KUnixSocketAddress()
Default constructor.
Definition: ksocketaddress.cpp:903
KNetwork::KInetSocketAddress::setFlowinfo
KInetSocketAddress & setFlowinfo(TQ_UINT32 flowinfo)
Sets the flowinfo information for an IPv6 socket address.
Definition: ksocketaddress.cpp:865
KNetwork::KInetSocketAddress::makeIPv6
KInetSocketAddress & makeIPv6()
Converts this object to an IPv6 socket address.
Definition: ksocketaddress.cpp:847
KNetwork::KIpAddress::addr
const void * addr() const
Returns a pointer to binary raw data representing the address.
Definition: ksocketaddress.h:220
KNetwork::KUnixSocketAddress::~KUnixSocketAddress
virtual ~KUnixSocketAddress()
Destructor.
Definition: ksocketaddress.cpp:929
KNetwork::KSocketAddress::asInet
KInetSocketAddress & asInet()
Returns an object reference that can be used to manipulate this socket as an Internet socket address...
Definition: ksocketaddress.cpp:630
KNetwork::KIpAddress::setAddress
bool setAddress(const TQString &address)
Sets the address to the given string representation.
Definition: ksocketaddress.cpp:129
KNetwork::KInetSocketAddress::ipVersion
int ipVersion() const
Returns the IP version of the address this object holds.
Definition: ksocketaddress.cpp:738
KNetwork::KUnixSocketAddress::operator=
KUnixSocketAddress & operator=(const KUnixSocketAddress &other)
Copy operator.
Definition: ksocketaddress.cpp:933
KNetwork::KIpAddress::anyhostV4
static const KIpAddress anyhostV4
the any host or undefined address in IPv4 (0.0.0.0)
Definition: ksocketaddress.h:406
KNetwork::KIpAddress::operator=
KIpAddress & operator=(const KIpAddress &other)
Copy operator.
Definition: ksocketaddress.cpp:87
KNetwork::KInetSocketAddress::~KInetSocketAddress
virtual ~KInetSocketAddress()
Destroys this object.
Definition: ksocketaddress.cpp:725
KNetwork::KInetSocketAddress::setScopeId
KInetSocketAddress & setScopeId(int scopeid)
Sets the scope id for this IPv6 object.
Definition: ksocketaddress.cpp:884
KNetwork::KSocketAddress::KSocketAddress
KSocketAddress()
Default constructor.
Definition: ksocketaddress.cpp:408
KNetwork::KSocketAddress::ianaFamily
int ianaFamily() const
Returns the IANA family number of this address.
Definition: ksocketaddress.h:550
KNetwork::KInetSocketAddress::setHost
KInetSocketAddress & setHost(const KIpAddress &addr)
Sets the IP address to the given raw address.
Definition: ksocketaddress.cpp:775
KNetwork::KSocketAddress::setAddress
KSocketAddress & setAddress(const sockaddr *sa, TQ_UINT16 len)
Sets the address to the given address.
Definition: ksocketaddress.cpp:465
KNetwork::KIpAddress::toString
TQString toString() const
Returns the address as a string.
Definition: ksocketaddress.cpp:189
KNetwork::KSocketAddress::toString
virtual TQString toString() const
Returns this socket address as a string suitable for printing.
Definition: ksocketaddress.cpp:608
KNetwork::KInetSocketAddress::setPort
KInetSocketAddress & setPort(TQ_UINT16 port)
Sets the port number.
Definition: ksocketaddress.cpp:817
KNetwork::KSocketAddress::fromIanaFamily
static int fromIanaFamily(int iana)
Returns the address family of the given IANA family number.
Definition: ksocketaddress.cpp:667
KNetwork::KInetSocketAddress::scopeId
int scopeId() const
Returns the scope id this IPv6 socket is bound to.
Definition: ksocketaddress.cpp:872
KNetwork::KInetSocketAddress::operator=
KInetSocketAddress & operator=(const KInetSocketAddress &other)
Copy operator.
Definition: ksocketaddress.cpp:731
KNetwork::KInetSocketAddress::KInetSocketAddress
KInetSocketAddress()
Public constructor.
Definition: ksocketaddress.cpp:685
KNetwork::KInetSocketAddress::makeIPv4
KInetSocketAddress & makeIPv4()
Converts this object to an IPv4 socket address.
Definition: ksocketaddress.cpp:841
KNetwork::KSocketAddress::operator=
KSocketAddress & operator=(const KSocketAddress &other)
Performs a shallow copy of the other object into this one.
Definition: ksocketaddress.cpp:442
KNetwork::KSocketAddress::operator==
bool operator==(const KSocketAddress &other) const
Returns true if this equals the other socket.
Definition: ksocketaddress.cpp:505
KNetwork::KIpAddress::version
int version() const
Retrieves the IP version in this object.
Definition: ksocketaddress.h:171
KNetwork::KInetSocketAddress::port
TQ_UINT16 port() const
Retrieves the port number stored in this object.
Definition: ksocketaddress.cpp:798
KNetwork::KUnixSocketAddress::pathname
TQString pathname() const
Returns the pathname associated with this object.
Definition: ksocketaddress.cpp:939
KNetwork::KSocketAddress::length
TQ_UINT16 length() const
Returns the length of this socket address structure.
Definition: ksocketaddress.cpp:475
KNetwork::KIpAddress::localhostV6
static const KIpAddress localhostV6
localhost in IPv6 (::1)
Definition: ksocketaddress.h:409
KNetwork::KSocketAddress::asUnix
KUnixSocketAddress & asUnix()
Returns an object reference that can be used to manipulate this socket as a Unix socket address...
Definition: ksocketaddress.cpp:640
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: ksocketaddress.cpp:96

kdecore

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

kdecore

Skip menu "kdecore"
  • arts
  • dcop
  • dnssd
  • interfaces
  •     interface
  •     library
  •   kspeech
  •   ktexteditor
  • kabc
  • kate
  • kcmshell
  • kdecore
  • kded
  • kdefx
  • kdeprint
  • kdesu
  • kdeui
  • kdoctools
  • khtml
  • kimgio
  • kinit
  • kio
  •   bookmarks
  •   httpfilter
  •   kfile
  •   kio
  •   kioexec
  •   kpasswdserver
  •   kssl
  • kioslave
  •   http
  • kjs
  • kmdi
  •   kmdi
  • knewstuff
  • kparts
  • krandr
  • kresources
  • kspell2
  • kunittest
  • kutils
  • kwallet
  • libkmid
  • libkscreensaver
Generated for kdecore by doxygen 1.8.11
This website is maintained by Timothy Pearson.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. |