home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 4 / 4030 / nslook.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-09-10  |  3.4 KB  |  177 lines

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #ifdef SYSV
  4. #include <sys/param.h>
  5. #include <netinet/in.h>
  6. #endif
  7. #include <netdb.h>
  8. #include <stdio.h>
  9.  
  10. char *progname ;
  11. extern struct hostent *gethostbyname(), *gethostbyaddr() ;
  12. extern int errno ;
  13.  
  14. main(argc, argv)
  15. int argc ;
  16. char **argv ;
  17. {
  18.     extern int optind ;        /* from getopt */
  19.     int opt ;            /* option character */
  20.     int aflg = 0 ;        /* address is given if non-zero, else name */
  21.     int lflg = 0 ;        /* long output format */
  22.     int errflg = 0 ;        /* usage error encountered */
  23.     char *cp, *strrchr() ;
  24.  
  25.     progname = argv[0] ;
  26.     if (cp = strrchr(progname, '/')) progname = cp + 1 ;
  27.     while ((opt = getopt(argc, argv, "la")) != -1) {
  28.     switch (opt) {
  29.       case 'l':
  30.         lflg = 1 ;
  31.         break ;
  32.       case 'a':
  33.         aflg = 1 ;
  34.         break ;
  35.       case '?':
  36.         errflg++ ;
  37.     }
  38.     }
  39.     if (errflg || optind != argc - 1) {
  40.     usage() ;
  41.     exit(1) ;
  42.     }
  43.  
  44.     if (aflg) {
  45.     from_address(argv[optind], lflg) ;
  46.     } else {
  47.     from_name(argv[optind], lflg) ;
  48.     }
  49.  
  50.     return 0 ;
  51. }
  52.  
  53.  
  54. from_address(astring, lflg)
  55. char *astring ;
  56. int lflg ;
  57. {
  58.     unsigned long addr ;    /* address in host order */
  59.     unsigned long norder ;    /* address in network order */
  60.     struct hostent *host ;    /* structure returned by gethostbyaddr() */
  61.     int octet[4] ;        /* the four bytes of the address */
  62.  
  63.     if (sscanf(astring, "%d.%d.%d.%d", 
  64.            octet, octet+1, octet+2, octet+3) != 4 ||
  65.     octet[0] > 255 || octet [0] < 0 ||
  66.     octet[1] > 255 || octet [1] < 0 ||
  67.     octet[2] > 255 || octet [2] < 0 ||
  68.     octet[3] > 255 || octet [3] < 0) {
  69.     usage() ;
  70.     exit(1) ;
  71.     }
  72.  
  73.     norder = (octet[0] << 24) | (octet[1] << 16) | (octet[2] << 8) | octet[3] ;
  74.     addr = ntohl(norder) ;
  75.  
  76.     if ((host = gethostbyaddr(&addr, 4, AF_INET)) == NULL) {
  77.     herror(progname) ;
  78.     exit(1) ;
  79.     }
  80.  
  81.     if (lflg) {
  82.     print_long(host) ;
  83.     } else {
  84.     puts(host->h_name) ;
  85.     }
  86. }
  87.  
  88. from_name(name, lflg)
  89. char *name ;
  90. int lflg ;
  91. {
  92.     struct hostent *host ;
  93.  
  94.     if ((host = gethostbyname(name)) == NULL) {
  95.     herror(progname) ;
  96.     exit(1) ;
  97.     }
  98.  
  99.     if (lflg) {
  100.     print_long(host) ;
  101.     } else {
  102.     paddress(*host->h_addr_list) ;
  103.     }
  104. }
  105.  
  106. print_long(host)
  107. struct hostent *host ;
  108. {
  109.     int i ;
  110.     unsigned long horder ;
  111.  
  112.     printf("Official name: %s\n", host->h_name) ;
  113.     while (*host->h_aliases) {
  114.     printf("Alias:         %s\n", *host->h_aliases++) ;
  115.     }
  116.     while (*host->h_addr_list) {
  117.     printf("Address:       ") ;
  118.     paddress(*host->h_addr_list++) ;
  119.     }
  120. }
  121.  
  122. paddress(paddr)
  123. unsigned long *paddr ;
  124. {
  125.     unsigned long horder ;
  126.  
  127.     horder = ntohl(*paddr) ;
  128.     printf("%u.%u.%u.%u\n", horder >> 24, (horder >> 16) & 0xff, 
  129.         (horder >> 8) & 0xff, horder & 0xff) ;
  130.  
  131. }
  132.     
  133.  
  134. usage()
  135. {
  136.     fprintf(stderr, "Usage: %s [-l] hostname\n       %s [-l] -a IP-address\n",
  137.         progname, progname) ;
  138. }
  139.  
  140. herror(s)
  141. char *s ;
  142. {
  143. #ifdef BSD
  144.     extern int h_errno ;
  145. #endif
  146.  
  147.     if (s && *s) {
  148.     fputs(s, stderr) ;
  149.     fputs(": ", stderr) ;
  150.     }
  151.  
  152.     switch (h_errno) {
  153.       case HOST_NOT_FOUND:
  154.     fputs("unknown host\n", stderr) ;
  155.     break ;
  156.       case TRY_AGAIN:
  157.     fputs("temporary error -- try again later\n", stderr) ;
  158.     break ;
  159.       case NO_RECOVERY:
  160.     fputs("unrecoverable error\n", stderr) ;
  161.     break ;
  162. #ifdef BSD
  163.       case NO_DATA:
  164. #else
  165. #ifdef SYSV
  166.       case NO_ADDRESS:
  167. #else
  168. you must define SYSV or BSD
  169. #endif /* SYSV */
  170. #endif /* BSD  */
  171.     fputs("no IP address\n", stderr) ;
  172.     break ;
  173.       default:
  174.     fprintf(stderr, "unknown error number %d\n", h_errno) ;
  175.     }
  176. }
  177.