]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - libexec/bootpd/lookup.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / libexec / bootpd / lookup.c
1 /*
2  * lookup.c - Lookup IP address, HW address, netmask
3  *
4  * $FreeBSD$
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 <net/ethernet.h>
16 extern 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  */
36 u_char *
37 lookup_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  */
72 int
73 lookup_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  */
94 int
95 lookup_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  */