PageRenderTime 51ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/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
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <title>PlatformCommon.c</title>
  6. <style type="text/css">
  7. .enscript-comment { font-style: italic; color: rgb(178,34,34); }
  8. .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
  9. .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
  10. .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
  11. .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
  12. .enscript-string { font-weight: bold; color: rgb(188,143,143); }
  13. .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
  14. .enscript-type { font-weight: bold; color: rgb(34,139,34); }
  15. .enscript-highlight { text-decoration: underline; color: 0; }
  16. </style>
  17. </head>
  18. <body id="top">
  19. <h1 style="margin:8px;" id="f1">PlatformCommon.c&nbsp;&nbsp;&nbsp;<span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
  20. <hr/>
  21. <div></div>
  22. <pre>
  23. <span class="enscript-comment">/* -*- Mode: C; tab-width: 4 -*-
  24. *
  25. * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
  26. *
  27. * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
  28. * you may not use this file except in compliance with the License.
  29. * You may obtain a copy of the License at
  30. *
  31. * <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
  32. *
  33. * Unless required by applicable law or agreed to in writing, software
  34. * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
  35. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  36. * See the License for the specific language governing permissions and
  37. * limitations under the License.
  38. Change History (most recent first):
  39. $Log: PlatformCommon.c,v $
  40. Revision 1.11 2007/07/31 23:08:34 mcguire
  41. &lt;rdar://problem/5329542&gt; BTMM: Make AutoTunnel mode work with multihoming
  42. Revision 1.10 2007/07/11 02:59:58 cheshire
  43. &lt;rdar://problem/5303807&gt; Register IPv6-only hostname and don't create port mappings for AutoTunnel services
  44. Add AutoTunnel parameter to mDNS_SetSecretForDomain
  45. Revision 1.9 2007/01/09 22:37:44 cheshire
  46. Remove unused ClearDomainSecrets() function
  47. Revision 1.8 2006/12/22 20:59:51 cheshire
  48. &lt;rdar://problem/4742742&gt; Read *all* DNS keys from keychain,
  49. not just key for the system-wide default registration domain
  50. Revision 1.7 2006/08/14 23:24:56 cheshire
  51. Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0
  52. Revision 1.6 2005/04/08 21:30:16 ksekar
  53. &lt;rdar://problem/4007457&gt; Compiling problems with mDNSResponder-98 on Solaris/Sparc v9
  54. Patch submitted by Bernd Kuhls
  55. Revision 1.5 2005/02/01 19:33:30 ksekar
  56. &lt;rdar://problem/3985239&gt; Keychain format too restrictive
  57. Revision 1.4 2005/01/19 19:19:21 ksekar
  58. &lt;rdar://problem/3960191&gt; Need a way to turn off domain discovery
  59. Revision 1.3 2004/12/13 17:46:52 cheshire
  60. Use sizeof(buf) instead of fixed constant 1024
  61. Revision 1.2 2004/12/01 03:30:29 cheshire
  62. &lt;rdar://problem/3889346&gt; Add Unicast DNS support to mDNSPosix
  63. Revision 1.1 2004/12/01 01:51:35 cheshire
  64. Move ReadDDNSSettingsFromConfFile() from mDNSMacOSX.c to PlatformCommon.c
  65. */</span>
  66. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;stdio.h&gt;</span> // Needed for fopen() etc.
  67. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;unistd.h&gt;</span> // Needed for close()
  68. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;string.h&gt;</span> // Needed for strlen() etc.
  69. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;errno.h&gt;</span> // Needed for errno etc.
  70. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;sys/socket.h&gt;</span> // Needed for socket() etc.
  71. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;netinet/in.h&gt;</span> // Needed for sockaddr_in
  72. #<span class="enscript-reference">include</span> <span class="enscript-string">&quot;mDNSEmbeddedAPI.h&quot;</span> // Defines the interface provided to the client layer above
  73. #<span class="enscript-reference">include</span> <span class="enscript-string">&quot;DNSCommon.h&quot;</span>
  74. #<span class="enscript-reference">include</span> <span class="enscript-string">&quot;PlatformCommon.h&quot;</span>
  75. #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">NOT_HAVE_SOCKLEN_T</span>
  76. <span class="enscript-type">typedef</span> <span class="enscript-type">unsigned</span> <span class="enscript-type">int</span> socklen_t;
  77. #<span class="enscript-reference">endif</span>
  78. <span class="enscript-comment">// Bind a UDP socket to find the source address to a destination
  79. </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)
  80. {
  81. <span class="enscript-type">struct</span> sockaddr_in addr;
  82. socklen_t len = <span class="enscript-keyword">sizeof</span>(addr);
  83. <span class="enscript-type">int</span> sock = socket(AF_INET,SOCK_DGRAM,0);
  84. src-&gt;type = mDNSAddrType_None;
  85. <span class="enscript-keyword">if</span> (sock == -1) <span class="enscript-keyword">return</span>;
  86. <span class="enscript-keyword">if</span> (dst-&gt;type != mDNSAddrType_IPv4) <span class="enscript-keyword">return</span>; <span class="enscript-comment">// Only support v4 for now
  87. </span> addr.sin_family = AF_INET;
  88. addr.sin_port = 1; <span class="enscript-comment">// Not important, any port will do
  89. </span> <span class="enscript-keyword">if</span> (dst == NULL) addr.sin_addr.s_addr = 0x11111111;
  90. <span class="enscript-keyword">else</span> addr.sin_addr.s_addr = dst-&gt;ip.v4.NotAnInteger;
  91. <span class="enscript-keyword">if</span> ((connect(sock,(<span class="enscript-type">const</span> <span class="enscript-type">struct</span> sockaddr*)&amp;addr,<span class="enscript-keyword">sizeof</span>(addr))) == -1) { close(sock); <span class="enscript-keyword">return</span>; }
  92. <span class="enscript-keyword">if</span> ((getsockname(sock,(<span class="enscript-type">struct</span> sockaddr*)&amp;addr, &amp;len)) == -1) { close(sock); <span class="enscript-keyword">return</span>; }
  93. close(sock);
  94. src-&gt;type = mDNSAddrType_IPv4;
  95. src-&gt;ip.v4.NotAnInteger = addr.sin_addr.s_addr;
  96. }
  97. <span class="enscript-comment">// dst must be at least MAX_ESCAPED_DOMAIN_NAME bytes, and option must be less than 32 bytes in length
  98. </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)
  99. {
  100. <span class="enscript-type">char</span> buf[32+1+MAX_ESCAPED_DOMAIN_NAME]; <span class="enscript-comment">// Option name, one space, option value
  101. </span> <span class="enscript-type">unsigned</span> <span class="enscript-type">int</span> len = strlen(option);
  102. <span class="enscript-keyword">if</span> (len + 1 + MAX_ESCAPED_DOMAIN_NAME &gt; <span class="enscript-keyword">sizeof</span>(buf)-1) { LogMsg(<span class="enscript-string">&quot;GetConfigOption: option %s too long&quot;</span>, option); <span class="enscript-keyword">return</span> mDNSfalse; }
  103. fseek(f, 0, SEEK_SET); <span class="enscript-comment">// set position to beginning of stream
  104. </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
  105. </span> {
  106. <span class="enscript-keyword">if</span> (!strncmp(buf, option, len))
  107. {
  108. strncpy(dst, buf + len + 1, MAX_ESCAPED_DOMAIN_NAME-1);
  109. <span class="enscript-keyword">if</span> (dst[MAX_ESCAPED_DOMAIN_NAME-1]) dst[MAX_ESCAPED_DOMAIN_NAME-1] = <span class="enscript-string">'\0'</span>;
  110. len = strlen(dst);
  111. <span class="enscript-keyword">if</span> (len &amp;&amp; dst[len-1] == <span class="enscript-string">'\n'</span>) dst[len-1] = <span class="enscript-string">'\0'</span>; <span class="enscript-comment">// chop newline
  112. </span> <span class="enscript-keyword">return</span> mDNStrue;
  113. }
  114. }
  115. debugf(<span class="enscript-string">&quot;Option %s not set&quot;</span>, option);
  116. <span class="enscript-keyword">return</span> mDNSfalse;
  117. }
  118. 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)
  119. {
  120. <span class="enscript-type">char</span> buf [MAX_ESCAPED_DOMAIN_NAME];
  121. <span class="enscript-type">char</span> secret[MAX_ESCAPED_DOMAIN_NAME] = <span class="enscript-string">&quot;&quot;</span>;
  122. mStatus err;
  123. FILE *f = fopen(filename, <span class="enscript-string">&quot;r&quot;</span>);
  124. <span class="enscript-keyword">if</span> (hostname) hostname-&gt;c[0] = 0;
  125. <span class="enscript-keyword">if</span> (domain) domain-&gt;c[0] = 0;
  126. <span class="enscript-keyword">if</span> (DomainDiscoveryDisabled) *DomainDiscoveryDisabled = mDNSfalse;
  127. <span class="enscript-keyword">if</span> (f)
  128. {
  129. <span class="enscript-keyword">if</span> (DomainDiscoveryDisabled &amp;&amp; GetConfigOption(buf, <span class="enscript-string">&quot;DomainDiscoveryDisabled&quot;</span>, f) &amp;&amp; !strcasecmp(buf, <span class="enscript-string">&quot;true&quot;</span>)) *DomainDiscoveryDisabled = mDNStrue;
  130. <span class="enscript-keyword">if</span> (hostname &amp;&amp; GetConfigOption(buf, <span class="enscript-string">&quot;hostname&quot;</span>, f) &amp;&amp; !MakeDomainNameFromDNSNameString(hostname, buf)) <span class="enscript-keyword">goto</span> <span class="enscript-reference">badf</span>;
  131. <span class="enscript-keyword">if</span> (domain &amp;&amp; GetConfigOption(buf, <span class="enscript-string">&quot;zone&quot;</span>, f) &amp;&amp; !MakeDomainNameFromDNSNameString(domain, buf)) <span class="enscript-keyword">goto</span> <span class="enscript-reference">badf</span>;
  132. GetConfigOption(secret, <span class="enscript-string">&quot;secret-64&quot;</span>, f); <span class="enscript-comment">// failure means no authentication
  133. </span> fclose(f);
  134. f = NULL;
  135. }
  136. <span class="enscript-keyword">else</span>
  137. {
  138. <span class="enscript-keyword">if</span> (errno != ENOENT) LogMsg(<span class="enscript-string">&quot;ERROR: Config file exists, but cannot be opened.&quot;</span>);
  139. <span class="enscript-keyword">return</span>;
  140. }
  141. <span class="enscript-keyword">if</span> (domain &amp;&amp; domain-&gt;c[0] &amp;&amp; secret[0])
  142. {
  143. DomainAuthInfo *info = (DomainAuthInfo*)mDNSPlatformMemAllocate(<span class="enscript-keyword">sizeof</span>(*info));
  144. <span class="enscript-comment">// for now we assume keyname = service reg domain and we use same key for service and hostname registration
  145. </span> err = mDNS_SetSecretForDomain(m, info, domain, domain, secret, mDNSfalse);
  146. <span class="enscript-keyword">if</span> (err) LogMsg(<span class="enscript-string">&quot;ERROR: mDNS_SetSecretForDomain returned %d for domain %##s&quot;</span>, err, domain-&gt;c);
  147. }
  148. <span class="enscript-keyword">return</span>;
  149. <span class="enscript-reference">badf</span>:
  150. LogMsg(<span class="enscript-string">&quot;ERROR: malformatted config file&quot;</span>);
  151. <span class="enscript-keyword">if</span> (f) fclose(f);
  152. }
  153. </pre>
  154. <hr />
  155. </body></html>