xref: /netbsd-src/usr.sbin/bootp/common/lookup.c (revision d48f14661dda8638fee055ba15d35bdfb29b9fa8)
1 /*	$NetBSD: lookup.c,v 1.5 2002/07/14 00:26:17 wiz Exp $	*/
2 
3 #include <sys/cdefs.h>
4 #ifndef lint
5 __RCSID("$NetBSD: lookup.c,v 1.5 2002/07/14 00:26:17 wiz Exp $");
6 #endif
7 
8 /*
9  * lookup.c - Lookup IP address, HW address, netmask
10  */
11 
12 #include <sys/types.h>
13 #include <sys/socket.h>
14 
15 #include <net/if.h>
16 #include <netinet/in.h>
17 
18 #ifdef	ETC_ETHERS
19 #include <net/if_ether.h>
20 #endif
21 
22 #include <netdb.h>
23 #include <syslog.h>
24 
25 #ifndef USE_BFUNCS
26 #include <memory.h>
27 /* Yes, memcpy is OK here (no overlapped copies). */
28 #define bcopy(a,b,c)    memcpy(b,a,c)
29 #endif
30 
31 #include "bootp.h"
32 #include "lookup.h"
33 #include "report.h"
34 
35 /*
36  * Lookup an Ethernet address and return it.
37  * Return NULL if addr not found.
38  */
39 u_char *
40 lookup_hwa(char *hostname, int htype)
41 {
42 	switch (htype) {
43 
44 		/* XXX - How is this done on other systems? -gwr */
45 #ifdef	ETC_ETHERS
46 	case HTYPE_ETHERNET:
47 	case HTYPE_IEEE802:
48 		{
49 			static struct ether_addr ea;
50 			/* This does a lookup in /etc/ethers */
51 			if (ether_hostton(hostname, &ea)) {
52 				report(LOG_ERR, "no HW addr for host \"%s\"",
53 					   hostname);
54 				return (u_char *) 0;
55 			}
56 			return (u_char *) & ea;
57 		}
58 #endif /* ETC_ETHERS */
59 
60 	default:
61 		report(LOG_ERR, "no lookup for HW addr type %d", htype);
62 	}							/* switch */
63 
64 	/* If the system can't do it, just return an error. */
65 	return (u_char *) 0;
66 }
67 
68 
69 /*
70  * Lookup an IP address.
71  * Return non-zero on failure.
72  */
73 int
74 lookup_ipa(char *hostname, u_int32 *result)
75 {
76 	struct hostent *hp;
77 	hp = gethostbyname(hostname);
78 	if (!hp)
79 		return -1;
80 	bcopy(hp->h_addr, result, sizeof(*result));
81 	return 0;
82 }
83 
84 
85 /*
86  * Lookup a netmask
87  * Return non-zero on failure.
88  *
89  * XXX - This is OK as a default, but to really make this automatic,
90  * we would need to get the subnet mask from the ether interface.
91  * If this is wrong, specify the correct value in the bootptab.
92  *
93  * Both inputs are in network order.
94  */
95 int
96 lookup_netmask(u_int32 addr, u_int32 *result)
97 {
98 	int32 m, a;
99 
100 	a = ntohl(addr);
101 	m = 0;
102 
103 	if (IN_CLASSA(a))
104 		m = IN_CLASSA_NET;
105 
106 	if (IN_CLASSB(a))
107 		m = IN_CLASSB_NET;
108 
109 	if (IN_CLASSC(a))
110 		m = IN_CLASSC_NET;
111 
112 	if (!m)
113 		return -1;
114 	*result = htonl(m);
115 	return 0;
116 }
117 
118 /*
119  * Local Variables:
120  * tab-width: 4
121  * c-indent-level: 4
122  * c-argdecl-indent: 4
123  * c-continued-statement-offset: 4
124  * c-continued-brace-offset: -4
125  * c-label-offset: -4
126  * c-brace-offset: 0
127  * End:
128  */
129