/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
- <!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>lu_bootp.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">lu_bootp.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">/*
- * Copyright (c) 1999-2002 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
- *
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * <a href="http://www.opensource.apple.com/apsl/">http://www.opensource.apple.com/apsl/</a> and read it before using this
- * file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */</span>
- <span class="enscript-comment">/*
- * Bootp lookup - netinfo only
- * Copyright (C) 1989 by NeXT, Inc.
- */</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><mach/mach.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><stdio.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><stdlib.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><string.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><rpc/types.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><rpc/xdr.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><sys/socket.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><netinet/in.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><arpa/inet.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><net/if.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><netinet/if_ether.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><net/ethernet.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><pthread.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string">"_lu_types.h"</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string">"lookup.h"</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string">"lu_utils.h"</span>
- <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> *);
- <span class="enscript-type">static</span> pthread_mutex_t _bootp_lock = PTHREAD_MUTEX_INITIALIZER;
- <span class="enscript-type">struct</span> bootpent
- {
- <span class="enscript-type">char</span> *b_name;
- <span class="enscript-type">struct</span> ether_addr b_enaddr;
- <span class="enscript-type">struct</span> in_addr b_ipaddr;
- <span class="enscript-type">char</span> *b_bootfile;
- };
- <span class="enscript-type">static</span> <span class="enscript-type">void</span>
- <span class="enscript-function-name">free_bootp</span>(<span class="enscript-type">struct</span> bootpent *b)
- {
- <span class="enscript-keyword">if</span> (b == NULL) <span class="enscript-keyword">return</span>;
- <span class="enscript-keyword">if</span> (b->b_name != NULL) free(b->b_name);
- <span class="enscript-keyword">if</span> (b->b_bootfile != NULL) free(b->b_bootfile);
- free(b);
- }
- <span class="enscript-type">static</span> <span class="enscript-type">struct</span> bootpent *
- <span class="enscript-function-name">extract_bootp</span>(XDR *xdr)
- {
- <span class="enscript-type">struct</span> bootpent *b;
- <span class="enscript-type">struct</span> ether_addr *e;
- <span class="enscript-type">int</span> i, j, nvals, nkeys, status;
- <span class="enscript-type">char</span> *key, **vals;
- <span class="enscript-keyword">if</span> (xdr == NULL) <span class="enscript-keyword">return</span> NULL;
- <span class="enscript-keyword">if</span> (!xdr_int(xdr, &nkeys)) <span class="enscript-keyword">return</span> NULL;
- b = (<span class="enscript-type">struct</span> bootpent *)calloc(1, <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> bootpent));
- <span class="enscript-keyword">for</span> (i = 0; i < nkeys; i++)
- {
- key = NULL;
- vals = NULL;
- nvals = 0;
- status = _lu_xdr_attribute(xdr, &key, &vals, &nvals);
- <span class="enscript-keyword">if</span> (status < 0)
- {
- free_bootp(b);
- <span class="enscript-keyword">return</span> NULL;
- }
- <span class="enscript-keyword">if</span> (nvals == 0)
- {
- free(key);
- <span class="enscript-keyword">continue</span>;
- }
- j = 0;
- <span class="enscript-keyword">if</span> ((b->b_name == NULL) && (!strcmp(<span class="enscript-string">"name"</span>, key)))
- {
- b->b_name = vals[0];
- j = 1;
- }
- <span class="enscript-keyword">if</span> ((b->b_name == NULL) && (!strcmp(<span class="enscript-string">"bootfile"</span>, key)))
- {
- b->b_bootfile = vals[0];
- j = 1;
- }
- <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span> (!strcmp(<span class="enscript-string">"ip_address"</span>, key))
- {
- b->b_ipaddr.s_addr = inet_addr(vals[0]);
- }
- <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span> (!strcmp(<span class="enscript-string">"en_address"</span>, key))
- {
- pthread_mutex_lock(&_bootp_lock);
- e = ether_aton(vals[0]);
- <span class="enscript-keyword">if</span> (e != NULL) memcpy(&(b->b_enaddr), e, <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> ether_addr));
- pthread_mutex_unlock(&_bootp_lock);
- j = 1;
- }
- free(key);
- <span class="enscript-keyword">if</span> (vals != NULL)
- {
- <span class="enscript-keyword">for</span> (; j < nvals; j++) free(vals[j]);
- free(vals);
- }
- }
- <span class="enscript-keyword">if</span> (b->b_name == NULL) b->b_name = strdup(<span class="enscript-string">""</span>);
- <span class="enscript-keyword">if</span> (b->b_bootfile == NULL) b->b_bootfile = strdup(<span class="enscript-string">""</span>);
- <span class="enscript-keyword">return</span> b;
- }
- <span class="enscript-type">static</span> <span class="enscript-type">int</span>
- <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,
- <span class="enscript-type">struct</span> in_addr *ipaddr, <span class="enscript-type">char</span> **bootfile)
- {
- <span class="enscript-type">unsigned</span> datalen;
- XDR inxdr;
- <span class="enscript-type">struct</span> bootpent *b;
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> proc = -1;
- <span class="enscript-type">char</span> *lookup_buf;
- <span class="enscript-type">int</span> count;
- <span class="enscript-keyword">if</span> (proc < 0)
- {
- <span class="enscript-keyword">if</span> (_lookup_link(_lu_port, <span class="enscript-string">"bootp_getbyether"</span>, &proc) != KERN_SUCCESS)
- {
- <span class="enscript-keyword">return</span> 0;
- }
- }
- datalen = 0;
- lookup_buf = NULL;
- <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)), &lookup_buf, &datalen) != KERN_SUCCESS)
- {
- <span class="enscript-keyword">return</span> 0;
- }
- datalen *= BYTES_PER_XDR_UNIT;
- <span class="enscript-keyword">if</span> ((lookup_buf == NULL) || (datalen == 0)) <span class="enscript-keyword">return</span> NULL;
- xdrmem_create(&inxdr, lookup_buf, datalen, XDR_DECODE);
- count = 0;
- <span class="enscript-keyword">if</span> (!xdr_int(&inxdr, &count))
- {
- xdr_destroy(&inxdr);
- vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
- <span class="enscript-keyword">return</span> 0;
- }
- <span class="enscript-keyword">if</span> (count == 0)
- {
- xdr_destroy(&inxdr);
- vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
- <span class="enscript-keyword">return</span> 0;
- }
- b = extract_bootp(&inxdr);
- xdr_destroy(&inxdr);
- *name = b->b_name;
- *bootfile = b->b_bootfile;
- ipaddr->s_addr = b->b_ipaddr.s_addr;
- free(b);
- vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
- <span class="enscript-keyword">return</span> 1;
- }
- <span class="enscript-type">static</span> <span class="enscript-type">int</span>
- <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,
- <span class="enscript-type">struct</span> in_addr *ipaddr, <span class="enscript-type">char</span> **bootfile)
- {
- <span class="enscript-type">unsigned</span> datalen;
- XDR inxdr;
- <span class="enscript-type">struct</span> bootpent *b;
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> proc = -1;
- <span class="enscript-type">char</span> *lookup_buf;
- <span class="enscript-type">int</span> count;
-
- <span class="enscript-keyword">if</span> (proc < 0)
- {
- <span class="enscript-keyword">if</span> (_lookup_link(_lu_port, <span class="enscript-string">"bootp_getbyip"</span>, &proc) != KERN_SUCCESS)
- {
- <span class="enscript-keyword">return</span> 0;
- }
- }
- datalen = 0;
- lookup_buf = NULL;
- <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)), &lookup_buf, &datalen) != KERN_SUCCESS)
- {
- <span class="enscript-keyword">return</span> 0;
- }
- datalen *= BYTES_PER_XDR_UNIT;
- <span class="enscript-keyword">if</span> ((lookup_buf == NULL) || (datalen == 0)) <span class="enscript-keyword">return</span> NULL;
- xdrmem_create(&inxdr, lookup_buf, datalen, XDR_DECODE);
- count = 0;
- <span class="enscript-keyword">if</span> (!xdr_int(&inxdr, &count))
- {
- xdr_destroy(&inxdr);
- vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
- <span class="enscript-keyword">return</span> 0;
- }
- <span class="enscript-keyword">if</span> (count == 0)
- {
- xdr_destroy(&inxdr);
- vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
- <span class="enscript-keyword">return</span> 0;
- }
- b = extract_bootp(&inxdr);
- xdr_destroy(&inxdr);
- *name = b->b_name;
- *bootfile = b->b_bootfile;
- memcpy(enaddr, &(b->b_enaddr), <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> ether_addr));
- free(b);
- vm_deallocate(mach_task_self(), (vm_address_t)lookup_buf, datalen);
- <span class="enscript-keyword">return</span> 1;
- }
- <span class="enscript-type">int</span>
- <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)
- {
- <span class="enscript-keyword">if</span> (_lu_running())
- {
- <span class="enscript-keyword">return</span> (lu_bootp_getbyether(enaddr, name, ipaddr, bootfile));
- }
- <span class="enscript-keyword">return</span> 0;
- }
- <span class="enscript-type">int</span>
- <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)
- {
- <span class="enscript-keyword">if</span> (_lu_running())
- {
- <span class="enscript-keyword">return</span> (lu_bootp_getbyip(enaddr, name, ipaddr, bootfile));
- }
- <span class="enscript-keyword">return</span> 0;
- }
- </pre>
- <hr />
- </body></html>