Commit | Line | Data |
---|---|---|
b9feeb00 SL |
1 | #ifndef lint |
2 | static char sccsid[] = "@(#)gettable.c 4.1 (Bekeley) %G%"; | |
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 | } |