home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / lan / nameserv / driver.c next >
C/C++ Source or Header  |  1988-10-17  |  5KB  |  184 lines

  1. #ifndef lint
  2.   static char *RCSid = "$Header: driver.c,v 1.5.1 88/02/26 jerry Rel $";
  3. #endif
  4.  
  5. /* driver --
  6.    drive the IEN 116 nameserver.
  7.  
  8.    Modified by Jerry Aguirre.  21Mar1988
  9.    First argument is name of server to use.  Other arguments are names
  10.    to find.  More extensive display of responses.
  11.  
  12.    Written by Michael I. Bushnell.
  13.    Copyright (c) 1987 Michael I. Bushnell
  14.    You are hereby granted permission to use this program however you wish, 
  15.    including copying and distribution.  However, you are obligated not to sell
  16.    it or any part of it.  Anyone who obtains this program receives the right
  17.    to do the same.  This statement may not be removed from this program.
  18. */
  19.  
  20. /*
  21.  * $Source: /u1/staff/mike/src/nameserver/RCS/driver.c,v $
  22.  * $Revision: 1.5 $
  23.  * $Date: 87/06/24 15:02:38 $
  24.  * $State: Rel $
  25.  * $Author: mike $
  26.  * $Locker:  $
  27.  * $Log:    driver.c,v $
  28.  * Revision 1.5.1 88/02/26 Jerry Aguirre <jerry@olivetti.com>
  29.  * Field sizes don't include 2 byte header.  First arg is now name
  30.  * of server to request from.  Structure of response message is displayed.
  31.  *
  32.  * Revision 1.5  87/06/24  15:02:38  mike
  33.  * Prepared for final release.  Added Copyright.
  34.  * 
  35.  * Revision 1.4  87/06/19  17:00:05  mike
  36.  * More toying around.
  37.  * 
  38.  * Revision 1.3  87/06/19  14:44:13  mike
  39.  * Toyed around.
  40.  * 
  41.  * Revision 1.2  87/06/15  13:50:51  mike
  42.  * Changed the host it asks for
  43.  * 
  44.  * Revision 1.1  87/06/12  13:42:29  mike
  45.  * Initial revision
  46.  * 
  47.  */
  48.  
  49. #include <sys/types.h>
  50. #include <sys/socket.h>
  51. #include <netinet/in.h>
  52. #include <stdio.h>
  53. #include <netdb.h>
  54.  
  55. #include "ien116.h"
  56.  
  57. #define BUFLEN 2000
  58. char buf[BUFLEN];
  59.  
  60. /* Driver for the IEN 116 nameserver */
  61.  
  62. main(argc, argv) int argc; char *argv[];
  63. {
  64.   int sock;            /* Datagram socket */
  65.   struct sockaddr_in from;    /* Where we got the reply from */
  66.   struct sockaddr_in server;    /* Server's address */
  67.   struct sockaddr_in ourname;    /* Our address */
  68.   int addrlen;            /* Address length */
  69.   int c,i;            /* Generic counters */
  70.   int arg;
  71.   struct hostent *hp, *gethostbyname();    /* Host inquired of */
  72.   char *hostname;
  73.   int j, k;
  74.   int code, length;
  75.   
  76.   if (argc < 3) {
  77.     printf("usage: driver server name ...");
  78.     exit(1);
  79.   }
  80.  
  81.   sock = socket(AF_INET, SOCK_DGRAM, 0);
  82.   if (sock < 0)
  83.     {
  84.       perror("driver: opening socket");
  85.       exit (1);
  86.     }
  87.   ourname.sin_family = AF_INET;
  88.   ourname.sin_port = 0;
  89.   ourname.sin_addr.s_addr = INADDR_ANY;
  90.   if (bind(sock, (struct sockaddr *)&ourname, sizeof(ourname)))
  91.     {
  92.       perror("driver: binding socket");
  93.       exit(1);
  94.     }
  95.   
  96.   /* server.sin_family = AF_INET; */
  97.   server.sin_port = htons((u_short)PORT);
  98.   /* server.sin_addr.s_addr = INADDR_ANY; */
  99.   server.sin_addr.s_addr = INADDR_ANY;
  100.   hp = gethostbyname(argv[1]);
  101.   if (hp) {
  102.       server.sin_family = hp->h_addrtype;
  103. #ifndef    NOT43
  104.       bcopy(hp->h_addr_list[0], (caddr_t)&server.sin_addr,
  105.           hp->h_length);
  106. #else    NOT43
  107.       bcopy(hp->h_addr, (caddr_t)&server.sin_addr,
  108.           hp->h_length);
  109. #endif    NOT43
  110.       hostname = hp->h_name;
  111.   } else {
  112.       printf("%s: unknown host\n", argv[1]);
  113.       exit(1);
  114.   }
  115.  
  116.   for (arg = 2; arg < argc; arg++) {
  117.     i = strlen(argv[arg]);
  118.     buf[0] = ADDR_REQ;        /* Code for request */
  119.     buf[1] = i;            /* Length of message */
  120.     strcpy(buf+2, argv[arg]);    /* name */
  121.  
  122.     if (sendto(sock, buf, i+2, 0, (struct sockaddr *)&server, sizeof(server))==-1)
  123.       {
  124.     perror("driver: sending message");
  125.     exit(1);
  126.       }
  127.  
  128.     if ((c=recvfrom(sock, buf, BUFLEN, 0, (struct sockaddr *)&from, sizeof(from)))==-1)
  129.       {
  130.     perror("driver: getting message");
  131.     exit(1);
  132.       }
  133.  
  134.     printf("response for \"%s\" (%d bytes):\n", argv[arg], c);
  135.     for(i=0;(i + 1) <c;) {
  136.       putchar('\t');
  137.       code = buf[i++] & 0xff;
  138.       length = buf[i++] & 0xff;
  139.       switch (code) {
  140.       case ADDR_REQ:
  141.         printf("ADDR_REQ: length %d \"", length);
  142.     for (k = 0; k < length; k++) {
  143.       if ((buf[i+k] >= ' ') && (buf[i+k] <= '~')) putchar(buf[i+k]);
  144.       else printf("\\%3.3o", buf[i+k] & 0xff);
  145.     }
  146.     printf("\"");
  147.     break;
  148.       case ADDR_ANS:
  149.         printf("ADDR_ANS: length %d", length);
  150.     for (k = 0; k < length; k++) {
  151.       if (k == 0) printf(" %d", buf[i+k] & 0xff);
  152.       else        printf(".%d", buf[i+k] & 0xff);
  153.     }
  154.     break;
  155.       case ERR:
  156.         printf("ERR: length %d", length);
  157.     for (k = 0; k < length; k++) {
  158.       j = buf[i+k] & 0xff;
  159.       printf(" error code %d", j);
  160.       switch (j) {
  161.           case UNK_ERR:
  162.         printf(" UNK_ERR");
  163.           break;
  164.           case HOST_UNK:
  165.         printf(" HOST_UNK");
  166.           break;
  167.           case SYNT_ERR:
  168.         printf(" SYNT_ERR");
  169.           break;
  170.           default:
  171.         printf("????");
  172.       }
  173.     }
  174.     break;
  175.       default:
  176.         printf("Unknown response code 0x%x, length %d.", buf[i] & 0xff, length);
  177.     break;
  178.       }
  179.       i += length;
  180.       printf("\n");
  181.     }
  182.   }    /* for each arg */
  183. }
  184.