1: /* 2: * Copyright (c) 1983 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char sccsid[] = "@(#)gettable.c 5.2 (Berkeley) 4/30/86"; 9: #endif not lint 10: 11: #include <sys/types.h> 12: #include <sys/socket.h> 13: 14: #include <netinet/in.h> 15: 16: #include <stdio.h> 17: #include <netdb.h> 18: 19: #define OUTFILE "hosts.txt" /* default output file */ 20: #define VERFILE "hosts.ver" /* default version file */ 21: #define QUERY "ALL\r\n" /* query to hostname server */ 22: #define VERSION "VERSION\r\n" /* get version number */ 23: 24: #define equaln(s1, s2, n) (!strncmp(s1, s2, n)) 25: 26: struct sockaddr_in sin; 27: char buf[BUFSIZ]; 28: char *outfile = OUTFILE; 29: 30: main(argc, argv) 31: int argc; 32: char *argv[]; 33: { 34: int s; 35: register len; 36: register FILE *sfi, *sfo, *hf; 37: char *host; 38: register struct hostent *hp; 39: struct servent *sp; 40: int version = 0; 41: int beginseen = 0; 42: int endseen = 0; 43: 44: argv++, argc--; 45: if (**argv == '-') { 46: if (argv[0][1] != 'v') 47: fprintf(stderr, "unknown option %s ignored\n", *argv); 48: else 49: version++, outfile = VERFILE; 50: argv++, argc--; 51: } 52: if (argc < 1 || argc > 2) { 53: fprintf(stderr, "usage: gettable [-v] host [ file ]\n"); 54: exit(1); 55: } 56: sp = getservbyname("hostnames", "tcp"); 57: if (sp == NULL) { 58: fprintf(stderr, "gettable: hostnames/tcp: unknown service\n"); 59: exit(3); 60: } 61: host = *argv; 62: argv++, argc--; 63: hp = gethostbyname(host); 64: if (hp == NULL) { 65: fprintf(stderr, "gettable: %s: host unknown\n", host); 66: exit(2); 67: } 68: host = hp->h_name; 69: if (argc > 0) 70: outfile = *argv; 71: sin.sin_family = hp->h_addrtype; 72: s = socket(hp->h_addrtype, SOCK_STREAM, 0); 73: if (s < 0) { 74: perror("gettable: socket"); 75: exit(4); 76: } 77: if (bind(s, &sin, sizeof (sin)) < 0) { 78: perror("gettable: bind"); 79: exit(5); 80: } 81: bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length); 82: sin.sin_port = sp->s_port; 83: if (connect(s, &sin, sizeof (sin)) < 0) { 84: perror("gettable: connect"); 85: exit(6); 86: } 87: fprintf(stderr, "Connection to %s opened.\n", host); 88: sfi = fdopen(s, "r"); 89: sfo = fdopen(s, "w"); 90: if (sfi == NULL || sfo == NULL) { 91: perror("gettable: fdopen"); 92: close(s); 93: exit(1); 94: } 95: hf = fopen(outfile, "w"); 96: if (hf == NULL) { 97: fprintf(stderr, "gettable: "); perror(outfile); 98: close(s); 99: exit(1); 100: } 101: fprintf(sfo, version ? VERSION : QUERY); 102: fflush(sfo); 103: while (fgets(buf, sizeof(buf), sfi) != NULL) { 104: len = strlen(buf); 105: buf[len-2] = '\0'; 106: if (!version && equaln(buf, "BEGIN", 5)) { 107: if (beginseen || endseen) { 108: fprintf(stderr, 109: "gettable: BEGIN sequence error\n"); 110: exit(90); 111: } 112: beginseen++; 113: continue; 114: } 115: if (!version && equaln(buf, "END", 3)) { 116: if (!beginseen || endseen) { 117: fprintf(stderr, 118: "gettable: END sequence error\n"); 119: exit(91); 120: } 121: endseen++; 122: continue; 123: } 124: if (equaln(buf, "ERR", 3)) { 125: fprintf(stderr, 126: "gettable: hostname service error: %s", buf); 127: exit(92); 128: } 129: fprintf(hf, "%s\n", buf); 130: } 131: fclose(hf); 132: if (!version) { 133: if (!beginseen) { 134: fprintf(stderr, "gettable: no BEGIN seen\n"); 135: exit(93); 136: } 137: if (!endseen) { 138: fprintf(stderr, "gettable: no END seen\n"); 139: exit(94); 140: } 141: fprintf(stderr, "Host table received.\n"); 142: } else 143: fprintf(stderr, "Version number received.\n"); 144: close(s); 145: fprintf(stderr, "Connection to %s closed\n", host); 146: exit(0); 147: }