PageRenderTime 26ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/opensource.apple.com/source/Libinfo/Libinfo-173/lookup.subproj/lu_bootp.c

#
C | 306 lines | 236 code | 46 blank | 24 comment | 23 complexity | 5bb6cf510ba49ece471dc6fc8f7cf984 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>lu_bootp.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">lu_bootp.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">/*
  24. * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved.
  25. *
  26. * @APPLE_LICENSE_HEADER_START@
  27. *
  28. * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
  29. *
  30. * This file contains Original Code and/or Modifications of Original Code
  31. * as defined in and that are subject to the Apple Public Source License
  32. * Version 2.0 (the 'License'). You may not use this file except in
  33. * compliance with the License. Please obtain a copy of the License at
  34. * <a href="http://www.opensource.apple.com/apsl/">http://www.opensource.apple.com/apsl/</a> and read it before using this
  35. * file.
  36. *
  37. * The Original Code and all software distributed under the License are
  38. * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  39. * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  40. * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  41. * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
  42. * Please see the License for the specific language governing rights and
  43. * limitations under the License.
  44. *
  45. * @APPLE_LICENSE_HEADER_END@
  46. */</span>
  47. <span class="enscript-comment">/*
  48. * Bootp lookup - netinfo only
  49. * Copyright (C) 1989 by NeXT, Inc.
  50. */</span>
  51. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;mach/mach.h&gt;</span>
  52. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;stdio.h&gt;</span>
  53. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;stdlib.h&gt;</span>
  54. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;string.h&gt;</span>
  55. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;rpc/types.h&gt;</span>
  56. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;rpc/xdr.h&gt;</span>
  57. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;sys/socket.h&gt;</span>
  58. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;netinet/in.h&gt;</span>
  59. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;arpa/inet.h&gt;</span>
  60. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;net/if.h&gt;</span>
  61. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;netinet/if_ether.h&gt;</span>
  62. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;net/ethernet.h&gt;</span>
  63. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;pthread.h&gt;</span>
  64. #<span class="enscript-reference">include</span> <span class="enscript-string">&quot;_lu_types.h&quot;</span>
  65. #<span class="enscript-reference">include</span> <span class="enscript-string">&quot;lookup.h&quot;</span>
  66. #<span class="enscript-reference">include</span> <span class="enscript-string">&quot;lu_utils.h&quot;</span>
  67. <span class="enscript-type">extern</span> <span class="enscript-type">struct</span> ether_addr *<span class="enscript-function-name">ether_aton</span>(<span class="enscript-type">char</span> *);
  68. <span class="enscript-type">static</span> pthread_mutex_t _bootp_lock = PTHREAD_MUTEX_INITIALIZER;
  69. <span class="enscript-type">struct</span> bootpent
  70. {
  71. <span class="enscript-type">char</span> *b_name;
  72. <span class="enscript-type">struct</span> ether_addr b_enaddr;
  73. <span class="enscript-type">struct</span> in_addr b_ipaddr;
  74. <span class="enscript-type">char</span> *b_bootfile;
  75. };
  76. <span class="enscript-type">static</span> <span class="enscript-type">void</span>
  77. <span class="enscript-function-name">free_bootp</span>(<span class="enscript-type">struct</span> bootpent *b)
  78. {
  79. <span class="enscript-keyword">if</span> (b == NULL) <span class="enscript-keyword">return</span>;
  80. <span class="enscript-keyword">if</span> (b-&gt;b_name != NULL) free(b-&gt;b_name);
  81. <span class="enscript-keyword">if</span> (b-&gt;b_bootfile != NULL) free(b-&gt;b_bootfile);
  82. free(b);
  83. }
  84. <span class="enscript-type">static</span> <span class="enscript-type">struct</span> bootpent *
  85. <span class="enscript-function-name">extract_bootp</span>(XDR *xdr)
  86. {
  87. <span class="enscript-type">struct</span> bootpent *b;
  88. <span class="enscript-type">struct</span> ether_addr *e;
  89. <span class="enscript-type">int</span> i, j, nvals, nkeys, status;
  90. <span class="enscript-type">char</span> *key, **vals;
  91. <span class="enscript-keyword">if</span> (xdr == NULL) <span class="enscript-keyword">return</span> NULL;
  92. <span class="enscript-keyword">if</span> (!xdr_int(xdr, &amp;nkeys)) <span class="enscript-keyword">return</span> NULL;
  93. b = (<span class="enscript-type">struct</span> bootpent *)calloc(1, <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> bootpent));
  94. <span class="enscript-keyword">for</span> (i = 0; i &lt; nkeys; i++)
  95. {
  96. key = NULL;
  97. vals = NULL;
  98. nvals = 0;
  99. status = _lu_xdr_attribute(xdr, &amp;key, &amp;vals, &amp;nvals);
  100. <span class="enscript-keyword">if</span> (status &lt; 0)
  101. {
  102. free_bootp(b);
  103. <span class="enscript-keyword">return</span> NULL;
  104. }
  105. <span class="enscript-keyword">if</span> (nvals == 0)
  106. {
  107. free(key);
  108. <span class="enscript-keyword">continue</span>;
  109. }
  110. j = 0;
  111. <span class="enscript-keyword">if</span> ((b-&gt;b_name == NULL) &amp;&amp; (!strcmp(<span class="enscript-string">&quot;name&quot;</span>, key)))
  112. {
  113. b-&gt;b_name = vals[0];
  114. j = 1;
  115. }
  116. <span class="enscript-keyword">if</span> ((b-&gt;b_name == NULL) &amp;&amp; (!strcmp(<span class="enscript-string">&quot;bootfile&quot;</span>, key)))
  117. {
  118. b-&gt;b_bootfile = vals[0];
  119. j = 1;
  120. }
  121. <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span> (!strcmp(<span class="enscript-string">&quot;ip_address&quot;</span>, key))
  122. {
  123. b-&gt;b_ipaddr.s_addr = inet_addr(vals[0]);
  124. }
  125. <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span> (!strcmp(<span class="enscript-string">&quot;en_address&quot;</span>, key))
  126. {
  127. pthread_mutex_lock(&amp;_bootp_lock);
  128. e = ether_aton(vals[0]);
  129. <span class="enscript-keyword">if</span> (e != NULL) memcpy(&amp;(b-&gt;b_enaddr), e, <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> ether_addr));
  130. pthread_mutex_unlock(&amp;_bootp_lock);
  131. j = 1;
  132. }
  133. free(key);
  134. <span class="enscript-keyword">if</span> (vals != NULL)
  135. {
  136. <span class="enscript-keyword">for</span> (; j &lt; nvals; j++) free(vals[j]);
  137. free(vals);
  138. }
  139. }
  140. <span class="enscript-keyword">if</span> (b-&gt;b_name == NULL) b-&gt;b_name = strdup(<span class="enscript-string">&quot;&quot;</span>);
  141. <span class="enscript-keyword">if</span> (b-&gt;b_bootfile == NULL) b-&gt;b_bootfile = strdup(<span class="enscript-string">&quot;&quot;</span>);
  142. <span class="enscript-keyword">return</span> b;
  143. }
  144. <span class="enscript-type">static</span> <span class="enscript-type">int</span>
  145. <span class="enscript-function-name">lu_bootp_getbyether</span>(<span class="enscript-type">struct</span> ether_addr *enaddr, <span class="enscript-type">char</span> **name,
  146. <span class="enscript-type">struct</span> in_addr *ipaddr, <span class="enscript-type">char</span> **bootfile)
  147. {
  148. <span class="enscript-type">unsigned</span> datalen;
  149. XDR inxdr;
  150. <span class="enscript-type">struct</span> bootpent *b;
  151. <span class="enscript-type">static</span> <span class="enscript-type">int</span> proc = -1;
  152. <span class="enscript-type">char</span> *lookup_buf;
  153. <span class="enscript-type">int</span> count;
  154. <span class="enscript-keyword">if</span> (proc &lt; 0)
  155. {
  156. <span class="enscript-keyword">if</span> (_lookup_link(_lu_port, <span class="enscript-string">&quot;bootp_getbyether&quot;</span>, &amp;proc) != KERN_SUCCESS)
  157. {
  158. <span class="enscript-keyword">return</span> 0;
  159. }
  160. }
  161. datalen = 0;
  162. lookup_buf = NULL;
  163. <span class="enscript-keyword">if</span> (_lookup_all(_lu_port, proc, (unit *)enaddr, ((<span class="enscript-keyword">sizeof</span>(*enaddr) + <span class="enscript-keyword">sizeof</span>(unit) - 1) / <span class="enscript-keyword">sizeof</span>(unit)), &amp;lookup_buf, &amp;datalen) != KERN_SUCCESS)
  164. {
  165. <span class="enscript-keyword">return</span> 0;
  166. }
  167. datalen *= BYTES_PER_XDR_UNIT;
  168. <span class="enscript-keyword">if</span> ((lookup_buf == NULL) || (datalen == 0)) <span class="enscript-keyword">return</span> NULL;
  169. xdrmem_create(&amp;inxdr, lookup_buf, datalen, XDR_DECODE);
  170. count = 0;
  171. <span class="enscript-keyword">if</span> (!xdr_int(&amp;inxdr, &amp;count))
  172. {
  173. xdr_destroy(&amp;inxdr);
  174. vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
  175. <span class="enscript-keyword">return</span> 0;
  176. }
  177. <span class="enscript-keyword">if</span> (count == 0)
  178. {
  179. xdr_destroy(&amp;inxdr);
  180. vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
  181. <span class="enscript-keyword">return</span> 0;
  182. }
  183. b = extract_bootp(&amp;inxdr);
  184. xdr_destroy(&amp;inxdr);
  185. *name = b-&gt;b_name;
  186. *bootfile = b-&gt;b_bootfile;
  187. ipaddr-&gt;s_addr = b-&gt;b_ipaddr.s_addr;
  188. free(b);
  189. vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
  190. <span class="enscript-keyword">return</span> 1;
  191. }
  192. <span class="enscript-type">static</span> <span class="enscript-type">int</span>
  193. <span class="enscript-function-name">lu_bootp_getbyip</span>(<span class="enscript-type">struct</span> ether_addr *enaddr, <span class="enscript-type">char</span> **name,
  194. <span class="enscript-type">struct</span> in_addr *ipaddr, <span class="enscript-type">char</span> **bootfile)
  195. {
  196. <span class="enscript-type">unsigned</span> datalen;
  197. XDR inxdr;
  198. <span class="enscript-type">struct</span> bootpent *b;
  199. <span class="enscript-type">static</span> <span class="enscript-type">int</span> proc = -1;
  200. <span class="enscript-type">char</span> *lookup_buf;
  201. <span class="enscript-type">int</span> count;
  202. <span class="enscript-keyword">if</span> (proc &lt; 0)
  203. {
  204. <span class="enscript-keyword">if</span> (_lookup_link(_lu_port, <span class="enscript-string">&quot;bootp_getbyip&quot;</span>, &amp;proc) != KERN_SUCCESS)
  205. {
  206. <span class="enscript-keyword">return</span> 0;
  207. }
  208. }
  209. datalen = 0;
  210. lookup_buf = NULL;
  211. <span class="enscript-keyword">if</span> (_lookup_all(_lu_port, proc, (unit *)ipaddr, ((<span class="enscript-keyword">sizeof</span>(*ipaddr) + <span class="enscript-keyword">sizeof</span>(unit) - 1) / <span class="enscript-keyword">sizeof</span>(unit)), &amp;lookup_buf, &amp;datalen) != KERN_SUCCESS)
  212. {
  213. <span class="enscript-keyword">return</span> 0;
  214. }
  215. datalen *= BYTES_PER_XDR_UNIT;
  216. <span class="enscript-keyword">if</span> ((lookup_buf == NULL) || (datalen == 0)) <span class="enscript-keyword">return</span> NULL;
  217. xdrmem_create(&amp;inxdr, lookup_buf, datalen, XDR_DECODE);
  218. count = 0;
  219. <span class="enscript-keyword">if</span> (!xdr_int(&amp;inxdr, &amp;count))
  220. {
  221. xdr_destroy(&amp;inxdr);
  222. vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
  223. <span class="enscript-keyword">return</span> 0;
  224. }
  225. <span class="enscript-keyword">if</span> (count == 0)
  226. {
  227. xdr_destroy(&amp;inxdr);
  228. vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
  229. <span class="enscript-keyword">return</span> 0;
  230. }
  231. b = extract_bootp(&amp;inxdr);
  232. xdr_destroy(&amp;inxdr);
  233. *name = b-&gt;b_name;
  234. *bootfile = b-&gt;b_bootfile;
  235. memcpy(enaddr, &amp;(b-&gt;b_enaddr), <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> ether_addr));
  236. free(b);
  237. vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
  238. <span class="enscript-keyword">return</span> 1;
  239. }
  240. <span class="enscript-type">int</span>
  241. <span class="enscript-function-name">bootp_getbyether</span>(<span class="enscript-type">struct</span> ether_addr *enaddr, <span class="enscript-type">char</span> **name,<span class="enscript-type">struct</span> in_addr *ipaddr, <span class="enscript-type">char</span> **bootfile)
  242. {
  243. <span class="enscript-keyword">if</span> (_lu_running())
  244. {
  245. <span class="enscript-keyword">return</span> (lu_bootp_getbyether(enaddr, name, ipaddr, bootfile));
  246. }
  247. <span class="enscript-keyword">return</span> 0;
  248. }
  249. <span class="enscript-type">int</span>
  250. <span class="enscript-function-name">bootp_getbyip</span>(<span class="enscript-type">struct</span> ether_addr *enaddr, <span class="enscript-type">char</span> **name, <span class="enscript-type">struct</span> in_addr *ipaddr, <span class="enscript-type">char</span> **bootfile)
  251. {
  252. <span class="enscript-keyword">if</span> (_lu_running())
  253. {
  254. <span class="enscript-keyword">return</span> (lu_bootp_getbyip(enaddr, name, ipaddr, bootfile));
  255. }
  256. <span class="enscript-keyword">return</span> 0;
  257. }
  258. </pre>
  259. <hr />
  260. </body></html>