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

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

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