diff options
| author | Toomas Soome <tsoome@me.com> | 2016-06-21 15:45:49 +0300 |
|---|---|---|
| committer | Robert Mustacchi <rm@joyent.com> | 2016-07-22 07:39:00 -0700 |
| commit | cda73f64f20b8a0afc4909f5ea1f055ec7913856 (patch) | |
| tree | 6f93e00913bd2c9f2aab6396979ba091da82dde6 /usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSPosix.c | |
| parent | 6da83bb0b886fae280a129718d645576517b62c6 (diff) | |
| download | illumos-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.c | 101 |
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; |
