xref: /csrg-svn/old/gettable/gettable.c (revision 10038)
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