diff options
author | Bradley T. Hughes <bradley.hughes@nokia.com> | 2010-05-05 14:49:15 (GMT) |
---|---|---|
committer | Bradley T. Hughes <bradley.hughes@nokia.com> | 2010-09-01 12:24:38 (GMT) |
commit | 7b2a41340bd1296a6712cd22ad7e8806f28c796c (patch) | |
tree | 249b4efa8c468a4d1870b5a41b9c3011cbb013ce /src/network/socket | |
parent | 4bdcc1a6f5d11ffb461f174ae3c808ce2512700a (diff) | |
download | Qt-7b2a41340bd1296a6712cd22ad7e8806f28c796c.zip Qt-7b2a41340bd1296a6712cd22ad7e8806f28c796c.tar.gz Qt-7b2a41340bd1296a6712cd22ad7e8806f28c796c.tar.bz2 |
Compile on systems without IP_ADD_SOURCE_MEMBERSHIP support
If a system does not support SSM (e.g. Mac OS X does not), then
requesting a specific sender results in a socket error.
Diffstat (limited to 'src/network/socket')
-rw-r--r-- | src/network/socket/qnativesocketengine_unix.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index f10c692..512cd34 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -46,6 +46,7 @@ #include "qhostaddress.h" #include "qelapsedtimer.h" #include "qvarlengtharray.h" +#include "qnetworkinterface.h" #include <time.h> #include <errno.h> #include <fcntl.h> @@ -585,6 +586,12 @@ int QNativeSocketEnginePrivate::nativeAccept() return acceptedDescriptor; } +#if !defined(IP_ADD_SOURCE_MEMBERSHIP) +# define QT_NO_MULTICAST_SSM +# define IP_ADD_SOURCE_MEMBERSHIP -1 +# define IP_DROP_SOURCE_MEMBERSHIP -1 +#endif + static bool doMulticast(QNativeSocketEnginePrivate *d, int howAsm6, int howAsm4, @@ -593,12 +600,16 @@ static bool doMulticast(QNativeSocketEnginePrivate *d, const QHostAddress &sourceAddress, const QNetworkInterface &interface) { + Q_UNUSED(howSsm4); + int sockOpt = 0; void *sockArg; int sockArgSize; ip_mreq asm4; +#ifndef QT_NO_MULTICAST_SSM ip_mreq_source ssm4; +#endif #ifndef QT_NO_IPV6 ipv6_mreq asm6; @@ -615,12 +626,19 @@ static bool doMulticast(QNativeSocketEnginePrivate *d, #endif if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol) { if (!sourceAddress.isNull()) { +#ifndef QT_NO_MULTICAST_SSM sockOpt = howSsm4; sockArg = &ssm4; sockArgSize = sizeof(ssm4); memset(&ssm4, 0, sizeof(ssm4)); ssm4.imr_multiaddr.s_addr = htonl(groupAddress.toIPv4Address()); ssm4.imr_sourceaddr.s_addr = htonl(sourceAddress.toIPv4Address()); +#else + // unreachable + d->setError(QAbstractSocket::UnsupportedSocketOperationError, + QNativeSocketEnginePrivate::ProtocolUnsupportedErrorString); + return false; +#endif } else { sockOpt = howAsm4; sockArg = &asm4; |