diff --git a/live-getaddrinfo.patch b/live-getaddrinfo.patch new file mode 100644 index 0000000..16a17ee --- /dev/null +++ b/live-getaddrinfo.patch @@ -0,0 +1,152 @@ +Copyright (C) 2010 Rémi Denis-Courmont. +Licensed under GNU General Public License version 2 or higher. +diff -ru live.orig//groupsock/GroupsockHelper.cpp live//groupsock/GroupsockHelper.cpp +--- live.orig//groupsock/GroupsockHelper.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/GroupsockHelper.cpp 2010-04-17 20:18:11.000000000 +0300 +@@ -625,25 +625,29 @@ + #include + if (ERROR == (ourAddress = hostGetByName( hostname ))) break; + #else +- struct hostent* hstent +- = (struct hostent*)gethostbyname(hostname); +- if (hstent == NULL || hstent->h_length != 4) { +- env.setResultErrMsg("initial gethostbyname() failed"); ++ struct addrinfo hints, *res; ++ memset(&hints, 0, sizeof(hints)); ++ hints.ai_family = AF_INET; ++ hints.ai_socktype = SOCK_DGRAM; ++ hints.ai_protocol = IPPROTO_UDP; ++ if (getaddrinfo(hostname, NULL, &hints, &res)) { ++ env.setResultErrMsg("initial getaddrinfo() failed"); + break; + } + // Take the first address that's not bad + // (This code, like many others, won't handle IPv6) + netAddressBits addr = 0; +- for (unsigned i = 0; ; ++i) { +- char* addrPtr = hstent->h_addr_list[i]; +- if (addrPtr == NULL) break; ++ for (const struct addrinfo *p = res; p; p = p->ai_next) { ++ const struct in_addr in = ++ ((const struct sockaddr_in *)p->ai_addr)->sin_addr; + +- netAddressBits a = *(netAddressBits*)addrPtr; ++ netAddressBits a = in.s_addr; + if (!badAddress(a)) { + addr = a; + break; + } + } ++ freeaddrinfo(res); + if (addr != 0) { + fromAddr.sin_addr.s_addr = addr; + } else { +diff -ru live.orig//groupsock/inet.c live//groupsock/inet.c +--- live.orig//groupsock/inet.c 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/inet.c 2010-04-17 20:14:07.000000000 +0300 +@@ -83,16 +83,6 @@ + #define NULL 0 + #endif + +-#if !defined(VXWORKS) +-struct hostent* our_gethostbyname(name) +- char* name; +-{ +- if (!initializeWinsockIfNecessary()) return NULL; +- +- return (struct hostent*) gethostbyname(name); +-} +-#endif +- + #ifndef USE_OUR_RANDOM + /* Use the system-supplied "random()" and "srandom()" functions */ + #include +diff -ru live.orig//groupsock/NetAddress.cpp live//groupsock/NetAddress.cpp +--- live.orig//groupsock/NetAddress.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/NetAddress.cpp 2010-04-17 20:13:29.000000000 +0300 +@@ -83,15 +83,12 @@ + + NetAddressList::NetAddressList(char const* hostname) + : fNumAddresses(0), fAddressArray(NULL) { +- struct hostent* host; ++ ++ struct addrinfo *res; + + // Check first whether "hostname" is an IP address string: + netAddressBits addr = our_inet_addr((char*)hostname); + if (addr != INADDR_NONE) { // yes it was an IP address string +- //##### host = gethostbyaddr((char*)&addr, sizeof (netAddressBits), AF_INET); +- host = NULL; // don't bother calling gethostbyaddr(); we only want 1 addr +- +- if (host == NULL) { + // For some unknown reason, gethostbyaddr() failed, so just + // return a 1-element list with the address we were given: + fNumAddresses = 1; +@@ -101,41 +98,40 @@ + fAddressArray[0] = new NetAddress((u_int8_t*)&addr, + sizeof (netAddressBits)); + return; +- } + } else { // Try resolving "hostname" as a real host name + +-#if defined(VXWORKS) +- char hostentBuf[512]; +- host = (struct hostent*)resolvGetHostByName((char*)hostname,(char*)&hostentBuf,sizeof hostentBuf); +-#else +- host = our_gethostbyname((char*)hostname); +-#endif ++ struct addrinfo hints; ++ memset(&hints, 0, sizeof(hints)); ++ hints.ai_family = AF_INET; ++ hints.ai_socktype = SOCK_DGRAM; /* be sure to not get dups! */ ++ hints.ai_protocol = IPPROTO_UDP; + +- if (host == NULL) { ++ if (getaddrinfo(hostname, NULL, &hints, &res)) + // It was a host name, and we couldn't resolve it. We're SOL. + return; +- } + } + +- u_int8_t const** const hAddrPtr +- = (u_int8_t const**)host->h_addr_list; +- if (hAddrPtr != NULL) { +- // First, count the number of addresses: +- u_int8_t const** hAddrPtr1 = hAddrPtr; +- while (*hAddrPtr1 != NULL) { +- ++fNumAddresses; +- ++hAddrPtr1; +- } +- +- // Next, set up the list: +- fAddressArray = new NetAddress*[fNumAddresses]; +- if (fAddressArray == NULL) return; +- +- for (unsigned i = 0; i < fNumAddresses; ++i) { +- fAddressArray[i] +- = new NetAddress(hAddrPtr[i], host->h_length); +- } ++ // First, count the number of addresses: ++ for (const struct addrinfo *p = res; p; p = p->ai_next) ++ fNumAddresses++; ++ ++ // Next, set up the list: ++ fAddressArray = new NetAddress*[fNumAddresses]; ++ ++ unsigned i = 0; ++ for (const struct addrinfo *p = res; p; p = p->ai_next) { ++ union ++ { ++ struct in_addr ip4; ++ uint8_t b[4]; ++ } buf; ++ const struct sockaddr_in *sin = ++ (const struct sockaddr_in *)p->ai_addr; ++ ++ buf.ip4 = sin->sin_addr; ++ fAddressArray[i++] = new NetAddress(buf.b, 4); + } ++ freeaddrinfo(res); + } + + NetAddressList::NetAddressList(NetAddressList const& orig) { diff --git a/live-inet_ntop.patch b/live-inet_ntop.patch new file mode 100644 index 0000000..8129874 --- /dev/null +++ b/live-inet_ntop.patch @@ -0,0 +1,302 @@ +Copyright (C) 2010 Rémi Denis-Courmont. +Licensed under GNU General Public License version 2 or higher. +diff -ru live.orig//groupsock/Groupsock.cpp live//groupsock/Groupsock.cpp +--- live.orig//groupsock/Groupsock.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/Groupsock.cpp 2010-04-17 19:51:07.000000000 +0300 +@@ -331,8 +331,10 @@ + } + } + if (DebugLevel >= 3) { ++ char buf[16]; ++ + env() << *this << ": read " << bytesRead << " bytes from "; +- env() << our_inet_ntoa(fromAddress.sin_addr); ++ env() << our_inet_ntoa(fromAddress.sin_addr, buf); + if (numMembers > 0) { + env() << "; relayed to " << numMembers << " members"; + } +@@ -441,13 +443,14 @@ + } + + UsageEnvironment& operator<<(UsageEnvironment& s, const Groupsock& g) { ++ char buf[16]; + UsageEnvironment& s1 = s << timestampString() << " Groupsock(" + << g.socketNum() << ": " +- << our_inet_ntoa(g.groupAddress()) ++ << our_inet_ntoa(g.groupAddress(), buf) + << ", " << g.port() << ", "; + if (g.isSSM()) { + return s1 << "SSM source: " +- << our_inet_ntoa(g.sourceFilterAddress()) << ")"; ++ << our_inet_ntoa(g.sourceFilterAddress(), buf) << ")"; + } else { + return s1 << (unsigned)(g.ttl()) << ")"; + } +diff -ru live.orig//groupsock/include/GroupsockHelper.hh live//groupsock/include/GroupsockHelper.hh +--- live.orig//groupsock/include/GroupsockHelper.hh 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/include/GroupsockHelper.hh 2010-04-17 19:43:44.000000000 +0300 +@@ -124,7 +124,7 @@ + + // The following are implemented in inet.c: + extern "C" netAddressBits our_inet_addr(char const*); +-extern "C" char* our_inet_ntoa(struct in_addr); ++extern "C" char* our_inet_ntoa(struct in_addr, char *); + extern "C" struct hostent* our_gethostbyname(char* name); + extern "C" void our_srandom(int x); + extern "C" long our_random(); +diff -ru live.orig//groupsock/inet.c live//groupsock/inet.c +--- live.orig//groupsock/inet.c 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/inet.c 2010-04-17 19:42:52.000000000 +0300 +@@ -21,26 +21,18 @@ + } + + char * +-our_inet_ntoa(in) +- struct in_addr in; ++our_inet_ntoa(in, result) ++ struct in_addr in; ++ char *result; + { +-#ifndef VXWORKS +- return inet_ntoa(in); ++#ifdef WIN32 ++ char *ret = inet_ntoa(in); ++ if(ret != NULL) ++ strncpy(result, ret, 16); ++ return ret; ++#elif !defined (VXWORKS) ++ return inet_ntop(AF_INET, &in, result, 16); + #else +- /* according the man pages of inet_ntoa : +- +- NOTES +- The return value from inet_ntoa() points to a buffer which +- is overwritten on each call. This buffer is implemented as +- thread-specific data in multithreaded applications. +- +- the vxworks version of inet_ntoa allocates a buffer for each +- ip address string, and does not reuse the same buffer. +- +- this is merely to simulate the same behaviour (not multithread +- safe though): +- */ +- static char result[INET_ADDR_LEN]; + inet_ntoa_b(in, result); + return(result); + #endif +diff -ru live.orig//liveMedia/DarwinInjector.cpp live//liveMedia/DarwinInjector.cpp +--- live.orig//liveMedia/DarwinInjector.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/DarwinInjector.cpp 2010-04-17 19:45:19.000000000 +0300 +@@ -128,7 +128,8 @@ + NetAddress const* address = addresses.firstAddress(); + addr.s_addr = *(unsigned*)(address->data()); + } +- char const* remoteRTSPServerAddressStr = our_inet_ntoa(addr); ++ char buf[16]; ++ char const* remoteRTSPServerAddressStr = our_inet_ntoa(addr, buf); + + // Construct a SDP description for the session that we'll be streaming: + char const* const sdpFmt = +diff -ru live.orig//liveMedia/OnDemandServerMediaSubsession.cpp live//liveMedia/OnDemandServerMediaSubsession.cpp +--- live.orig//liveMedia/OnDemandServerMediaSubsession.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/OnDemandServerMediaSubsession.cpp 2010-04-17 19:50:05.000000000 +0300 +@@ -365,7 +365,8 @@ + char const* mediaType = rtpSink->sdpMediaType(); + unsigned char rtpPayloadType = rtpSink->rtpPayloadType(); + struct in_addr serverAddrForSDP; serverAddrForSDP.s_addr = fServerAddressForSDP; +- char* const ipAddressStr = strDup(our_inet_ntoa(serverAddrForSDP)); ++ char ipAddressStr[16]; ++ our_inet_ntoa(serverAddrForSDP, ipAddressStr); + char* rtpmapLine = rtpSink->rtpmapLine(); + char const* rangeLine = rangeSDPLine(); + char const* auxSDPLine = getAuxSDPLine(rtpSink, inputSource); +@@ -398,7 +399,7 @@ + rangeLine, // a=range:... (if present) + auxSDPLine, // optional extra SDP line + trackId()); // a=control: +- delete[] (char*)rangeLine; delete[] rtpmapLine; delete[] ipAddressStr; ++ delete[] (char*)rangeLine; delete[] rtpmapLine; + + fSDPLines = strDup(sdpLines); + delete[] sdpLines; +diff -ru live.orig//liveMedia/PassiveServerMediaSubsession.cpp live//liveMedia/PassiveServerMediaSubsession.cpp +--- live.orig//liveMedia/PassiveServerMediaSubsession.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/PassiveServerMediaSubsession.cpp 2010-04-17 19:46:28.000000000 +0300 +@@ -54,7 +54,8 @@ + char const* auxSDPLine = fRTPSink.auxSDPLine(); + if (auxSDPLine == NULL) auxSDPLine = ""; + +- char* const ipAddressStr = strDup(our_inet_ntoa(ipAddress)); ++ char ipAddressStr[16]; ++ our_inet_ntoa(ipAddress, ipAddressStr); + + char const* const sdpFmt = + "m=%s %d RTP/AVP %d\r\n" +@@ -84,7 +85,7 @@ + rangeLine, // a=range:... (if present) + auxSDPLine, // optional extra SDP line + trackId()); // a=control: +- delete[] ipAddressStr; delete[] (char*)rangeLine; delete[] rtpmapLine; ++ delete[] (char*)rangeLine; delete[] rtpmapLine; + + fSDPLines = strDup(sdpLines); + delete[] sdpLines; +diff -ru live.orig//liveMedia/RTCP.cpp live//liveMedia/RTCP.cpp +--- live.orig//liveMedia/RTCP.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/RTCP.cpp 2010-04-17 19:46:44.000000000 +0300 +@@ -359,7 +359,8 @@ + } + + #ifdef DEBUG +- fprintf(stderr, "[%p]saw incoming RTCP packet (from address %s, port %d)\n", this, our_inet_ntoa(fromAddress.sin_addr), ntohs(fromAddress.sin_port)); ++ char buf[16]; ++ fprintf(stderr, "[%p]saw incoming RTCP packet (from address %s, port %d)\n", this, our_inet_ntoa(fromAddress.sin_addr, buf), ntohs(fromAddress.sin_port)); + unsigned char* p = pkt; + for (unsigned i = 0; i < packetSize; ++i) { + if (i%4 == 0) fprintf(stderr, " "); +diff -ru live.orig//liveMedia/RTSPOverHTTPServer.cpp live//liveMedia/RTSPOverHTTPServer.cpp +--- live.orig//liveMedia/RTSPOverHTTPServer.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/RTSPOverHTTPServer.cpp 2010-04-17 19:50:41.000000000 +0300 +@@ -128,7 +128,8 @@ + makeSocketNonBlocking(clientSocket); + increaseSendBufferTo(envir(), clientSocket, 50*1024); + #if defined(DEBUG) || defined(DEBUG_CONNECTIONS) +- fprintf(stderr, "accept()ed connection from %s\n", our_inet_ntoa(clientAddr.sin_addr)); ++ char buf[16]; ++ fprintf(stderr, "accept()ed connection from %s\n", our_inet_ntoa(clientAddr.sin_addr, buf)); + #endif + + // Create a new object for handling this HTTP connection: +diff -ru live.orig//liveMedia/RTSPServer.cpp live//liveMedia/RTSPServer.cpp +--- live.orig//liveMedia/RTSPServer.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/RTSPServer.cpp 2010-04-17 19:49:32.000000000 +0300 +@@ -112,11 +112,12 @@ + char urlBuffer[100]; // more than big enough for "rtsp://:/" + + portNumBits portNumHostOrder = ntohs(fServerPort.num()); ++ char buf[16]; + if (portNumHostOrder == 554 /* the default port number */) { +- sprintf(urlBuffer, "rtsp://%s/", our_inet_ntoa(ourAddress.sin_addr)); ++ sprintf(urlBuffer, "rtsp://%s/", our_inet_ntoa(ourAddress.sin_addr, buf)); + } else { + sprintf(urlBuffer, "rtsp://%s:%hu/", +- our_inet_ntoa(ourAddress.sin_addr), portNumHostOrder); ++ our_inet_ntoa(ourAddress.sin_addr, buf), portNumHostOrder); + } + + return strDup(urlBuffer); +@@ -233,7 +234,8 @@ + increaseSendBufferTo(envir(), clientSocket, 50*1024); + + #if defined(DEBUG) || defined(DEBUG_CONNECTIONS) +- envir() << "accept()ed connection from " << our_inet_ntoa(clientAddr.sin_addr) << '\n'; ++ char buf[16]; ++ envir() << "accept()ed connection from " << our_inet_ntoa(clientAddr.sin_addr, buf) << '\n'; + #endif + + // Create a new object for this RTSP session. +@@ -747,10 +749,12 @@ + serverRTPPort, serverRTCPPort, + fStreamStates[streamNum].streamToken); + struct in_addr destinationAddr; destinationAddr.s_addr = destinationAddress; +- char* destAddrStr = strDup(our_inet_ntoa(destinationAddr)); ++ char destAddrStr[16]; ++ our_inet_ntoa(destinationAddr, destAddrStr); + struct sockaddr_in sourceAddr; SOCKLEN_T namelen = sizeof sourceAddr; + getsockname(fClientSocket, (struct sockaddr*)&sourceAddr, &namelen); +- char* sourceAddrStr = strDup(our_inet_ntoa(sourceAddr.sin_addr)); ++ char sourceAddrStr[16]; ++ our_inet_ntoa(sourceAddr.sin_addr, sourceAddrStr); + if (fIsMulticast) { + switch (streamingMode) { + case RTP_UDP: +@@ -825,7 +829,7 @@ + } + } + } +- delete[] destAddrStr; delete[] sourceAddrStr; delete[] streamingModeString; ++ delete[] streamingModeString; + } + + void RTSPServer::RTSPClientSession +@@ -1226,7 +1230,8 @@ + // If this gets called, the client session is assumed to have timed out, + // so delete it: + #ifdef DEBUG +- fprintf(stderr, "RTSP client session from %s has timed out (due to inactivity)\n", our_inet_ntoa(clientSession->fClientAddr.sin_addr)); ++ char buf[16]; ++ fprintf(stderr, "RTSP client session from %s has timed out (due to inactivity)\n", our_inet_ntoa(clientSession->fClientAddr.sin_addr, buf)); + #endif + delete clientSession; + } +diff -ru live.orig//liveMedia/ServerMediaSession.cpp live//liveMedia/ServerMediaSession.cpp +--- live.orig//liveMedia/ServerMediaSession.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/ServerMediaSession.cpp 2010-04-17 19:50:31.000000000 +0300 +@@ -185,7 +185,8 @@ + char* ServerMediaSession::generateSDPDescription() { + struct in_addr ipAddress; + ipAddress.s_addr = ourIPAddress(envir()); +- char* const ipAddressStr = strDup(our_inet_ntoa(ipAddress)); ++ char ipAddressStr[16]; ++ our_inet_ntoa(ipAddress, ipAddressStr); + unsigned ipAddressStrSize = strlen(ipAddressStr); + + // For a SSM sessions, we need a "a=source-filter: incl ..." line also: +@@ -281,7 +282,7 @@ + } + } while (0); + +- delete[] rangeLine; delete[] sourceFilterLine; delete[] ipAddressStr; ++ delete[] rangeLine; delete[] sourceFilterLine; + return sdp; + } + +diff -ru live.orig//liveMedia/SIPClient.cpp live//liveMedia/SIPClient.cpp +--- live.orig//liveMedia/SIPClient.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/SIPClient.cpp 2010-04-17 19:47:42.000000000 +0300 +@@ -60,13 +60,14 @@ + + struct in_addr ourAddress; + ourAddress.s_addr = ourIPAddress(env); // hack +- fOurAddressStr = strDup(our_inet_ntoa(ourAddress)); ++ char buf[16]; ++ fOurAddressStr = strDup(our_inet_ntoa(ourAddress, buf)); + fOurAddressStrSize = strlen(fOurAddressStr); + + fOurSocket = new Groupsock(env, ourAddress, 0, 255); + if (fOurSocket == NULL) { + env << "ERROR: Failed to create socket for addr " +- << our_inet_ntoa(ourAddress) << ": " ++ << our_inet_ntoa(ourAddress, buf) << ": " + << env.getResultMsg() << "\n"; + } + +@@ -84,7 +85,7 @@ + fOurSocket = new Groupsock(env, ourAddress, fOurPortNum, 255); + if (fOurSocket == NULL) { + env << "ERROR: Failed to create socket for addr " +- << our_inet_ntoa(ourAddress) << ", port " ++ << our_inet_ntoa(ourAddress, buf) << ", port " + << fOurPortNum << ": " + << env.getResultMsg() << "\n"; + } +diff -ru live.orig//testProgs/sapWatch.cpp live//testProgs/sapWatch.cpp +--- live.orig//testProgs/sapWatch.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//testProgs/sapWatch.cpp 2010-04-17 19:51:29.000000000 +0300 +@@ -49,13 +49,14 @@ + struct sockaddr_in fromAddress; + while (inputGroupsock.handleRead(packet, maxPacketSize, + packetSize, fromAddress)) { ++ char buf[16]; + printf("\n[packet from %s (%d bytes)]\n", +- our_inet_ntoa(fromAddress.sin_addr), packetSize); ++ our_inet_ntoa(fromAddress.sin_addr, buf), packetSize); + + // Ignore the first 8 bytes (SAP header). + if (packetSize < 8) { + *env << "Ignoring short packet from " +- << our_inet_ntoa(fromAddress.sin_addr) << "%s!\n"; ++ << our_inet_ntoa(fromAddress.sin_addr, buf) << "%s!\n"; + continue; + } + diff --git a/live-uselocale.patch b/live-uselocale.patch new file mode 100644 index 0000000..e1f5401 --- /dev/null +++ b/live-uselocale.patch @@ -0,0 +1,115 @@ +Copyright (C) 2008 Rémi Denis-Courmont, adaptation by Felix Kühne (C) 2009. +Licensed under GNU General Public License version 2 or higher. +diff -urN live.orig/liveMedia/include/Locale.hh live/liveMedia/include/Locale.hh +--- live.orig/liveMedia/include/Locale.hh 2009-03-23 01:26:16 +0300 ++++ live/liveMedia/include/Locale.hh 2009-03-26 19:17:43 +0300 +@@ -27,23 +27,26 @@ + + #ifndef LOCALE_NOT_USED + #include ++#ifdef __APPLE__ ++#include ++#endif + #else +-#ifndef LC_ALL +-#define LC_ALL 0 ++#ifndef LC_ALL_MASK ++#define LC_ALL_MASK 0 + #endif +-#ifndef LC_NUMERIC +-#define LC_NUMERIC 4 ++#ifndef LC_NUMERIC_MASK ++#define LC_NUMERIC_MASK 0 + #endif ++typedef int locale_t; + #endif + + class Locale { + public: +- Locale(char const* newLocale, int category = LC_ALL); ++ Locale(char const* newLocale, int category = LC_ALL_MASK); + virtual ~Locale(); + + private: +- int fCategory; +- char* fPrevLocale; ++ locale_t fLocale, fPrevLocale; + }; + + #endif +diff -urN live.orig/liveMedia/Locale.cpp live/liveMedia/Locale.cpp +--- live.orig/liveMedia/Locale.cpp 2009-03-23 01:26:16 +0300 ++++ live/liveMedia/Locale.cpp 2009-03-26 19:17:43 +0300 +@@ -22,19 +22,18 @@ + #include "Locale.hh" + #include + +-Locale::Locale(char const* newLocale, int category) +- : fCategory(category) { ++Locale::Locale(char const* newLocale, int category) { + #ifndef LOCALE_NOT_USED +- fPrevLocale = strDup(setlocale(category, NULL)); +- setlocale(category, newLocale); ++ fLocale = newlocale(category, newLocale, NULL); ++ fPrevLocale = uselocale(fLocale); + #endif + } + + Locale::~Locale() { + #ifndef LOCALE_NOT_USED +- if (fPrevLocale != NULL) { +- setlocale(fCategory, fPrevLocale); +- delete[] fPrevLocale; ++ if (fLocale != (locale_t)0) { ++ uselocale(fPrevLocale); ++ freelocale(fLocale); + } + #endif + } +diff -urN live.orig/liveMedia/RTSPClient.cpp live/liveMedia/RTSPClient.cpp +--- live.orig/liveMedia/RTSPClient.cpp 2009-03-23 01:26:16 +0300 ++++ live/liveMedia/RTSPClient.cpp 2009-03-26 19:29:38 +0300 +@@ -1019,7 +1019,7 @@ + // This is the default value; we don't need a "Scale:" header: + buf[0] = '\0'; + } else { +- Locale l("C", LC_NUMERIC); ++ Locale l("C", LC_NUMERIC_MASK); + sprintf(buf, "Scale: %f\r\n", scale); + } + +@@ -1033,11 +1033,11 @@ + buf[0] = '\0'; + } else if (end < 0) { + // There's no end time: +- Locale l("C", LC_NUMERIC); ++ Locale l("C", LC_NUMERIC_MASK); + sprintf(buf, "Range: npt=%.3f-\r\n", start); + } else { + // There's both a start and an end time; include them both in the "Range:" hdr +- Locale l("C", LC_NUMERIC); ++ Locale l("C", LC_NUMERIC_MASK); + sprintf(buf, "Range: npt=%.3f-%.3f\r\n", start, end); + } + +@@ -2342,7 +2342,7 @@ + if (_strncasecmp(line, "Scale: ", 7) != 0) return False; + line += 7; + +- Locale l("C", LC_NUMERIC); ++ Locale l("C", LC_NUMERIC_MASK); + return sscanf(line, "%f", &scale) == 1; + } + +diff -urN live.orig/liveMedia/RTSPCommon.cpp live/liveMedia/RTSPCommon.cpp +--- live.orig/liveMedia/RTSPCommon.cpp 2009-03-23 01:26:16 +0300 ++++ live/liveMedia/RTSPCommon.cpp 2009-03-26 19:23:25 +0300 +@@ -146,7 +146,7 @@ + char const* fields = buf + 7; + while (*fields == ' ') ++fields; + double start, end; +- Locale l("C", LC_NUMERIC); ++ Locale l("C", LC_NUMERIC_MASK); + if (sscanf(fields, "npt = %lf - %lf", &start, &end) == 2) { + rangeStart = start; + rangeEnd = end; diff --git a/live555.spec b/live555.spec index cc586d2..1c7b104 100644 --- a/live555.spec +++ b/live555.spec @@ -1,16 +1,20 @@ -%global date 2010.01.22 +%global date 2010.04.09 %global live_soversion 0 Name: live555 Version: 0 -Release: 0.26.%{date}%{?dist} +Release: 0.27.%{date}%{?dist} Summary: Live555.com streaming libraries Group: System Environment/Libraries -License: LGPLv2+ +License: LGPLv2+ and GPLv2+ URL: http://live555.com/liveMedia/ Source0: http://live555.com/liveMedia/public/live.%{date}.tar.gz Patch0: live.2010.01.16-shared.patch +#Thoses patches are Copyright Rémi Denis-Courmont - provided as GPLv2+ +Patch1: live-getaddrinfo.patch +Patch2: live-inet_ntop.patch +Patch3: live-uselocale.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %description @@ -80,6 +84,9 @@ developing applications that use %{name}. %setup -q -n live install -pm 0644 config.linux config.linux.static %patch0 -p1 -b .shared +%patch1 -p1 -b .vlc1 +%patch2 -p1 -b .vlc2 +%patch3 -p1 -b .vlc3 %build @@ -171,6 +178,11 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/libUsageEnvironment*.a %changelog +* Sat May 1 2010 Nicolas Chauvet - 0-0.27.2010.04.09 +- Update to 2010.04.09 +- Add patches from Rémi Denis-Courmont - provided as GPLv2+ +- Distribute live555 as GPLv2+ + * Thu Jan 28 2010 Nicolas Chauvet - 0-0.26.2010.01.22 - Update to 2010.01.22 Fix multicast with openRTSP