lookup.c revision 1.1.1.1 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