home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / bootpd-2.zip / LOOKUP.C < prev    next >
C/C++ Source or Header  |  1995-02-16  |  2KB  |  130 lines

  1. /*
  2.  * lookup.c - Lookup IP address, HW address, netmask
  3.  */
  4.  
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7.  
  8. #ifdef _AIX32
  9. #include <sys/time.h>    /* for struct timeval in net/if.h */
  10. #endif
  11. #include <net/if.h>
  12. #include <netinet/in.h>
  13.  
  14. #ifdef    ETC_ETHERS
  15. #include <netinet/if_ether.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.  */
  130.