⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 darwin_ipv6.patch

📁 使Darwin服务器能够支持IPv6的补丁
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+			memcpy(&(fOutputArray[index].fDestAddr.v6), SocketUtils::ConvertStringToAddr6(destAddrStr), sizeof(struct in6_addr));+			fOutputArray[index].family = AF_INET6;+		      }+		  } 	} 	prefTag = destTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "ttl"); 	if (prefTag != NULL)diff -u --new-file --recursive darwin-start/APIModules/QTSSReflectorModule/RTSPSourceInfo.cpp darwin/APIModules/QTSSReflectorModule/RTSPSourceInfo.cpp--- darwin-start/APIModules/QTSSReflectorModule/RTSPSourceInfo.cpp	Mon Jun 10 17:32:49 2002+++ darwin/APIModules/QTSSReflectorModule/RTSPSourceInfo.cpp	Tue Jul  2 15:31:08 2002@@ -78,15 +78,21 @@  RTSPSourceInfo::RTSPSourceInfo(const RTSPSourceInfo& copy) 	:RCFSourceInfo(copy), -	fHostAddr(copy.fHostAddr), fHostPort(copy.fHostPort), fLocalAddr(copy.fLocalAddr),+	fHostPort(copy.fHostPort),  	fNumSetupsComplete(copy.fNumSetupsComplete), fDescribeComplete(copy.fDescribeComplete), -	fAnnounce(copy.fAnnounce), fAnnounceIP(copy.fAnnounceIP), fAnnounceActualIP(copy.fAnnounceIP),fQueueElem(this)+	fAnnounce(copy.fAnnounce), fQueueElem(this) {  	fSourceURL = RTSPOutputInfo::CopyString(copy.fSourceURL);  	fUserName = RTSPOutputInfo::CopyString(copy.fUserName);  	fPassword = RTSPOutputInfo::CopyString(copy.fPassword);  	fAnnounceURL = RTSPOutputInfo::CopyString(copy.fAnnounceURL);  	+	memcpy(&(fHostAddr.v6), &(copy.fHostAddr.v6), sizeof(struct in6_addr));+	memcpy(&(fLocalAddr.v6), &(copy.fLocalAddr.v6), sizeof(struct in6_addr));++	memcpy(&(fAnnounceIP.v6), &(copy.fAnnounceIP.v6), sizeof(struct in6_addr));+	memcpy(&(fAnnounceActualIP.v6), &(copy.fAnnounceActualIP.v6), sizeof(struct in6_addr));+ 	fRTSPInfoArray = NEW RTSPOutputInfo[fNumOutputs]; 	for (UInt32 index=0; index < fNumOutputs; index++) 		fRTSPInfoArray[index].Copy(copy.fRTSPInfoArray[index]);@@ -155,12 +161,28 @@ 	if (inLocalAddr != 0) 		fClientSocket->GetSocket()->Bind(inLocalAddr, 0); }+void RTSPSourceInfo::SetClientInfo(struct in6_addr* inAddr, UInt16 inPort, char* inURL, struct in6_addr* inLocalAddr)+{+	if (fClientSocket != NULL)+		fClientSocket->Set(inAddr, inPort);+	+	StrPtrLen inURLPtrLen(inURL);+	+	if (fClient != NULL)+		fClient->Set(inURLPtrLen);++	if (inLocalAddr != 0)+		fClientSocket->GetSocket()->Bind(inLocalAddr, 0);+}  QTSS_Error RTSPSourceInfo::ParsePrefs(XMLTag* relayTag, Bool16 inAnnounce) { 	XMLTag* prefTag;-	UInt32 localAddr = 0;-	UInt32 theHostAddr = 0;+	union {+	  UInt32 v4;+	  struct in6_addr v6;+	} localAddr, theHostAddr;+	int sFamily = 0;  	UInt16 theHostPort = 554; 	char* userName = NULL; 	char* password = NULL;@@ -177,14 +199,40 @@ 	{ 		char* inAddrStr = prefTag->GetValue(); 		if (inAddrStr  != NULL)-			localAddr = SocketUtils::ConvertStringToAddr(inAddrStr);+		  {+		    char *ptr = strchr( inAddrStr, ':');+		    +		    if (ptr == NULL) // it's v4 address+		      {+			sFamily = AF_INET;+			localAddr.v4 = SocketUtils::ConvertStringToAddr(inAddrStr);+		      }+		    else // it's v6 address+		      {+			sFamily = AF_INET6;+			memcpy(&localAddr.v6, SocketUtils::ConvertStringToAddr6(inAddrStr), sizeof(struct in6_addr));+		      }+		  } 	} 	prefTag = sourceTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "source_addr"); 	if (prefTag != NULL) 	{ 		char* destAddrStr = prefTag->GetValue(); 		if (destAddrStr  != NULL)-			theHostAddr = SocketUtils::ConvertStringToAddr(destAddrStr);+		  {+		    char *ptr = strchr( destAddrStr, ':');+		    +		    if (ptr == NULL) // it's v4 address+		      {+			sFamily = AF_INET;+			theHostAddr.v4 = SocketUtils::ConvertStringToAddr(destAddrStr);+		      }+		    else // it's v6 address+		      {+			sFamily = AF_INET6;+			memcpy(&theHostAddr.v6, SocketUtils::ConvertStringToAddr6(destAddrStr), sizeof(struct in6_addr));+		      }+		  } 	} 	prefTag = sourceTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "rtsp_port"); 	if (prefTag != NULL)@@ -215,11 +263,11 @@ 	if (fAnnounce) 	{ 		fAnnounceURL = theURL.GetAsCString();-		fAnnounceIP = theHostAddr;	+		memcpy( &fAnnounceIP, &theHostAddr, sizeof(struct in6_addr));	 	} 	else 	{-		fHostAddr = theHostAddr;+		memcpy( &fHostAddr, &theHostAddr, sizeof(struct in6_addr)); 		fHostPort = theHostPort; 		fSourceURL = theURL.GetAsCString(); 		fUserName = RTSPOutputInfo::CopyString(userName);@@ -256,8 +304,8 @@ 		    fStreamArray[x].Copy(*theSourceInfo.GetStreamInfo(x));  		    // Copy all stream info data. Also set fSrcIPAddr to be the host addr-		    fStreamArray[x].fSrcIPAddr = fClientSocket->GetHostAddr();-		    fStreamArray[x].fDestIPAddr = fClientSocket->GetLocalAddr();+		    fStreamArray[x].fSrcIPAddr.v4 = fClientSocket->GetHostAddr();+		    fStreamArray[x].fDestIPAddr.v4 = fClientSocket->GetLocalAddr(); 		    fStreamArray[x].fPort = 0; 		    fStreamArray[x].fTimeToLive = 0; 		}@@ -406,6 +454,61 @@ 	return announceSDP; } +char*	RTSPSourceInfo::GetAnnounceSDP(struct in6_addr* ipAddr, UInt32* newSDPLen)+{+	char *announceSDP = NEW char[fLocalSDP.Len * 2];+	StringFormatter announceSDPFormatter(announceSDP, fLocalSDP.Len * 2);++	StrPtrLen sdpLine;+	StringParser sdpParser(&fLocalSDP);+	bool added = false;+	+	while (sdpParser.GetDataRemaining() > 0)+	{+		//stop when we reach an empty line.+		sdpParser.GetThruEOL(&sdpLine);+		if (sdpLine.Len == 0)+			continue;+			+		switch (*sdpLine.Ptr)+		{+			case 'c':+				break;	// remove any existing c lines+			case 'm':+			{+				if (!added)+				{+					added = true;+					// add a c line before the first m line+					char ipStr[50];+					char buff[50];+					StrPtrLen temp(buff);+				+					SocketUtils::ConvertAddrToString(ipAddr, &temp);+				   +					::sprintf(ipStr, "c=IN IP6 %s", buff);+					StrPtrLen tempLine(ipStr);+					announceSDPFormatter.Put(tempLine);+					announceSDPFormatter.PutEOL();+				}++				announceSDPFormatter.Put(sdpLine);+				announceSDPFormatter.PutEOL();+				break;//ignore connection information+			}+			default:+			{+				announceSDPFormatter.Put(sdpLine);+				announceSDPFormatter.PutEOL();+			}+		}+	}+	+	*newSDPLen = (UInt32)announceSDPFormatter.GetCurrentOffset();+	announceSDP[*newSDPLen] = 0;+	return announceSDP;+}+ void RTSPSourceInfo::ParseAnnouncedDestination(XMLTag* destTag, UInt32 index) { 	XMLTag* prefTag;@@ -417,14 +520,14 @@ 	{ 		char* outAddrStr = prefTag->GetValue(); 		if (outAddrStr  != NULL)-			fOutputArray[index].fLocalAddr = SocketUtils::ConvertStringToAddr(outAddrStr);+			fOutputArray[index].fLocalAddr.v4 = SocketUtils::ConvertStringToAddr(outAddrStr); 	} 	prefTag = destTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "dest_addr"); 	if (prefTag != NULL) 	{ 		char* destAddrStr = prefTag->GetValue(); 		if (destAddrStr  != NULL)-			fOutputArray[index].fDestAddr = SocketUtils::ConvertStringToAddr(destAddrStr);+			fOutputArray[index].fDestAddr.v4 = SocketUtils::ConvertStringToAddr(destAddrStr); 	} 	prefTag = destTag->GetEmbeddedTagByNameAndAttr("PREF", "NAME", "rtsp_port"); 	if (prefTag != NULL)@@ -477,15 +580,23 @@ 	if (!fAnnounce)     {		             StrPtrLen source(fSourceURL);     -            if( source.Equal(info->GetSourceURL()) && (fHostAddr == info->GetHostAddr()) +            if( source.Equal(info->GetSourceURL()) && (fHostAddr.v4 == info->GetHostAddr())                                                       && (fHostPort == info->GetHostPort()) )            		return true; 	}     else 	{             StrPtrLen announceURL(fAnnounceURL);-            if ((fAnnounceIP == info->GetAnnounceIP()) && announceURL.Equal(info->GetAnnounceURL()))-                return true;+	    if (family == AF_INET)+	      {+		if ((fAnnounceIP.v4 == info->GetAnnounceIP()) && announceURL.Equal(info->GetAnnounceURL()))+		  return true;+	      }+	    else if (family == AF_INET6)+	      {+		if ((memcmp(&fAnnounceIP.v6, info->GetAnnounceIP6(), sizeof(struct in6_addr)) == 0) && announceURL.Equal(info->GetAnnounceURL()))+		  return true;+	      } 	}          	return false;@@ -493,7 +604,14 @@  void RTSPSourceInfo::SetSourceParameters(UInt32 inHostAddr, UInt16 inHostPort, StrPtrLen& inURL) {-	fHostAddr = inHostAddr;+	fHostAddr.v4 = inHostAddr;+	fHostPort = inHostPort;+	fSourceURL = inURL.GetAsCString();+}++void RTSPSourceInfo::SetSourceParameters(struct in6_addr* inHostAddr, UInt16 inHostPort, StrPtrLen& inURL)+{+	memcpy(&fHostAddr.v6, inHostAddr, sizeof(struct in6_addr)); 	fHostPort = inHostPort; 	fSourceURL = inURL.GetAsCString(); }@@ -501,7 +619,7 @@ void RTSPSourceInfo::StartSessionCreatorTask(OSQueue* inSessionQueue, OSQueue* inSourceQueue) { 	InitClient(Socket::kNonBlockingSocketType);-	SetClientInfo(fHostAddr, fHostPort, fSourceURL, fLocalAddr);+	SetClientInfo(fHostAddr.v4, fHostPort, fSourceURL, fLocalAddr.v4); 	if (fUserName != NULL) 		fClient->SetName(fUserName); 	if (fPassword != NULL)@@ -555,8 +673,8 @@ 		    			fStreamArray[x].Copy(*theSourceInfo.GetStreamInfo(x));  		    			// Copy all stream info data. Also set fSrcIPAddr to be the host addr-		   				fStreamArray[x].fSrcIPAddr = fClientSocket->GetHostAddr();-		    			fStreamArray[x].fDestIPAddr = fClientSocket->GetLocalAddr();+		   				fStreamArray[x].fSrcIPAddr.v4 = fClientSocket->GetHostAddr();+		    			fStreamArray[x].fDestIPAddr.v4 = fClientSocket->GetLocalAddr(); 		    			fStreamArray[x].fPort = 0; 		    			fStreamArray[x].fTimeToLive = 0; 					}diff -u --new-file --recursive darwin-start/APIModules/QTSSReflectorModule/RTSPSourceInfo.h darwin/APIModules/QTSSReflectorModule/RTSPSourceInfo.h--- darwin-start/APIModules/QTSSReflectorModule/RTSPSourceInfo.h	Mon Jun 10 17:32:49 2002+++ darwin/APIModules/QTSSReflectorModule/RTSPSourceInfo.h	Tue Jul  2 15:31:08 2002@@ -77,10 +77,8 @@ 	public: 	 		// Specify whether the client should be blocking or non-blocking-		RTSPSourceInfo(Bool16 inAnnounce) :	fSourceURL(NULL),-											fHostAddr(0),+		RTSPSourceInfo(Bool16 inAnnounce) :	                                fSourceURL(NULL), 											fHostPort(0),-											fLocalAddr(0), 											fUserName(NULL), 											fPassword(NULL), 											fRTSPInfoArray(NULL),@@ -89,13 +87,16 @@ 											fNumSetupsComplete(0), 											fDescribeComplete(false), 											fAnnounce(inAnnounce),-                                            fAnnounceURL(NULL),-											fAnnounceIP(0),-											fAnnounceActualIP(0),+                                                                                        fAnnounceURL(NULL), 											fRelaySessionCreatorTask(NULL),   											fSession(NULL),  											fSessionQueue(NULL),-											fQueueElem(this) {}+											fQueueElem(this) {+		  bzero(&(fHostAddr.v6), sizeof(struct in6_addr));+		  bzero(&(fLocalAddr.v6), sizeof(struct in6_addr));+		  bzero(&(fAnnounceIP.v6), sizeof(struct in6_addr));+		  bzero(&(fAnnounceActualIP.v6), sizeof(struct in6_addr));+		} 		 		RTSPSourceInfo(const RTSPSourceInfo& copy); // Does copy dynamically allocated data 													// Doesn't copy fClientSocket and fClient ptrs@@ -106,7 +107,10 @@ 		void InitClient(UInt32 inSocketType); 		 		void SetClientInfo(UInt32 inAddr, UInt16 inPort, char* inURL, UInt32 inLocalAddr = 0);-		++		// IPv6 support. added by Aileen+		void SetClientInfo(struct in6_addr *inAddr, UInt16 inPort, char* inURL, struct in6_addr* inLocalAddr = NULL);+ 		// Call this immediately after the constructor. This object will parse 		// the config file and extract the necessary information to connect to an rtsp server. 		// Specify the config file line index where the "rtsp_source" line resides@@ -135,6 +139,10 @@ 		// producing an SDP file that appears to be local. 		virtual char*	GetLocalSDP(UInt32* newSDPLen); 		virtual char*	GetAnnounceSDP(UInt32 ipAddr, UInt32* newSDPLen);+		+		//IPv6 suppport, added by aileen+		virtual char*   GetAnnounceSDP(struct in6_addr* ipAddr, UInt32* newSDPLen);+	 		virtual StrPtrLen*	GetSourceID() { return fClient->GetURL(); } 		 		// This object looks for this keyword in the FilePrefsSource, where it@@ -155,20 +163,28 @@ 		Bool16 IsAnnounce() { return fAnnounce; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -