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