Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/libexec/bootpd/lookup.c
34823 views
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 *
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
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
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
119