rpms/nspr/FC-6 nspr-ipv6-numerichost.patch, NONE, 1.1 nspr.spec, 1.17, 1.18
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Tue Jan 16 19:02:43 UTC 2007
Author: kengert
Update of /cvs/dist/rpms/nspr/FC-6
In directory cvs.devel.redhat.com:/tmp/cvs-serv30809
Modified Files:
nspr.spec
Added Files:
nspr-ipv6-numerichost.patch
Log Message:
* Tue Feb 16 2007 Kai Engert <kengert at redhat.com> - 4.6.4-0.6.1
- Include upstream patch to fix ipv6 support (rhbz 222554)
nspr-ipv6-numerichost.patch:
include/md/_win95.h | 2
include/md/_winnt.h | 2
src/misc/prnetdb.c | 167 ++++++++++++++++++++++++++++++++++++++++------------
3 files changed, 134 insertions(+), 37 deletions(-)
--- NEW FILE nspr-ipv6-numerichost.patch ---
--- mozilla/nsprpub/pr/src/misc/prnetdb.c.orig 2007-01-15 13:44:34.365432000 -0800
+++ mozilla/nsprpub/pr/src/misc/prnetdb.c 2007-01-15 13:45:24.298333000 -0800
@@ -39,6 +39,8 @@
#include <string.h>
+#define PR_AI_NUMERICHOST 0x4000 /* for internal use only */
+
/*
* On Unix, the error code for gethostbyname() and gethostbyaddr()
* is returned in the global variable h_errno, instead of the usual
@@ -1775,63 +1777,70 @@
PR_IMPLEMENT(PRStatus) PR_StringToNetAddr(const char *string, PRNetAddr *addr)
{
PRStatus status = PR_SUCCESS;
- PRIntn rv;
+ PRAddrInfo *infop = NULL;
+ PRNetAddr laddr;
-#if defined(_PR_HAVE_INET_NTOP)
- rv = inet_pton(AF_INET6, string, &addr->ipv6.ip);
- if (1 == rv)
+ if (NULL == addr)
{
- addr->raw.family = PR_AF_INET6;
+ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
+ return PR_FAILURE;
}
- else
+ infop = PR_GetAddrInfoByName(string, PR_AF_UNSPEC,
+ PR_AI_NUMERICHOST|PR_AI_ADDRCONFIG);
+ if (NULL == infop)
+ {
+ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
+ return PR_FAILURE;
+ }
+ if (PR_EnumerateAddrInfo(NULL, infop, 0, &laddr) != NULL)
{
- PR_ASSERT(0 == rv);
- /* clean up after the failed inet_pton() call */
- memset(&addr->ipv6.ip, 0, sizeof(addr->ipv6.ip));
- rv = inet_pton(AF_INET, string, &addr->inet.ip);
- if (1 == rv)
+ /* pick up the first addr */
+ if (PR_AF_INET6 == laddr.raw.family)
+ {
+ addr->ipv6.family = laddr.ipv6.family;
+ addr->ipv6.ip = laddr.ipv6.ip;
+ addr->ipv6.scope_id = laddr.ipv6.scope_id;
+ }
+ else if (PR_AF_INET == laddr.raw.family)
{
- addr->raw.family = AF_INET;
+ addr->inet.family = laddr.inet.family;
+ addr->inet.ip = laddr.inet.ip;
}
else
{
- PR_ASSERT(0 == rv);
PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
status = PR_FAILURE;
}
}
-#else /* _PR_HAVE_INET_NTOP */
- rv = StringToV6Addr(string, &addr->ipv6.ip);
- if (1 == rv) {
- addr->raw.family = PR_AF_INET6;
- return PR_SUCCESS;
- }
- PR_ASSERT(0 == rv);
- /* clean up after the failed StringToV6Addr() call */
- memset(&addr->ipv6.ip, 0, sizeof(addr->ipv6.ip));
-
- addr->inet.family = AF_INET;
-#ifdef XP_OS2_VACPP
- addr->inet.ip = inet_addr((char *)string);
-#else
- addr->inet.ip = inet_addr(string);
-#endif
- if ((PRUint32) -1 == addr->inet.ip)
+ else
{
- /*
- * The string argument is a malformed address string.
- */
PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
status = PR_FAILURE;
}
-#endif /* _PR_HAVE_INET_NTOP */
-
+ PR_FreeAddrInfo(infop);
return status;
}
+static int
+pr_GetNameInfo(const PRNetAddr *addr, size_t addrlen,
+ char *host, size_t hostlen,
+ char *serv, size_t servlen, PRIntn flags);
+
PR_IMPLEMENT(PRStatus) PR_NetAddrToString(
const PRNetAddr *addr, char *string, PRUint32 size)
{
+#if defined(_PR_HAVE_GETADDRINFO)
+ PRIntn rv = 0;
+ size_t addrlen = 0;
+
+ if (NULL == string || 0 == size)
+ goto failed;
+ addrlen = PR_NETADDR_SIZE(addr);
+ rv = pr_GetNameInfo(addr, addrlen, string, size, NULL, 0, NI_NUMERICHOST);
+ if (rv != 0)
+ goto failed;
+ return PR_SUCCESS;
+#else
if (PR_AF_INET6 == addr->raw.family)
{
#if defined(_PR_HAVE_INET_NTOP)
@@ -1858,7 +1867,7 @@
}
return PR_SUCCESS;
-
+#endif
failed:
PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
return PR_FAILURE;
@@ -1947,6 +1956,7 @@
typedef struct addrinfo PRADDRINFO;
#define GETADDRINFO getaddrinfo
#define FREEADDRINFO freeaddrinfo
+#define GETNAMEINFO getnameinfo
#elif defined(_PR_INET6_PROBE)
@@ -1965,17 +1975,24 @@
PRADDRINFO **res);
typedef int (FUNC_MODIFIER * FN_FREEADDRINFO)
(PRADDRINFO *ai);
+typedef int (FUNC_MODIFIER * FN_GETNAMEINFO)
+ (const struct sockaddr *addr, int addrlen,
+ char *host, int hostlen,
+ char *serv, int servlen, int flags);
/* global state */
static FN_GETADDRINFO _pr_getaddrinfo = NULL;
static FN_FREEADDRINFO _pr_freeaddrinfo = NULL;
+static FN_GETNAMEINFO _pr_getnameinfo = NULL;
#if defined(VMS)
#define GETADDRINFO_SYMBOL getenv("GETADDRINFO")
#define FREEADDRINFO_SYMBOL getenv("FREEADDRINFO")
+#define GETNAMEINFO_SYMBOL getenv("GETNAMEINFO")
#else
#define GETADDRINFO_SYMBOL "getaddrinfo"
#define FREEADDRINFO_SYMBOL "freeaddrinfo"
+#define GETNAMEINFO_SYMBOL "getnameinfo"
#endif
PRStatus
@@ -2003,6 +2020,12 @@
PR_UnloadLibrary(lib);
continue;
}
+ _pr_getnameinfo = (FN_GETNAMEINFO)
+ PR_FindFunctionSymbol(lib, GETNAMEINFO_SYMBOL);
+ if (!_pr_getnameinfo) {
+ PR_UnloadLibrary(lib);
+ continue;
+ }
_pr_freeaddrinfo = (FN_FREEADDRINFO)
PR_FindFunctionSymbol(lib, FREEADDRINFO_SYMBOL);
PR_ASSERT(_pr_freeaddrinfo);
@@ -2020,6 +2043,11 @@
if (!_pr_getaddrinfo) {
return PR_FAILURE;
}
+ _pr_getnameinfo = (FN_GETNAMEINFO)
+ PR_FindFunctionSymbolAndLibrary(GETNAMEINFO_SYMBOL, &lib);
+ if (!_pr_getnameinfo) {
+ return PR_FAILURE;
+ }
_pr_freeaddrinfo = (FN_FREEADDRINFO)
PR_FindFunctionSymbol(lib, FREEADDRINFO_SYMBOL);
PR_UnloadLibrary(lib);
@@ -2032,6 +2060,7 @@
#define GETADDRINFO (*_pr_getaddrinfo)
#define FREEADDRINFO (*_pr_freeaddrinfo)
+#define GETNAMEINFO (*_pr_getnameinfo)
#endif /* _PR_INET6 */
@@ -2048,6 +2077,46 @@
PRBool has_cname;
} PRAddrInfoFB;
+static PRBool
+pr_IsValidNumericHost(const char *string)
+{
+ PRNetAddr addr;
+ PRIntn rv;
+#if defined(_PR_HAVE_INET_NTOP)
+ rv = inet_pton(AF_INET6, string, &addr.ipv6.ip);
+ if (0 < rv) {
+ return PR_TRUE;
+ }
+ PR_ASSERT(0 == rv);
+ memset(&addr.ipv6.ip, 0, sizeof(addr.ipv6.ip));
+ rv = inet_pton(AF_INET, string, &addr.inet.ip);
+ if (0 < rv) {
+ return PR_TRUE;
+ }
+ return PR_FALSE;
+#else /* _PR_HAVE_INET_NTOP */
+ rv = StringToV6Addr(string, &addr.ipv6.ip);
+ if (0 < rv) {
+ return PR_TRUE;
+ }
+ PR_ASSERT(0 == rv);
+ /* clean up after the failed StringToV6Addr() call */
+ memset(&addr.ipv6.ip, 0, sizeof(addr.ipv6.ip));
+#ifdef XP_OS2_VACPP
+ addr.inet.ip = inet_addr((char *)string);
+#else
+ addr.inet.ip = inet_addr(string);
+#endif
+ if ((PRUint32) -1 == addr.inet.ip) {
+ /*
+ * The string argument is a malformed address string.
+ */
+ return PR_FALSE;
+ }
+ return PR_TRUE;
+#endif
+}
+
static PRAddrInfo *
pr_GetAddrInfoByNameFB(const char *hostname,
PRUint16 af,
@@ -2055,6 +2124,13 @@
{
PRStatus rv;
PRAddrInfoFB *ai;
+
+ if (flags & PR_AI_NUMERICHOST) {
+ if (!pr_IsValidNumericHost(hostname)) {
+ PR_SetError(PR_BAD_ADDRESS_ERROR, 0);
+ return NULL;
+ }
+ }
/* fallback on PR_GetHostByName */
ai = PR_NEW(PRAddrInfoFB);
if (!ai) {
@@ -2077,7 +2153,7 @@
{
/* restrict input to supported values */
if ((af != PR_AF_INET && af != PR_AF_UNSPEC) ||
- (flags & ~ PR_AI_NOCANONNAME) != PR_AI_ADDRCONFIG) {
+ (flags & ~ (PR_AI_NOCANONNAME|PR_AI_NUMERICHOST)) != PR_AI_ADDRCONFIG) {
PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
return NULL;
}
@@ -2104,6 +2180,7 @@
memset(&hints, 0, sizeof(hints));
hints.ai_flags = (flags & PR_AI_NOCANONNAME) ? 0: AI_CANONNAME;
+ hints.ai_flags |= (flags & PR_AI_NUMERICHOST) ? AI_NUMERICHOST : 0;
hints.ai_family = (af == PR_AF_INET) ? AF_INET : AF_UNSPEC;
/*
@@ -2139,6 +2216,22 @@
#endif
}
+/*
+ * A wrapper function for getnameinfo
+ * Caution: Not implemented for the system that does not have "getnameinfo"
+ */
+static int
+pr_GetNameInfo(const PRNetAddr *addr, size_t addrlen,
+ char *host, size_t hostlen,
+ char *serv, size_t servlen, PRIntn flags)
+{
+#if defined(_PR_HAVE_GETADDRINFO)
+ return GETNAMEINFO((const struct sockaddr *)addr, addrlen, host, hostlen, serv, servlen, flags);
+#else
+ return EAI_SYSTEM; /* not implemented */
+#endif
+}
+
PR_IMPLEMENT(void *) PR_EnumerateAddrInfo(void *iterPtr,
const PRAddrInfo *base,
PRUint16 port,
--- mozilla/nsprpub/pr/include/md/_winnt.h.orig 2007-01-15 13:44:17.299466000 -0800
+++ mozilla/nsprpub/pr/include/md/_winnt.h 2007-01-15 13:45:24.286333000 -0800
@@ -76,6 +76,8 @@
/* newer ws2tcpip.h provides these */
#ifndef AI_CANONNAME
#define AI_CANONNAME 0x2
+#define AI_NUMERICHOST 0x4
+#define NI_NUMERICHOST 0x02
struct addrinfo {
int ai_flags;
int ai_family;
--- mozilla/nsprpub/pr/include/md/_win95.h.orig 2007-01-15 13:44:25.152451000 -0800
+++ mozilla/nsprpub/pr/include/md/_win95.h 2007-01-15 13:45:24.280332000 -0800
@@ -61,6 +61,8 @@
/* newer ws2tcpip.h provides these */
#ifndef AI_CANONNAME
#define AI_CANONNAME 0x2
+#define AI_NUMERICHOST 0x4
+#define NI_NUMERICHOST 0x02
struct addrinfo {
int ai_flags;
int ai_family;
Index: nspr.spec
===================================================================
RCS file: /cvs/dist/rpms/nspr/FC-6/nspr.spec,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- nspr.spec 21 Nov 2006 20:49:27 -0000 1.17
+++ nspr.spec 16 Jan 2007 19:02:41 -0000 1.18
@@ -1,7 +1,7 @@
Summary: Netscape Portable Runtime
Name: nspr
Version: 4.6.4
-Release: 0.6%{?dist}
+Release: 0.6.1%{?dist}
License: MPL/GPL/LGPL
URL: http://www.mozilla.org/projects/nspr/
Group: System Environment/Libraries
@@ -11,6 +11,7 @@
Source2: nspr-config-vars.in
Patch1: nspr-config-pc.patch
+Patch2: nspr-ipv6-numerichost.patch
Provides: mozilla-nspr
Obsoletes: mozilla-nspr
@@ -44,6 +45,7 @@
cp ./mozilla/nsprpub/config/nspr-config.in ./mozilla/nsprpub/config/nspr-config-pc.in
%patch1 -p0
+%patch2 -p0
cp %{SOURCE2} ./mozilla/nsprpub/config/
@@ -120,6 +122,9 @@
%{_bindir}/nspr-config
%changelog
+* Tue Feb 16 2007 Kai Engert <kengert at redhat.com> - 4.6.4-0.6.1
+- Include upstream patch to fix ipv6 support (rhbz 222554)
+
* Tue Nov 21 2006 Kai Engert <kengert at redhat.com> - 4.6.4-0.6
- Update to 4.6.4
More information about the fedora-cvs-commits
mailing list