summaryrefslogtreecommitdiff
path: root/usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2016-06-21 15:45:49 +0300
committerRobert Mustacchi <rm@joyent.com>2016-07-22 07:39:00 -0700
commitcda73f64f20b8a0afc4909f5ea1f055ec7913856 (patch)
tree6f93e00913bd2c9f2aab6396979ba091da82dde6 /usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c
parent6da83bb0b886fae280a129718d645576517b62c6 (diff)
downloadillumos-joyent-cda73f64f20b8a0afc4909f5ea1f055ec7913856.tar.gz
7139 Sync mDNS with mDNSResponder-625.41.2
Reviewed by: Dan McDonald <danmcd@omniti.com> Reviewed by: Andy Stormont <astormont@racktopsystems.com> Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c')
-rw-r--r--usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c101
1 files changed, 50 insertions, 51 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c b/usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c
index 5a385e6299..f16e82044a 100644
--- a/usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c
+++ b/usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c
@@ -1,6 +1,6 @@
/* -*- Mode: C; tab-width: 4 -*-
*
- * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2002-2015 Apple Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -132,18 +132,6 @@ mDNSlocal void SockAddrTomDNSAddr(const struct sockaddr *const sa, mDNSAddr *ipA
}
}
-/*
- * Apple source is using this to set mobile platform
- * specific options.
- */
-/*ARGSUSED*/
-mDNSexport void mDNSPlatformSetuDNSSocktOpt(UDPSocket *src, const mDNSAddr *dst, DNSQuestion *q)
-{
- (void)src; /* unused */
- (void)dst; /* unused */
- (void)q; /* unused */
-}
-
#if COMPILER_LIKES_PRAGMA_MARK
#pragma mark ***** Send and Receive
#endif
@@ -210,7 +198,7 @@ mDNSexport mStatus mDNSPlatformSendUDP(const mDNS *const m, const void *const ms
if (errno == EHOSTDOWN || errno == ENETDOWN || errno == EHOSTUNREACH || errno == ENETUNREACH) return(mStatus_TransientErr);
/* dont report ENETUNREACH */
- if (errno == ENETUNREACH) return(mStatus_TransientErr);
+ if (errno == ENETUNREACH) return(mStatus_TransientErr);
if (MessageCount < 1000)
{
@@ -456,15 +444,19 @@ mDNSexport void FreeEtcHosts(mDNS *const m, AuthRecord *const rr, mStatus result
#pragma mark ***** DDNS Config Platform Functions
#endif
+/*
+ * Stub to set or get DNS config. Even if it actually does not do anything, it has to
+ * make sure the data is zeroed properly.
+ */
mDNSexport mDNSBool mDNSPlatformSetDNSConfig(mDNS *const m, mDNSBool setservers, mDNSBool setsearch, domainname *const fqdn, DNameListElem **RegDomains,
DNameListElem **BrowseDomains, mDNSBool ackConfig)
{
(void) m;
(void) setservers;
- (void) fqdn;
+ if (fqdn) fqdn->c[0] = 0;
(void) setsearch;
- (void) RegDomains;
- (void) BrowseDomains;
+ if (RegDomains) *RegDomains = NULL;
+ if (BrowseDomains) *BrowseDomains = NULL;
(void) ackConfig;
return mDNStrue;
@@ -531,7 +523,7 @@ mDNSexport int ParseDNSServers(mDNS *m, const char *filePath)
numOfServers++;
}
}
- fclose(fp);
+ fclose(fp);
return (numOfServers > 0) ? 0 : -1;
}
@@ -655,10 +647,22 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
// ... with a shared UDP port, if it's for multicast receiving
if (err == 0 && port.NotAnInteger)
{
- #if defined(SO_REUSEPORT)
- err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEPORT, &kOn, sizeof(kOn));
- #elif defined(SO_REUSEADDR)
+ // <rdar://problem/20946253>
+ // We test for SO_REUSEADDR first, as suggested by Jonny Törnbom from Axis Communications
+ // Linux kernel versions 3.9 introduces support for socket option
+ // SO_REUSEPORT, however this is not implemented the same as on *BSD
+ // systems. Linux version implements a "port hijacking" prevention
+ // mechanism, limiting processes wanting to bind to an already existing
+ // addr:port to have the same effective UID as the first who bound it. What
+ // this meant for us was that the daemon ran as one user and when for
+ // instance mDNSClientPosix was executed by another user, it wasn't allowed
+ // to bind to the socket. Our suggestion was to switch the order in which
+ // SO_REUSEPORT and SO_REUSEADDR was tested so that SO_REUSEADDR stays on
+ // top and SO_REUSEPORT to be used only if SO_REUSEADDR doesn't exist.
+ #if defined(SO_REUSEADDR) && !defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEADDR, &kOn, sizeof(kOn));
+ #elif defined(SO_REUSEPORT)
+ err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEPORT, &kOn, sizeof(kOn));
#else
#error This platform has no way to avoid address busy errors on multicast.
#endif
@@ -667,9 +671,9 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
// Enable inbound packets on IFEF_AWDL interface.
// Only done for multicast sockets, since we don't expect unicast socket operations
// on the IFEF_AWDL interface. Operation is a no-op for other interface types.
- #ifdef SO_RECV_ANYIF
+ #ifdef SO_RECV_ANYIF
if (setsockopt(*sktPtr, SOL_SOCKET, SO_RECV_ANYIF, &kOn, sizeof(kOn)) < 0) perror("setsockopt - SO_RECV_ANYIF");
- #endif
+ #endif
}
// We want to receive destination addresses and interface identifiers.
@@ -756,11 +760,11 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
struct ipv6_mreq imr6;
struct sockaddr_in6 bindAddr6;
#if defined(IPV6_RECVPKTINFO) // Solaris
- if (err == 0)
- {
- err = setsockopt(*sktPtr, IPPROTO_IPV6, IPV6_RECVPKTINFO, &kOn, sizeof(kOn));
- if (err < 0) { err = errno; perror("setsockopt - 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)
{
@@ -771,11 +775,11 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
#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_RECVHOPLIMIT)
- if (err == 0)
- {
- err = setsockopt(*sktPtr, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &kOn, sizeof(kOn));
- if (err < 0) { err = errno; perror("setsockopt - 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)
{
@@ -882,7 +886,7 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct
assert(intfMask != NULL);
// Allocate the interface structure itself.
- intf = (PosixNetworkInterface*)malloc(sizeof(*intf));
+ intf = (PosixNetworkInterface*)calloc(1, sizeof(*intf));
if (intf == NULL) { assert(0); err = ENOMEM; }
// And make a copy of the intfName.
@@ -937,6 +941,7 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct
if (strcmp(intfName, STRINGIFY(DIRECTLINK_INTERFACE_NAME)) == 0)
intf->coreIntf.DirectLink = mDNStrue;
#endif
+ intf->coreIntf.SupportsUnicastMDNSResponse = mDNStrue;
// The interface is all ready to go, let's register it with the mDNS core.
if (err == 0)
@@ -1206,11 +1211,6 @@ mDNSlocal mDNSu32 ProcessRoutingNotification(int sd)
case RTM_NEWADDR:
case RTM_DELADDR:
case RTM_IFINFO:
- if (pRSMsg->ifam_type == RTM_IFINFO)
- result |= 1 << ((struct if_msghdr*) pRSMsg)->ifm_index;
- else
- result |= 1 << pRSMsg->ifam_index;
- break;
/*
* ADD & DELETE are happening when IPv6 announces are changing,
* and for some reason it will stop mdnsd to announce IPv6
@@ -1218,7 +1218,11 @@ mDNSlocal mDNSu32 ProcessRoutingNotification(int sd)
*/
case RTM_ADD:
case RTM_DELETE:
- result |= 1;
+ if (pRSMsg->ifam_type == RTM_IFINFO)
+ result |= 1 << ((struct if_msghdr*) pRSMsg)->ifm_index;
+ else
+ result |= 1 << pRSMsg->ifam_index;
+ break;
}
return result;
@@ -1335,7 +1339,8 @@ mDNSexport mStatus mDNSPlatformInit(mDNS *const m)
// Failure to observe interface changes is non-fatal.
if (err != mStatus_NoError)
{
- fprintf(stderr, "mDNS(%d) WARNING: Unable to detect interface changes (%d).\n", (int)getpid(), err);
+ fprintf(stderr, "mDNS(%d) WARNING: Unable to detect interface changes (%d).\n",
+ (int)getpid(), err);
err = mStatus_NoError;
}
}
@@ -1624,21 +1629,15 @@ mDNSexport mDNSBool mDNSPlatformInterfaceIsD2D(mDNSInterfaceID InterfaceID)
return mDNSfalse;
}
-mDNSexport mDNSBool mDNSPlatformAllowPID(mDNS *const m, DNSQuestion *q)
+mDNSexport void mDNSPlatformGetDNSRoutePolicy(mDNS *const m, DNSQuestion *q, mDNSBool *isCellBlocked)
{
(void) m;
- (void) q;
- return mDNStrue;
-}
-mDNSexport mDNSs32 mDNSPlatformGetServiceID(mDNS *const m, DNSQuestion *q)
-{
- (void) m;
- (void) q;
- return -1;
+ q->ServiceID = -1;
+ *isCellBlocked = mDNSfalse;
}
-mDNSexport void mDNSPlatformSetDelegatePID(UDPSocket *src, const mDNSAddr *dst, DNSQuestion *q)
+mDNSexport void mDNSPlatformSetuDNSSocktOpt(UDPSocket *src, const mDNSAddr *dst, DNSQuestion *q)
{
(void) src;
(void) dst;