1 #ifndef lint 2 static char sccsid[] = "@(#)gettable.c 4.1 (Bekeley) 12/31/82"; 3 #endif 4 5 #include <sys/types.h> 6 #include <sys/socket.h> 7 8 #include <netinet/in.h> 9 10 #include <stdio.h> 11 #include <netdb.h> 12 13 #define OUTFILE "hosts.txt" /* default output file */ 14 #define QUERY "ALL\r\n" /* query to hostname server */ 15 16 #define equaln(s1, s2, n) (!strncmp(s1, s2, n)) 17 18 struct sockaddr_in sin; 19 char buf[BUFSIZ]; 20 char *outfile = OUTFILE; 21 22 main(argc, argv) 23 int argc; 24 char *argv[]; 25 { 26 int s; 27 register len; 28 register FILE *sfi, *sfo, *hf; 29 register char *p; 30 char *host; 31 register struct hostent *hp; 32 struct servent *sp; 33 34 argv++, argc--; 35 if (argc < 1 || argc > 2) { 36 fprintf(stderr, "usage: gettable host [ file ]\n"); 37 exit(1); 38 } 39 sp = getservbyname("nicname", "tcp"); 40 if (sp == NULL) { 41 fprintf(stderr, "gettable: nicname/tcp: unknown service\n"); 42 exit(3); 43 } 44 host = *argv; 45 argv++, argc--; 46 hp = gethostbyname(host); 47 if (hp == NULL) { 48 fprintf(stderr, "gettable: %s: host unknown\n", host); 49 exit(2); 50 } 51 host = hp->h_name; 52 if (argc > 0) 53 outfile = *argv; 54 sin.sin_family = hp->h_addrtype; 55 s = socket(hp->h_addrtype, SOCK_STREAM, 0, 0); 56 if (s < 0) { 57 perror("gettable: socket"); 58 exit(4); 59 } 60 if (bind(s, &sin, sizeof (sin), 0) < 0) { 61 perror("gettable: bind"); 62 exit(5); 63 } 64 bcopy(hp->h_addr, &sin.sin_addr, hp->h_length); 65 sin.sin_port = sp->s_port; 66 if (connect(s, &sin, sizeof (sin), 0) < 0) { 67 perror("gettable: connect"); 68 exit(6); 69 } 70 fprintf(stderr, "Connection to %s opened.\n", host); 71 sfi = fdopen(s, "r"); 72 sfo = fdopen(s, "w"); 73 if (sfi == NULL || sfo == NULL) { 74 perror("gettable: fdopen"); 75 close(s); 76 exit(1); 77 } 78 hf = fopen(outfile, "w"); 79 if (hf == NULL) { 80 fprintf(stderr, "gettable: "); perror(outfile); 81 close(s); 82 exit(1); 83 } 84 fprintf(sfo, QUERY); 85 fflush(sfo); 86 while (fgets(buf, sizeof(buf), sfi) != NULL) { 87 len = strlen(buf); 88 buf[len-2] = '\0'; 89 if (equaln(buf, "BEGIN", 5) || equaln(buf, "END", 3)) { 90 continue; 91 } 92 if (equaln(buf, "ERR", 3)) { 93 fprintf(stderr, "gettable: nicname error: %s", buf); 94 continue; 95 } 96 fprintf(hf, "%s\n", buf); 97 } 98 fclose(hf); 99 fprintf(stderr, "Host table received.\n"); 100 close(s); 101 fprintf(stderr, "Connection to %s closed\n", host); 102 } 103