28 #include <config-network.h>
30 #include <sys/types.h>
31 #include <sys/socket.h>
33 #include <arpa/inet.h>
34 #include <netinet/in.h>
48 using namespace KNetwork;
51 class KIpAddress_localhostV4 :
public KIpAddress
54 KIpAddress_localhostV4()
56 *m_data = htonl(0x7f000001);
61 class KIpAddress_localhostV6 :
public KIpAddress
64 KIpAddress_localhostV6()
73 static const char localhostV6_data[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,1 };
84 if (!(v6addr[0] == 0 && v6addr[1] == 0 && v6addr[2] == htonl(0x0000ffff)))
87 return v6addr[3] == v4addr;
138 if (address.indexOf(QLatin1Char(
':')) != -1)
144 if (
inet_pton(AF_INET6, address.toLatin1(), buf))
157 if (
inet_pton(AF_INET, address.toLatin1(), &buf))
180 if (version != 4 && version != 6)
185 memcpy(
m_data, raw, version == 4 ? 4 : 16);
195 char buf[
sizeof "1111:2222:3333:4444:5555:6666:255.255.255.255" + 2];
201 return QLatin1String(buf);
207 return QLatin1String(buf);
217 struct our_sockaddr_in6
219 # ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
227 quint8 sin6_addr[16];
232 #define MIN_SOCKADDR_LEN sizeof(quint16)
233 #define SOCKADDR_IN_LEN sizeof(sockaddr_in)
234 #define MIN_SOCKADDR_IN6_LEN ((quintptr) &(((our_sockaddr_in6*)0)->sin6_scope_id))
235 #define SOCKADDR_IN6_LEN sizeof(our_sockaddr_in6)
236 #define MIN_SOCKADDR_UN_LEN (sizeof(quint16) + sizeof(char))
239 class KNetwork::KSocketAddressData
250 QMixSocketAddressRef(KSocketAddressData* d)
255 QMixSocketAddressRef
ref;
259 struct sockaddr *
generic;
260 struct sockaddr_in *in;
261 struct our_sockaddr_in6 *in6;
262 struct sockaddr_un *un;
264 quint16 curlen, reallen;
274 ~KSocketAddressData()
276 if (addr.generic != 0L)
280 inline bool invalid()
const
281 {
return reallen == 0; }
283 inline void invalidate()
286 void dup(
const sockaddr* sa, quint16 len,
bool clear =
true);
292 switch (addr.generic->sa_family)
298 oldport = addr.in6->sin6_port;
306 addr.in->sin_family = AF_INET;
307 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
310 addr.in->sin_port = oldport;
317 switch (addr.generic->sa_family)
320 oldport = addr.in->sin_port;
332 addr.in6->sin6_family = AF_INET6;
334 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
337 addr.in6->sin6_port = oldport;
344 void KSocketAddressData::dup(
const sockaddr* sa, quint16 len,
bool clear)
372 addr.generic = (sockaddr*)realloc(addr.generic, curlen);
377 memcpy(addr.generic, sa, len);
380 if (addr.generic->sa_family == AF_INET)
383 else if (addr.generic->sa_family == AF_INET6)
390 addr.in6->sin6_scope_id = 0;
395 else if (addr.generic->sa_family == AF_UNIX)
400 memset(addr.generic, 0, len);
401 addr.generic->sa_family = AF_UNSPEC;
407 : d(new KSocketAddressData)
413 : d(new KSocketAddressData)
419 : d(new(KSocketAddressData))
434 d->ref.KInetSocketAddress::d = 0L;
435 d->ref.KUnixSocketAddress::d = 0L;
442 if (other.
d && !other.
d->invalid())
443 d->dup(other.
d->addr.generic, other.
d->reallen);
453 return d->addr.generic;
460 return d->addr.generic;
482 d->dup((sockaddr*)0L, len,
false);
491 return d->addr.generic->sa_family;
498 d->addr.generic->sa_family =
family;
507 return other.
d->invalid();
510 if (
d->addr.generic->sa_family != other.
d->addr.generic->sa_family)
515 switch (
d->addr.generic->sa_family)
527 # if !defined(HAVE_STRUCT_SOCKADDR_IN6) || defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID)
529 if (
d->reallen != other.
d->reallen)
533 if (
d->reallen > other.
d->reallen)
534 return d->addr.in6->sin6_scope_id == 0;
536 return other.
d->addr.in6->sin6_scope_id == 0;
540 return memcmp(
d->addr.in6, other.
d->addr.in6,
d->reallen) == 0;
548 return strcmp(
d->addr.un->sun_path, other.
d->addr.un->sun_path) == 0;
553 if (
d->reallen == other.
d->reallen)
554 return memcmp(
d->addr.generic, other.
d->addr.generic,
d->reallen) == 0;
565 switch (
d->addr.generic->sa_family)
571 QString scopeid(QLatin1Char(
'%'));
572 if (
d->addr.generic->sa_family == AF_INET6 &&
d->addr.in6->sin6_scope_id)
573 scopeid += QString::number(
d->addr.in6->sin6_scope_id);
576 return d->ref.ipAddress().toString() + scopeid;
578 return d->ref.ipAddress().toString();
591 switch (
d->addr.generic->sa_family)
597 return QString::number(
d->ref.port());
600 return d->ref.pathname();
613 if (
d->addr.generic->sa_family == AF_INET)
614 fmt = QLatin1String(
"%1:%2");
616 else if (
d->addr.generic->sa_family == AF_INET6)
617 fmt = QLatin1String(
"[%1]:%2");
619 else if (
d->addr.generic->sa_family == AF_UNIX)
622 return i18nc(
"1: the unknown socket address family number",
623 "Unknown family %1",
d->addr.generic->sa_family);
741 switch (
d->addr.generic->sa_family)
760 switch (
d->addr.generic->sa_family)
779 memcpy(&
d->addr.in->sin_addr, ip.
addr(),
sizeof(
d->addr.in->sin_addr));
784 memcpy(&
d->addr.in6->sin6_addr, ip.
addr(),
sizeof(
d->addr.in6->sin6_addr));
801 switch (
d->addr.generic->sa_family)
804 return ntohs(
d->addr.in->sin_port);
808 return ntohs(
d->addr.in6->sin6_port);
820 switch (
d->addr.generic->sa_family)
823 d->addr.in->sin_port = htons(port);
828 d->addr.in6->sin6_port = htons(port);
857 if (!
d->invalid() &&
d->addr.in6->sin6_family == AF_INET6)
858 return d->addr.in6->sin6_flowinfo;
876 if (!
d->invalid() &&
d->addr.in6->sin6_family == AF_INET6)
877 return d->addr.in6->sin6_scope_id;
885 d->addr.in6->sin6_scope_id = scopeid;
889 void KInetSocketAddress::update()
891 if (
d->addr.generic->sa_family == AF_INET)
894 else if (
d->addr.generic->sa_family == AF_INET6)
908 if (!
d->invalid() &&
d->addr.un->sun_family != AF_UNIX)
939 if (!
d->invalid() &&
d->addr.un->sun_family == AF_UNIX)
940 return QFile::decodeName(
d->addr.un->sun_path);
947 d->addr.un->sun_family = AF_UNIX;
948 strcpy(
d->addr.un->sun_path, QFile::encodeName(path));
950 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
951 d->addr.un->sun_len =
d->reallen;