/*      $NetBSD: lookup.c,v 1.6 2007/05/27 16:31:42 tls Exp $   */

#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: lookup.c,v 1.6 2007/05/27 16:31:42 tls Exp $");
#endif

/*
* 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>
#endif

#include <netdb.h>
#include <syslog.h>
#include <strings.h>

#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(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(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.
*
* Both inputs are in network order.
*/
int
lookup_netmask(u_int32 addr, 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:
*/