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