/opensource.apple.com/source/mDNSResponder/mDNSResponder-161.1/mDNSShared/PlatformCommon.c
C | 179 lines | 114 code | 11 blank | 54 comment | 8 complexity | 3b5735ceac601e604a1fb897d3dd0fc5 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, GPL-2.0, BSD-3-Clause, GPL-3.0, MPL-2.0, LGPL-2.0, LGPL-2.1, CC-BY-SA-3.0, IPL-1.0, ISC, AGPL-1.0, AGPL-3.0, JSON, Apache-2.0, 0BSD
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>PlatformCommon.c</title>
- <style type="text/css">
- .enscript-comment { font-style: italic; color: rgb(178,34,34); }
- .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
- .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
- .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
- .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
- .enscript-string { font-weight: bold; color: rgb(188,143,143); }
- .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
- .enscript-type { font-weight: bold; color: rgb(34,139,34); }
- .enscript-highlight { text-decoration: underline; color: 0; }
- </style>
- </head>
- <body id="top">
- <h1 style="margin:8px;" id="f1">PlatformCommon.c <span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
- <hr/>
- <div></div>
- <pre>
- <span class="enscript-comment">/* -*- Mode: C; tab-width: 4 -*-
- *
- * Copyright (c) 2004 Apple Computer, 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.
- * You may obtain a copy of the License at
- *
- * <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- Change History (most recent first):
- $Log: PlatformCommon.c,v $
- Revision 1.11 2007/07/31 23:08:34 mcguire
- <rdar://problem/5329542> BTMM: Make AutoTunnel mode work with multihoming
- Revision 1.10 2007/07/11 02:59:58 cheshire
- <rdar://problem/5303807> Register IPv6-only hostname and don't create port mappings for AutoTunnel services
- Add AutoTunnel parameter to mDNS_SetSecretForDomain
- Revision 1.9 2007/01/09 22:37:44 cheshire
- Remove unused ClearDomainSecrets() function
- Revision 1.8 2006/12/22 20:59:51 cheshire
- <rdar://problem/4742742> Read *all* DNS keys from keychain,
- not just key for the system-wide default registration domain
- Revision 1.7 2006/08/14 23:24:56 cheshire
- Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0
- Revision 1.6 2005/04/08 21:30:16 ksekar
- <rdar://problem/4007457> Compiling problems with mDNSResponder-98 on Solaris/Sparc v9
- Patch submitted by Bernd Kuhls
- Revision 1.5 2005/02/01 19:33:30 ksekar
- <rdar://problem/3985239> Keychain format too restrictive
- Revision 1.4 2005/01/19 19:19:21 ksekar
- <rdar://problem/3960191> Need a way to turn off domain discovery
- Revision 1.3 2004/12/13 17:46:52 cheshire
- Use sizeof(buf) instead of fixed constant 1024
- Revision 1.2 2004/12/01 03:30:29 cheshire
- <rdar://problem/3889346> Add Unicast DNS support to mDNSPosix
- Revision 1.1 2004/12/01 01:51:35 cheshire
- Move ReadDDNSSettingsFromConfFile() from mDNSMacOSX.c to PlatformCommon.c
- */</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><stdio.h></span> // Needed for fopen() etc.
- #<span class="enscript-reference">include</span> <span class="enscript-string"><unistd.h></span> // Needed for close()
- #<span class="enscript-reference">include</span> <span class="enscript-string"><string.h></span> // Needed for strlen() etc.
- #<span class="enscript-reference">include</span> <span class="enscript-string"><errno.h></span> // Needed for errno etc.
- #<span class="enscript-reference">include</span> <span class="enscript-string"><sys/socket.h></span> // Needed for socket() etc.
- #<span class="enscript-reference">include</span> <span class="enscript-string"><netinet/in.h></span> // Needed for sockaddr_in
- #<span class="enscript-reference">include</span> <span class="enscript-string">"mDNSEmbeddedAPI.h"</span> // Defines the interface provided to the client layer above
- #<span class="enscript-reference">include</span> <span class="enscript-string">"DNSCommon.h"</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string">"PlatformCommon.h"</span>
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">NOT_HAVE_SOCKLEN_T</span>
- <span class="enscript-type">typedef</span> <span class="enscript-type">unsigned</span> <span class="enscript-type">int</span> socklen_t;
- #<span class="enscript-reference">endif</span>
- <span class="enscript-comment">// Bind a UDP socket to find the source address to a destination
- </span>mDNSexport <span class="enscript-type">void</span> <span class="enscript-function-name">FindSourceAddrForIP</span>(mDNSAddr *<span class="enscript-type">const</span> dst, mDNSAddr *src)
- {
- <span class="enscript-type">struct</span> sockaddr_in addr;
- socklen_t len = <span class="enscript-keyword">sizeof</span>(addr);
- <span class="enscript-type">int</span> sock = socket(AF_INET,SOCK_DGRAM,0);
- src->type = mDNSAddrType_None;
- <span class="enscript-keyword">if</span> (sock == -1) <span class="enscript-keyword">return</span>;
- <span class="enscript-keyword">if</span> (dst->type != mDNSAddrType_IPv4) <span class="enscript-keyword">return</span>; <span class="enscript-comment">// Only support v4 for now
- </span> addr.sin_family = AF_INET;
- addr.sin_port = 1; <span class="enscript-comment">// Not important, any port will do
- </span> <span class="enscript-keyword">if</span> (dst == NULL) addr.sin_addr.s_addr = 0x11111111;
- <span class="enscript-keyword">else</span> addr.sin_addr.s_addr = dst->ip.v4.NotAnInteger;
- <span class="enscript-keyword">if</span> ((connect(sock,(<span class="enscript-type">const</span> <span class="enscript-type">struct</span> sockaddr*)&addr,<span class="enscript-keyword">sizeof</span>(addr))) == -1) { close(sock); <span class="enscript-keyword">return</span>; }
- <span class="enscript-keyword">if</span> ((getsockname(sock,(<span class="enscript-type">struct</span> sockaddr*)&addr, &len)) == -1) { close(sock); <span class="enscript-keyword">return</span>; }
- close(sock);
- src->type = mDNSAddrType_IPv4;
- src->ip.v4.NotAnInteger = addr.sin_addr.s_addr;
- }
- <span class="enscript-comment">// dst must be at least MAX_ESCAPED_DOMAIN_NAME bytes, and option must be less than 32 bytes in length
- </span>mDNSlocal mDNSBool <span class="enscript-function-name">GetConfigOption</span>(<span class="enscript-type">char</span> *dst, <span class="enscript-type">const</span> <span class="enscript-type">char</span> *option, FILE *f)
- {
- <span class="enscript-type">char</span> buf[32+1+MAX_ESCAPED_DOMAIN_NAME]; <span class="enscript-comment">// Option name, one space, option value
- </span> <span class="enscript-type">unsigned</span> <span class="enscript-type">int</span> len = strlen(option);
- <span class="enscript-keyword">if</span> (len + 1 + MAX_ESCAPED_DOMAIN_NAME > <span class="enscript-keyword">sizeof</span>(buf)-1) { LogMsg(<span class="enscript-string">"GetConfigOption: option %s too long"</span>, option); <span class="enscript-keyword">return</span> mDNSfalse; }
- fseek(f, 0, SEEK_SET); <span class="enscript-comment">// set position to beginning of stream
- </span> <span class="enscript-keyword">while</span> (fgets(buf, <span class="enscript-keyword">sizeof</span>(buf), f)) <span class="enscript-comment">// Read at most sizeof(buf)-1 bytes from file, and append '\0' C-string terminator
- </span> {
- <span class="enscript-keyword">if</span> (!strncmp(buf, option, len))
- {
- strncpy(dst, buf + len + 1, MAX_ESCAPED_DOMAIN_NAME-1);
- <span class="enscript-keyword">if</span> (dst[MAX_ESCAPED_DOMAIN_NAME-1]) dst[MAX_ESCAPED_DOMAIN_NAME-1] = <span class="enscript-string">'\0'</span>;
- len = strlen(dst);
- <span class="enscript-keyword">if</span> (len && dst[len-1] == <span class="enscript-string">'\n'</span>) dst[len-1] = <span class="enscript-string">'\0'</span>; <span class="enscript-comment">// chop newline
- </span> <span class="enscript-keyword">return</span> mDNStrue;
- }
- }
- debugf(<span class="enscript-string">"Option %s not set"</span>, option);
- <span class="enscript-keyword">return</span> mDNSfalse;
- }
- mDNSexport <span class="enscript-type">void</span> <span class="enscript-function-name">ReadDDNSSettingsFromConfFile</span>(mDNS *<span class="enscript-type">const</span> m, <span class="enscript-type">const</span> <span class="enscript-type">char</span> *<span class="enscript-type">const</span> filename, domainname *<span class="enscript-type">const</span> hostname, domainname *<span class="enscript-type">const</span> domain, mDNSBool *DomainDiscoveryDisabled)
- {
- <span class="enscript-type">char</span> buf [MAX_ESCAPED_DOMAIN_NAME];
- <span class="enscript-type">char</span> secret[MAX_ESCAPED_DOMAIN_NAME] = <span class="enscript-string">""</span>;
- mStatus err;
- FILE *f = fopen(filename, <span class="enscript-string">"r"</span>);
- <span class="enscript-keyword">if</span> (hostname) hostname->c[0] = 0;
- <span class="enscript-keyword">if</span> (domain) domain->c[0] = 0;
- <span class="enscript-keyword">if</span> (DomainDiscoveryDisabled) *DomainDiscoveryDisabled = mDNSfalse;
- <span class="enscript-keyword">if</span> (f)
- {
- <span class="enscript-keyword">if</span> (DomainDiscoveryDisabled && GetConfigOption(buf, <span class="enscript-string">"DomainDiscoveryDisabled"</span>, f) && !strcasecmp(buf, <span class="enscript-string">"true"</span>)) *DomainDiscoveryDisabled = mDNStrue;
- <span class="enscript-keyword">if</span> (hostname && GetConfigOption(buf, <span class="enscript-string">"hostname"</span>, f) && !MakeDomainNameFromDNSNameString(hostname, buf)) <span class="enscript-keyword">goto</span> <span class="enscript-reference">badf</span>;
- <span class="enscript-keyword">if</span> (domain && GetConfigOption(buf, <span class="enscript-string">"zone"</span>, f) && !MakeDomainNameFromDNSNameString(domain, buf)) <span class="enscript-keyword">goto</span> <span class="enscript-reference">badf</span>;
- GetConfigOption(secret, <span class="enscript-string">"secret-64"</span>, f); <span class="enscript-comment">// failure means no authentication
- </span> fclose(f);
- f = NULL;
- }
- <span class="enscript-keyword">else</span>
- {
- <span class="enscript-keyword">if</span> (errno != ENOENT) LogMsg(<span class="enscript-string">"ERROR: Config file exists, but cannot be opened."</span>);
- <span class="enscript-keyword">return</span>;
- }
- <span class="enscript-keyword">if</span> (domain && domain->c[0] && secret[0])
- {
- DomainAuthInfo *info = (DomainAuthInfo*)mDNSPlatformMemAllocate(<span class="enscript-keyword">sizeof</span>(*info));
- <span class="enscript-comment">// for now we assume keyname = service reg domain and we use same key for service and hostname registration
- </span> err = mDNS_SetSecretForDomain(m, info, domain, domain, secret, mDNSfalse);
- <span class="enscript-keyword">if</span> (err) LogMsg(<span class="enscript-string">"ERROR: mDNS_SetSecretForDomain returned %d for domain %##s"</span>, err, domain->c);
- }
- <span class="enscript-keyword">return</span>;
- <span class="enscript-reference">badf</span>:
- LogMsg(<span class="enscript-string">"ERROR: malformatted config file"</span>);
- <span class="enscript-keyword">if</span> (f) fclose(f);
- }
- </pre>
- <hr />
- </body></html>