• 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
44using namespace KNetwork;
45
46#if 0
47class KIpAddress_localhostV4 : public KIpAddress
48{
49public:
50 KIpAddress_localhostV4()
51 {
52 *m_data = htonl(0x7f000001);
53 m_version = 4;
54 }
55};
56
57class KIpAddress_localhostV6 : public KIpAddress
58{
59public:
60 KIpAddress_localhostV6()
61 : KIpAddress(0L, 6)
62 {
63 m_data[3] = htonl(1);
64 }
65};
66#endif
67
68static const char localhostV4_data[] = { 127, 0, 0, 1 };
69static const char localhostV6_data[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,1 };
70
71const KIpAddress KIpAddress::localhostV4(&localhostV4_data, 4);
72const KIpAddress KIpAddress::localhostV6(&localhostV6_data, 6);
73const KIpAddress KIpAddress::anyhostV4(0L, 4);
74const KIpAddress KIpAddress::anyhostV6(0L, 6);
75
76// helper function to test if an IPv6 v4-mapped address is equal to its IPv4 counterpart
77static 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
87KIpAddress& 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
96bool 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
129bool 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
166bool KIpAddress::setAddress(const char* address)
167{
168 return setAddress(TQString::fromLatin1(address));
169}
170
171// set from binary data
172bool 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
189TQString 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
211TQ_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 */
221struct 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
243class KNetwork::TDESocketAddressData
244{
245public:
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
356void 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
418TDESocketAddress::TDESocketAddress()
419 : d(new TDESocketAddressData)
420{
421}
422
423// constructor from binary data
424TDESocketAddress::TDESocketAddress(const sockaddr *sa, TQ_UINT16 len)
425 : d(new TDESocketAddressData)
426{
427 setAddress(sa, len);
428}
429
430TDESocketAddress::TDESocketAddress(const TDESocketAddress& other)
431 : d(new(TDESocketAddressData))
432{
433 *this = other;
434}
435
436TDESocketAddress::TDESocketAddress(TDESocketAddressData *d2)
437 : d(d2)
438{
439}
440
441TDESocketAddress::~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
452TDESocketAddress& 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
461const sockaddr* TDESocketAddress::address() const
462{
463 if (d->invalid())
464 return 0L;
465 return d->addr.generic;
466}
467
468sockaddr* TDESocketAddress::address()
469{
470 if (d->invalid())
471 return 0L;
472 return d->addr.generic;
473}
474
475TDESocketAddress& 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
485TQ_UINT16 TDESocketAddress::length() const
486{
487 if (d->invalid())
488 return 0;
489 return d->reallen;
490}
491
492TDESocketAddress& TDESocketAddress::setLength(TQ_UINT16 len)
493{
494 d->dup((sockaddr*)0L, len, false);
495
496 return *this;
497}
498
499int TDESocketAddress::family() const
500{
501 if (d->invalid())
502 return AF_UNSPEC;
503 return d->addr.generic->sa_family;
504}
505
506TDESocketAddress& 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
515bool 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
576TQString 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
603TQString 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
623TQString 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
645KInetSocketAddress& TDESocketAddress::asInet()
646{
647 return d->ref;
648}
649
650KInetSocketAddress TDESocketAddress::asInet() const
651{
652 return d->ref;
653}
654
655KUnixSocketAddress& TDESocketAddress::asUnix()
656{
657 return d->ref;
658}
659
660KUnixSocketAddress TDESocketAddress::asUnix() const
661{
662 return d->ref;
663}
664
665int 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
686int 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
708KInetSocketAddress::KInetSocketAddress()
709{
710}
711
712// binary data constructor
713KInetSocketAddress::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
721KInetSocketAddress::KInetSocketAddress(const KIpAddress& host, TQ_UINT16 port)
722{
723 setHost(host);
724 setPort(port);
725}
726
727// copy constructor
728KInetSocketAddress::KInetSocketAddress(const KInetSocketAddress& other)
729 : TDESocketAddress(other)
730{
731}
732
733// special copy constructor
734KInetSocketAddress::KInetSocketAddress(const TDESocketAddress& other)
735 : TDESocketAddress(other)
736{
737 if (!d->invalid())
738 update();
739}
740
741// special constructor
742KInetSocketAddress::KInetSocketAddress(TDESocketAddressData *d)
743 : TDESocketAddress(d)
744{
745}
746
747// destructor
748KInetSocketAddress::~KInetSocketAddress()
749{
750 /* nothing to do */
751}
752
753// copy operator
754KInetSocketAddress& KInetSocketAddress::operator =(const KInetSocketAddress& other)
755{
756 TDESocketAddress::operator =(other);
757 return *this;
758}
759
760// IP version
761int 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
784KIpAddress 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
806KInetSocketAddress& 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
829TQ_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
852KInetSocketAddress& 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
880KInetSocketAddress& KInetSocketAddress::makeIPv4()
881{
882 d->makeipv4();
883 return *this;
884}
885
886KInetSocketAddress& KInetSocketAddress::makeIPv6()
887{
888 d->makeipv6();
889 return *this;
890}
891
892TQ_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
904KInetSocketAddress& KInetSocketAddress::setFlowinfo(TQ_UINT32 flowinfo)
905{
906 makeIPv6(); // must set here
907 d->addr.in6->sin6_flowinfo = flowinfo;
908 return *this;
909}
910
911int 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
923KInetSocketAddress& KInetSocketAddress::setScopeId(int scopeid)
924{
925 makeIPv6(); // must set here
926 d->addr.in6->sin6_scope_id = scopeid;
927 return *this;
928}
929
930void 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
942KUnixSocketAddress::KUnixSocketAddress()
943{
944}
945
946KUnixSocketAddress::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
953KUnixSocketAddress::KUnixSocketAddress(const KUnixSocketAddress& other)
954 : TDESocketAddress(other)
955{
956}
957
958KUnixSocketAddress::KUnixSocketAddress(const TQString& pathname)
959{
960 setPathname(pathname);
961}
962
963KUnixSocketAddress::KUnixSocketAddress(TDESocketAddressData* d)
964 : TDESocketAddress(d)
965{
966}
967
968KUnixSocketAddress::~KUnixSocketAddress()
969{
970}
971
972KUnixSocketAddress& KUnixSocketAddress::operator =(const KUnixSocketAddress& other)
973{
974 TDESocketAddress::operator =(other);
975 return *this;
976}
977
978TQString 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
985KUnixSocketAddress& 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::KInetSocketAddress
an Internet socket address
Definition: tdesocketaddress.h:652
KNetwork::KInetSocketAddress::setPort
KInetSocketAddress & setPort(TQ_UINT16 port)
Sets the port number.
Definition: tdesocketaddress.cpp:852
KNetwork::KInetSocketAddress::~KInetSocketAddress
virtual ~KInetSocketAddress()
Destroys this object.
Definition: tdesocketaddress.cpp:748
KNetwork::KInetSocketAddress::makeIPv6
KInetSocketAddress & makeIPv6()
Converts this object to an IPv6 socket address.
Definition: tdesocketaddress.cpp:886
KNetwork::KInetSocketAddress::KInetSocketAddress
KInetSocketAddress()
Public constructor.
Definition: tdesocketaddress.cpp:708
KNetwork::KInetSocketAddress::setScopeId
KInetSocketAddress & setScopeId(int scopeid)
Sets the scope id for this IPv6 object.
Definition: tdesocketaddress.cpp:923
KNetwork::KInetSocketAddress::port
TQ_UINT16 port() const
Retrieves the port number stored in this object.
Definition: tdesocketaddress.cpp:829
KNetwork::KInetSocketAddress::operator=
KInetSocketAddress & operator=(const KInetSocketAddress &other)
Copy operator.
Definition: tdesocketaddress.cpp:754
KNetwork::KInetSocketAddress::setFlowinfo
KInetSocketAddress & setFlowinfo(TQ_UINT32 flowinfo)
Sets the flowinfo information for an IPv6 socket address.
Definition: tdesocketaddress.cpp:904
KNetwork::KInetSocketAddress::ipVersion
int ipVersion() const
Returns the IP version of the address this object holds.
Definition: tdesocketaddress.cpp:761
KNetwork::KInetSocketAddress::scopeId
int scopeId() const
Returns the scope id this IPv6 socket is bound to.
Definition: tdesocketaddress.cpp:911
KNetwork::KInetSocketAddress::ipAddress
KIpAddress ipAddress() const
Returns the IP address component.
Definition: tdesocketaddress.cpp:784
KNetwork::KInetSocketAddress::flowinfo
TQ_UINT32 flowinfo() const
Returns the flowinfo information from the IPv6 socket address.
Definition: tdesocketaddress.cpp:892
KNetwork::KInetSocketAddress::setHost
KInetSocketAddress & setHost(const KIpAddress &addr)
Sets the IP address to the given raw address.
Definition: tdesocketaddress.cpp:806
KNetwork::KInetSocketAddress::makeIPv4
KInetSocketAddress & makeIPv4()
Converts this object to an IPv4 socket address.
Definition: tdesocketaddress.cpp:880
KNetwork::KIpAddress
An IP address.
Definition: tdesocketaddress.h:63
KNetwork::KIpAddress::version
int version() const
Retrieves the IP version in this object.
Definition: tdesocketaddress.h:171
KNetwork::KIpAddress::hostIPv4Addr
TQ_UINT32 hostIPv4Addr(bool convertMapped=true) const
This is a convenience function.
Definition: tdesocketaddress.cpp:211
KNetwork::KIpAddress::IPv4Addr
TQ_UINT32 IPv4Addr(bool convertMapped=true) const
This is a convenience function.
Definition: tdesocketaddress.h:235
KNetwork::KIpAddress::addr
const void * addr() const
Returns a pointer to binary raw data representing the address.
Definition: tdesocketaddress.h:220
KNetwork::KIpAddress::setAddress
bool setAddress(const TQString &address)
Sets the address to the given string representation.
Definition: tdesocketaddress.cpp:129
KNetwork::KIpAddress::toString
TQString toString() const
Returns the address as a string.
Definition: tdesocketaddress.cpp:189
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::KUnixSocketAddress
A Unix (local) socket address.
Definition: tdesocketaddress.h:841
KNetwork::KUnixSocketAddress::pathname
TQString pathname() const
Returns the pathname associated with this object.
Definition: tdesocketaddress.cpp:978
KNetwork::KUnixSocketAddress::~KUnixSocketAddress
virtual ~KUnixSocketAddress()
Destructor.
Definition: tdesocketaddress.cpp:968
KNetwork::KUnixSocketAddress::KUnixSocketAddress
KUnixSocketAddress()
Default constructor.
Definition: tdesocketaddress.cpp:942
KNetwork::KUnixSocketAddress::operator=
KUnixSocketAddress & operator=(const KUnixSocketAddress &other)
Copy operator.
Definition: tdesocketaddress.cpp:972
KNetwork::KUnixSocketAddress::setPathname
KUnixSocketAddress & setPathname(const TQString &path)
Sets the pathname for the object.
Definition: tdesocketaddress.cpp:985
KNetwork::TDESocketAddress
A generic socket address.
Definition: tdesocketaddress.h:424
KNetwork::TDESocketAddress::setAddress
TDESocketAddress & setAddress(const sockaddr *sa, TQ_UINT16 len)
Sets the address to the given address.
Definition: tdesocketaddress.cpp:475
KNetwork::TDESocketAddress::fromIanaFamily
static int fromIanaFamily(int iana)
Returns the address family of the given IANA family number.
Definition: tdesocketaddress.cpp:686
KNetwork::TDESocketAddress::TDESocketAddress
TDESocketAddress()
Default constructor.
Definition: tdesocketaddress.cpp:418
KNetwork::TDESocketAddress::family
int family() const
Returns the family of this address.
Definition: tdesocketaddress.cpp:499
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::setFamily
virtual TDESocketAddress & setFamily(int family)
Sets the family of this object.
Definition: tdesocketaddress.cpp:506
KNetwork::TDESocketAddress::~TDESocketAddress
virtual ~TDESocketAddress()
Destructor.
Definition: tdesocketaddress.cpp:441
KNetwork::TDESocketAddress::operator=
TDESocketAddress & operator=(const TDESocketAddress &other)
Performs a shallow copy of the other object into this one.
Definition: tdesocketaddress.cpp:452
KNetwork::TDESocketAddress::setLength
TDESocketAddress & setLength(TQ_UINT16 len)
Sets the length of this socket structure.
Definition: tdesocketaddress.cpp:492
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::serviceName
virtual TQString serviceName() const
Returns the service name for this socket.
Definition: tdesocketaddress.cpp:603
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::TDESocketAddress::operator==
bool operator==(const TDESocketAddress &other) const
Returns true if this equals the other socket.
Definition: tdesocketaddress.cpp:515
KNetwork::TDESocketAddress::length
TQ_UINT16 length() const
Returns the length of this socket address structure.
Definition: tdesocketaddress.cpp:485
KNetwork::TDESocketAddress::toString
virtual TQString toString() const
Returns this socket address as a string suitable for printing.
Definition: tdesocketaddress.cpp:623
KNetwork::TDESocketAddress::nodeName
virtual TQString nodeName() const
Returns the node name of this socket.
Definition: tdesocketaddress.cpp:576
KNetwork::TDESocketAddress::ianaFamily
int ianaFamily() const
Returns the IANA family number of this address.
Definition: tdesocketaddress.h:550
KNetwork
A namespace to store all networking-related (socket) classes.
Definition: kbufferedsocket.h:36
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.4
This website is maintained by Timothy Pearson.