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

tdecore

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

tdecore

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

tdecore

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