Rather than stealing a bunch of per-platform #ifdefs from Apple, I'm
wondering if this simple typecast would work. This would essentially be
doing the same thing that happens on those platforms that use a union
inside struct in6_addr.
diff --git a/plugins/plugin_common.c b/plugins/plugin_common.c
index f2b26bd..1d633ee 100644
--- a/plugins/plugin_common.c
+++ b/plugins/plugin_common.c
@@ -94,7 +94,7 @@ static void sockaddr_unmapped(
if (!IN6_IS_ADDR_V4MAPPED((&sin6->sin6_addr)))
return;
sin4 = (struct sockaddr_in *)sa;
- addr = *(uint32_t *)&sin6->sin6_addr.s6_addr32[3];
+ addr = *(uint32_t *)&sin6->sin6_addr.s6_addr[12];
port = sin6->sin6_port;
memset(sin4, 0, sizeof(struct sockaddr_in));
sin4->sin_addr.s_addr = addr;
On 11/25/2016 04:21 PM, Julien ÉLIE via Cyrus-sasl wrote:
Hi Ken,
Can you try this patch for OSX:
diff --git a/plugins/plugin_common.c b/plugins/plugin_common.c
index f2b26bd..1211fea 100644
--- a/plugins/plugin_common.c
+++ b/plugins/plugin_common.c
@@ -88,6 +88,10 @@ static void sockaddr_unmapped(
uint32_t addr;
int port;
+#if defined(__FreeBSD__) && !defined(s6_addr32)
+#define s6_addr32 __u6_addr.__u6_addr32
+#endif
+
if (sa->sa_family != AF_INET6)
return;
sin6 = (struct sockaddr_in6 *)sa;
It works with "defined(__APPLE__)" instead of "defined(__FreeBSD__)".
Yet, I found out there probably a better patch to integrate into Cyrus
SASL:
http://trillian.mit.edu/~jc/src/gs/cups/libs/cups/http.h
/*
* Oh, the wonderful world of IPv6 compatibility. Apparently some
* implementations expose the (more logical) 32-bit address parts
* to everyone, while others only expose it to kernel code... To
* make supporting IPv6 even easier, each vendor chose different
* core structure and union names, so the same defines or code
* can't be used on all platforms.
*
* The following will likely need tweaking on new platforms that
* support IPv6 - the "s6_addr32" define maps to the 32-bit integer
* array in the in6_addr union, which is named differently on various
* platforms.
*/
#if defined(AF_INET6) && !defined(s6_addr32)
# if defined(__sun)
# define s6_addr32 _S6_un._S6_u32
# elif defined(__FreeBSD__) || defined(__NetBSD__) ||
defined(__OpenBSD__) || defined(__APPLE__)
# define s6_addr32 __u6_addr.__u6_addr32
# elif defined(__osf__)
# define s6_addr32 s6_un.sa6_laddr
# elif defined(WIN32)
/*
* Windows only defines byte and 16-bit word members of the union and
* requires special casing of all raw address code...
*/
# define s6_addr32 error_need_win32_specific_code
# endif /* __sun */
#endif /* AF_INET6 && !s6_addr32 */
Yet, I now obtain the following error:
/bin/sh ../libtool --tag=CC --mode=link gcc -Wall -W -g -O2 -o
libobj.la -lresolv -lresolv
libtool: link: ar cru .libs/libobj.a
ar: no archive members specified
usage: ar -d [-TLsv] archive file ...
ar -m [-TLsv] archive file ...
ar -m [-abiTLsv] position archive file ...
ar -p [-TLsv] archive [file ...]
ar -q [-cTLsv] archive file ...
ar -r [-cuTLsv] archive file ...
ar -r [-abciuTLsv] position archive file ...
ar -t [-TLsv] archive [file ...]
ar -x [-ouTLsv] archive [file ...]
make[3]: *** [libobj.la] Error 1
Maybe caused by "noinst_LTLIBRARIES" not properly defined?
--
Kenneth Murchison
Principal Systems Software Engineer
Carnegie Mellon University