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