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