--- DarwinStreamingSrvr5.5.5-Source/Buildit	Fri Jul 14 11:36:35 2006
+++ DarwinStreamingSrvr5.5.5-Source-prune-20070717/Buildit	Tue Jul 17 11:28:15 2007
@@ -4,7 +4,7 @@
 if [ `uname` = "Darwin" ] ; then
     VERSION=dss
 else
-    VERSION=`grep kVersion revision.h | grep -o [:0123456789:].*[:0123456789:]`
+    VERSION="5.5.5"
 fi
 
 if [ "$1" = "install" ] ; then
@@ -125,7 +125,7 @@
 		LINKER="g++"
  		MAKE=make
  		
-		COMPILER_FLAGS="-D__solaris__ -D_REENTRANT -L/usr/local/lib -R/usr/local/lib"
+		COMPILER_FLAGS="-D__solaris__ -D_REENTRANT -DFD_SETSIZE=65536"
         INCLUDE_FLAG="-include"
 
 		CORE_LINK_LIBS="-lpthread -ldl -lsocket -lnsl -lresolv -lm -lcrypt -lstdc++"






--- DarwinStreamingSrvr5.5.5-Source/APIModules/QTSSReflectorModule/ReflectorStream.cpp	Fri Feb 16 00:13:47 2007
+++ DarwinStreamingSrvr5.5.5-Source-prune-20070717/APIModules/QTSSReflectorModule/ReflectorStream.cpp	Tue Jul 17 11:03:49 2007
@@ -61,6 +61,7 @@
 static Bool16                   sDefaultUsePacketReceiveTime        = false; 
 static UInt32                   sDefaultMaxFuturePacketTimeSec      = 60;
 static UInt32                   sDefaultFirstPacketOffsetMsec       = 500;
+static char*                    sDefaultIPListenForMulticast        = "127.0.0.1";
 
 UInt32                          ReflectorStream::sBucketSize  = 16;
 UInt32                          ReflectorStream::sOverBufferInMsec = 10000; // more or less what the client over buffer will be
@@ -72,6 +73,7 @@
 UInt32                          ReflectorStream::sBucketDelayInMsec = 73;
 Bool16                          ReflectorStream::sUsePacketReceiveTime = false;
 UInt32                          ReflectorStream::sFirstPacketOffsetMsec = 500;
+char*                           ReflectorStream::sIPListenForMulticast = "";
 
 void ReflectorStream::Register()
 {
@@ -107,6 +109,9 @@
     ReflectorStream::sOverBufferInMsec = sOverBufferInSec * 1000;
     ReflectorStream::sMaxFuturePacketMSec = sMaxFuturePacketSec * 1000;
     ReflectorStream::sMaxPacketAgeMSec = sOverBufferInMsec;
+
+    ReflectorStream::sIPListenForMulticast = QTSSModuleUtils::GetStringAttribute(inPrefs, "ip_listen_for_multicast", sDefaultIPListenForMulticast);
+    qtss_printf("Multicast Subscription IP is %s\n", ReflectorStream::sIPListenForMulticast);
 }
 
 void ReflectorStream::GenerateSourceID(SourceInfo::StreamInfo* inInfo, char* ioBuffer)
@@ -436,9 +441,9 @@
     //need to join a multicast group because we're not using multicast
 	if (isMulticastDest)
     {
-        QTSS_Error err = fSockets->GetSocketA()->JoinMulticast(fStreamInfo.fDestIPAddr);
+        QTSS_Error err = fSockets->GetSocketA()->JoinMulticast(fStreamInfo.fDestIPAddr, ReflectorStream::sIPListenForMulticast);
         if (err == QTSS_NoErr)
-            err = fSockets->GetSocketB()->JoinMulticast(fStreamInfo.fDestIPAddr);
+            err = fSockets->GetSocketB()->JoinMulticast(fStreamInfo.fDestIPAddr, ReflectorStream::sIPListenForMulticast);
         // If we get an error when setting the TTL, this isn't too important (TTL on
         // these sockets is only useful for RTCP RRs.
         if (err == QTSS_NoErr)






--- DarwinStreamingSrvr5.5.5-Source/APIModules/QTSSReflectorModule/ReflectorStream.h	Fri Feb 16 00:13:47 2007
+++ DarwinStreamingSrvr5.5.5-Source-prune-20070717/APIModules/QTSSReflectorModule/ReflectorStream.h	Tue Jul 17 10:04:09 2007
@@ -478,6 +478,7 @@
         static UInt32       sBucketDelayInMsec;
         static Bool16       sUsePacketReceiveTime;
         static UInt32       sFirstPacketOffsetMsec;
+	static char*	    sIPListenForMulticast;
         
         friend class ReflectorSocket;
         friend class ReflectorSender;






--- DarwinStreamingSrvr5.5.5-Source/CommonUtilitiesLib/OS.cpp	Wed May 18 10:01:14 2005
+++ DarwinStreamingSrvr5.5.5-Source-prune-20070717/CommonUtilitiesLib/OS.cpp	Fri Jul  6 17:20:57 2007
@@ -69,10 +69,14 @@
     #include <sys/sysctl.h>
 #endif
 
-#if (__solaris__ || __linux__ || __linuxppc__)
+#if (__linux__ || __linuxppc__)
     #include "StringParser.h"
 #endif
 
+#if (__solaris__)
+       #include <unistd.h>
+#endif
+
 #if __sgi__
 	#include <sys/systeminfo.h>
 #endif
@@ -410,37 +414,8 @@
 #if(__solaris__)
 {
     UInt32 numCPUs = 0;
-    char linebuff[512] = "";
-    StrPtrLen line(linebuff, sizeof(linebuff));
-    StrPtrLen word;
-
-    FILE *p = ::popen("uname -X","r");
-    while((::fgets(linebuff, sizeof(linebuff -1), p)) > 0)
-    {
-        StringParser lineParser(&line);
-        lineParser.ConsumeWhitespace(); //skip over leading whitespace
-
-        if (lineParser.GetDataRemaining() == 0) // must be an empty line
-            continue;
-
-        lineParser.ConsumeUntilWhitespace(&word);
-
-        if ( word.Equal("NumCPU")) // found a tag as first word in line
-        {
-            lineParser.GetThru(NULL,'=');
-            lineParser.ConsumeWhitespace();  //skip over leading whitespace
-            lineParser.ConsumeUntilWhitespace(&word); //read the number of cpus
-            if (word.Len > 0)
-                ::sscanf(word.Ptr, "%lu", &numCPUs);
-
-            break;
-        }
-    }
-    if (numCPUs == 0)
-        numCPUs = 1;
-        
-    ::pclose(p);
     
+    numCPUs = sysconf(_SC_NPROCESSORS_ONLN);
 	return numCPUs;
 }
 #endif






--- DarwinStreamingSrvr5.5.5-Source/CommonUtilitiesLib/UDPSocket.cpp	Wed May 18 10:01:14 2005
+++ DarwinStreamingSrvr5.5.5-Source-prune-20070717/CommonUtilitiesLib/UDPSocket.cpp	Tue Jul 17 11:35:07 2007
@@ -51,6 +51,7 @@
 #include <errno.h>
 #include "UDPSocket.h"
 #include "OSMemory.h"
+#include <arpa/inet.h>
 
 #ifdef USE_NETLOG
 #include <netlog.h>
@@ -119,17 +120,32 @@
     return OS_NoErr;        
 }
 
-OS_Error UDPSocket::JoinMulticast(UInt32 inRemoteAddr)
+OS_Error UDPSocket::JoinMulticast(UInt32 inRemoteAddr, char* inIPListenForMulticast)
 {
     struct ip_mreq  theMulti;
-        UInt32 localAddr = fLocalAddr.sin_addr.s_addr; // Already in network byte order
+	UInt32 localAddr;
+ 
+    // Prune - prune@lecentre.net - 20070717
+    // add support for multi-homed multicast 
+    // Check http://www.lecentre.net/blog/archives/54 for detail
 
+    if (inIPListenForMulticast == "0") {
+        localAddr = fLocalAddr.sin_addr.s_addr; // Already in network byte order
+	qtss_printf("Join multicast on INADDR_ANY\n");
+	}
+    else  {
+	localAddr = inet_addr(inIPListenForMulticast);
+	qtss_printf("Join multicast on %s\n", inIPListenForMulticast);
+	}
+
 #if __solaris__
     if( localAddr == htonl(INADDR_ANY) )
          localAddr = htonl(SocketUtils::GetIPAddr(0));
 #endif
+
     theMulti.imr_multiaddr.s_addr = htonl(inRemoteAddr);
     theMulti.imr_interface.s_addr = localAddr;
+
     int err = setsockopt(fFileDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&theMulti, sizeof(theMulti));
     //AssertV(err == 0, OSThread::GetErrno());
     if (err == -1)






--- DarwinStreamingSrvr5.5.5-Source/CommonUtilitiesLib/UDPSocket.h	Wed May 18 10:01:14 2005
+++ DarwinStreamingSrvr5.5.5-Source-prune-20070717/CommonUtilitiesLib/UDPSocket.h	Tue Jul 17 10:02:56 2007
@@ -62,7 +62,7 @@
         //Open
         OS_Error    Open() { return Socket::Open(SOCK_DGRAM); }
 
-        OS_Error    JoinMulticast(UInt32 inRemoteAddr);
+        OS_Error    JoinMulticast(UInt32 inRemoteAddr, char* inIPListenForMulticast);
         OS_Error    LeaveMulticast(UInt32 inRemoteAddr);
         OS_Error    SetTtl(UInt16 timeToLive);
         OS_Error    SetMulticastInterface(UInt32 inLocalAddr);
