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