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