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