$NetBSD: patch-ab,v 1.5 2006/07/11 14:39:29 drochner Exp $ --- mDNSPosix/mDNSPosix.c.orig 2006-02-20 22:40:36.000000000 +0100 +++ mDNSPosix/mDNSPosix.c @@ -852,7 +852,13 @@ mDNSlocal int SetupSocket(struct sockadd { struct ipv6_mreq imr6; struct sockaddr_in6 bindAddr6; - #if defined(IPV6_PKTINFO) + #if defined(IPV6_RECVPKTINFO) + if (err == 0) + { + err = setsockopt(*sktPtr, IPPROTO_IPV6, IPV6_RECVPKTINFO, &kOn, sizeof(kOn)); + if (err < 0) { err = errno; perror("setsockopt - IPV6_RECVPKTINFO"); } + } +#elif defined(IPV6_PKTINFO) if (err == 0) { err = setsockopt(*sktPtr, IPPROTO_IPV6, IPV6_PKTINFO, &kOn, sizeof(kOn)); @@ -861,7 +867,13 @@ mDNSlocal int SetupSocket(struct sockadd #else #warning This platform has no way to get the destination interface information for IPv6 -- will only work for single-homed hosts #endif - #if defined(IPV6_HOPLIMIT) + #if defined(IPV6_RECVHOPLIMIT) + if (err == 0) + { + err = setsockopt(*sktPtr, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &kOn, sizeof(kOn)); + if (err < 0) { err = errno; perror("setsockopt - IPV6_RECVHOPLIMIT"); } + } + #elif defined(IPV6_HOPLIMIT) if (err == 0) { err = setsockopt(*sktPtr, IPPROTO_IPV6, IPV6_HOPLIMIT, &kOn, sizeof(kOn)); @@ -1339,6 +1351,36 @@ mDNSlocal mDNSBool mDNSPlatformInit_CanR return(err == 0); } +#ifdef __NetBSD__ +#include +#include + +void +initmachinedescr(mDNS *const m) +{ + char hwbuf[256], swbuf[256]; + size_t hwlen, swlen; + const int hwmib[] = { CTL_HW, HW_MODEL }; + const int swmib[] = { CTL_KERN, KERN_OSRELEASE }; + const char netbsd[] = "NetBSD "; + + hwlen = sizeof(hwbuf); + swlen = sizeof(swbuf); + if (sysctl(hwmib, 2, hwbuf, &hwlen, 0, 0) || + sysctl(swmib, 2, swbuf, &swlen, 0, 0)) + return; + + if (hwlen + swlen + sizeof(netbsd) >=254) + return; + + m->HIHardware.c[0] = hwlen - 1; + m->HISoftware.c[0] = swlen + sizeof(netbsd) - 2; + memcpy(&m->HIHardware.c[1], hwbuf, hwlen - 1); + memcpy(&m->HISoftware.c[1], netbsd, sizeof(netbsd) - 1); + memcpy(&m->HISoftware.c[1 + sizeof(netbsd) - 1], swbuf, swlen - 1); +} +#endif + // mDNS core calls this routine to initialise the platform-specific data. mDNSexport mStatus mDNSPlatformInit(mDNS *const m) { @@ -1360,6 +1402,10 @@ mDNSexport mStatus mDNSPlatformInit(mDNS GetUserSpecifiedRFC1034ComputerName(&m->hostlabel); if (m->hostlabel.c[0] == 0) MakeDomainLabelFromLiteralString(&m->hostlabel, "Computer"); +#ifdef __NetBSD__ + initmachinedescr(m); +#endif + mDNS_SetFQDN(m); sa.sa_family = AF_INET;