summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
authorBradley T. Hughes <bradley.hughes@nokia.com>2010-05-05 14:49:15 (GMT)
committerBradley T. Hughes <bradley.hughes@nokia.com>2010-09-01 12:24:38 (GMT)
commit7b2a41340bd1296a6712cd22ad7e8806f28c796c (patch)
tree249b4efa8c468a4d1870b5a41b9c3011cbb013ce /src/network/socket
parent4bdcc1a6f5d11ffb461f174ae3c808ce2512700a (diff)
downloadQt-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.cpp18
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;