NetBSD/usr.sbin/bootpd/lookup.c
is 00cef679df New ARP system, supports IPv4 over any hardware link.
Some of the stuff (e.g., rarpd, bootpd, dhcpd etc., libsa) still will
only support Ethernet. Tcpdump itself should be ok, but libpcap needs
lot of work.

For the detailed change history, look at the commit log entries for
the is-newarp branch.
1997-03-15 18:37:27 +00:00

127 lines
2.2 KiB
C

/*
* lookup.c - Lookup IP address, HW address, netmask
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#ifdef ETC_ETHERS
#include <net/if_ether.h>
extern int ether_hostton();
#endif
#include <netdb.h>
#include <syslog.h>
#ifndef USE_BFUNCS
#include <memory.h>
/* Yes, memcpy is OK here (no overlapped copies). */
#define bcopy(a,b,c) memcpy(b,a,c)
#endif
#include "bootp.h"
#include "lookup.h"
#include "report.h"
/*
* Lookup an Ethernet address and return it.
* Return NULL if addr not found.
*/
u_char *
lookup_hwa(hostname, htype)
char *hostname;
int htype;
{
switch (htype) {
/* XXX - How is this done on other systems? -gwr */
#ifdef ETC_ETHERS
case HTYPE_ETHERNET:
case HTYPE_IEEE802:
{
static struct ether_addr ea;
/* This does a lookup in /etc/ethers */
if (ether_hostton(hostname, &ea)) {
report(LOG_ERR, "no HW addr for host \"%s\"",
hostname);
return (u_char *) 0;
}
return (u_char *) & ea;
}
#endif /* ETC_ETHERS */
default:
report(LOG_ERR, "no lookup for HW addr type %d", htype);
} /* switch */
/* If the system can't do it, just return an error. */
return (u_char *) 0;
}
/*
* Lookup an IP address.
* Return non-zero on failure.
*/
int
lookup_ipa(hostname, result)
char *hostname;
u_int32 *result;
{
struct hostent *hp;
hp = gethostbyname(hostname);
if (!hp)
return -1;
bcopy(hp->h_addr, result, sizeof(*result));
return 0;
}
/*
* Lookup a netmask
* Return non-zero on failure.
*
* XXX - This is OK as a default, but to really make this automatic,
* we would need to get the subnet mask from the ether interface.
* If this is wrong, specify the correct value in the bootptab.
*/
int
lookup_netmask(addr, result)
u_int32 addr; /* both in network order */
u_int32 *result;
{
int32 m, a;
a = ntohl(addr);
m = 0;
if (IN_CLASSA(a))
m = IN_CLASSA_NET;
if (IN_CLASSB(a))
m = IN_CLASSB_NET;
if (IN_CLASSC(a))
m = IN_CLASSC_NET;
if (!m)
return -1;
*result = htonl(m);
return 0;
}
/*
* Local Variables:
* tab-width: 4
* c-indent-level: 4
* c-argdecl-indent: 4
* c-continued-statement-offset: 4
* c-continued-brace-offset: -4
* c-label-offset: -4
* c-brace-offset: 0
* End:
*/