home *** CD-ROM | disk | FTP | other *** search
- #include <sys/types.h>
- #include <sys/socket.h>
- #ifdef SYSV
- #include <sys/param.h>
- #include <netinet/in.h>
- #endif
- #include <netdb.h>
- #include <stdio.h>
-
- char *progname ;
- extern struct hostent *gethostbyname(), *gethostbyaddr() ;
- extern int errno ;
-
- main(argc, argv)
- int argc ;
- char **argv ;
- {
- extern int optind ; /* from getopt */
- int opt ; /* option character */
- int aflg = 0 ; /* address is given if non-zero, else name */
- int lflg = 0 ; /* long output format */
- int errflg = 0 ; /* usage error encountered */
- char *cp, *strrchr() ;
-
- progname = argv[0] ;
- if (cp = strrchr(progname, '/')) progname = cp + 1 ;
- while ((opt = getopt(argc, argv, "la")) != -1) {
- switch (opt) {
- case 'l':
- lflg = 1 ;
- break ;
- case 'a':
- aflg = 1 ;
- break ;
- case '?':
- errflg++ ;
- }
- }
- if (errflg || optind != argc - 1) {
- usage() ;
- exit(1) ;
- }
-
- if (aflg) {
- from_address(argv[optind], lflg) ;
- } else {
- from_name(argv[optind], lflg) ;
- }
-
- return 0 ;
- }
-
-
- from_address(astring, lflg)
- char *astring ;
- int lflg ;
- {
- unsigned long addr ; /* address in host order */
- unsigned long norder ; /* address in network order */
- struct hostent *host ; /* structure returned by gethostbyaddr() */
- int octet[4] ; /* the four bytes of the address */
-
- if (sscanf(astring, "%d.%d.%d.%d",
- octet, octet+1, octet+2, octet+3) != 4 ||
- octet[0] > 255 || octet [0] < 0 ||
- octet[1] > 255 || octet [1] < 0 ||
- octet[2] > 255 || octet [2] < 0 ||
- octet[3] > 255 || octet [3] < 0) {
- usage() ;
- exit(1) ;
- }
-
- norder = (octet[0] << 24) | (octet[1] << 16) | (octet[2] << 8) | octet[3] ;
- addr = ntohl(norder) ;
-
- if ((host = gethostbyaddr(&addr, 4, AF_INET)) == NULL) {
- herror(progname) ;
- exit(1) ;
- }
-
- if (lflg) {
- print_long(host) ;
- } else {
- puts(host->h_name) ;
- }
- }
-
- from_name(name, lflg)
- char *name ;
- int lflg ;
- {
- struct hostent *host ;
-
- if ((host = gethostbyname(name)) == NULL) {
- herror(progname) ;
- exit(1) ;
- }
-
- if (lflg) {
- print_long(host) ;
- } else {
- paddress(*host->h_addr_list) ;
- }
- }
-
- print_long(host)
- struct hostent *host ;
- {
- int i ;
- unsigned long horder ;
-
- printf("Official name: %s\n", host->h_name) ;
- while (*host->h_aliases) {
- printf("Alias: %s\n", *host->h_aliases++) ;
- }
- while (*host->h_addr_list) {
- printf("Address: ") ;
- paddress(*host->h_addr_list++) ;
- }
- }
-
- paddress(paddr)
- unsigned long *paddr ;
- {
- unsigned long horder ;
-
- horder = ntohl(*paddr) ;
- printf("%u.%u.%u.%u\n", horder >> 24, (horder >> 16) & 0xff,
- (horder >> 8) & 0xff, horder & 0xff) ;
-
- }
-
-
- usage()
- {
- fprintf(stderr, "Usage: %s [-l] hostname\n %s [-l] -a IP-address\n",
- progname, progname) ;
- }
-
- herror(s)
- char *s ;
- {
- #ifdef BSD
- extern int h_errno ;
- #endif
-
- if (s && *s) {
- fputs(s, stderr) ;
- fputs(": ", stderr) ;
- }
-
- switch (h_errno) {
- case HOST_NOT_FOUND:
- fputs("unknown host\n", stderr) ;
- break ;
- case TRY_AGAIN:
- fputs("temporary error -- try again later\n", stderr) ;
- break ;
- case NO_RECOVERY:
- fputs("unrecoverable error\n", stderr) ;
- break ;
- #ifdef BSD
- case NO_DATA:
- #else
- #ifdef SYSV
- case NO_ADDRESS:
- #else
- you must define SYSV or BSD
- #endif /* SYSV */
- #endif /* BSD */
- fputs("no IP address\n", stderr) ;
- break ;
- default:
- fprintf(stderr, "unknown error number %d\n", h_errno) ;
- }
- }
-