1e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley/* host.c - DNS lookup utility
2e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley *
3e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley * Copyright 2014 Rich Felker <dalias@aerifal.cx>
4e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley *
5e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley * No standard, but there's a version in bind9
6e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
7e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob LandleyUSE_HOST(NEWTOY(host, "<1>2avt:", TOYFLAG_USR|TOYFLAG_BIN))
8e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
9e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landleyconfig HOST
10e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  bool "host"
11e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  default n
12e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  help
13e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    usage: host [-av] [-t TYPE] NAME [SERVER]
14e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
15e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    Perform DNS lookup on NAME, which can be a domain name to lookup,
16e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    or an ipv4 dotted or ipv6 colon seprated address to reverse lookup.
17e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    SERVER (if present) is the DNS server to use.
18e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
19e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    -a	no idea
20e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    -t	not a clue
21e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    -v	verbose
22e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley*/
23e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
24e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#define FOR_host
25e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#include "toys.h"
26e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
27e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob LandleyGLOBALS(
28e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  char *type_str;
29e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley)
30e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
31e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#include <resolv.h>
32e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
33e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#define PL_IP 1
34e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#define PL_NAME 2
35e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#define PL_DATA 3
36e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#define PL_TEXT 4
37e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#define PL_SOA 5
38e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#define PL_MX 6
39e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley#define PL_SRV 7
40e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
41e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landleystatic const struct rrt {
42e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  const char *name;
43e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  const char *msg;
44e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  int pl;
45e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  int af;
46e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley} rrt[] = {
47e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [1] = { "A", "has address", PL_IP, AF_INET },
48e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [28] = { "AAAA", "has address", PL_IP, AF_INET6 },
49e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [2] = { "NS", "name server", PL_NAME },
50e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [5] = { "CNAME", "is a nickname for", PL_NAME },
51e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [16] = { "TXT", "descriptive text", PL_TEXT },
52e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [6] = { "SOA", "start of authority", PL_SOA },
53e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [12] = { "PTR", "domain name pointer", PL_NAME },
54e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [15] = { "MX", "mail is handled", PL_MX },
55e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [33] = { "SRV", "mail is handled", PL_SRV },
56e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  [255] = { "*", 0, 0 },
57e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley};
58e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
59e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landleystatic const char rct[16][32] = {
60e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  "Success",
61e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  "Format error",
62e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  "Server failure",
63e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  "Non-existant domain",
64e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  "Not implemented",
65e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  "Refused",
66e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley};
67e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
68e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landleyvoid host_main(void)
69e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley{
7059fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  int verbose=(toys.optflags & (FLAG_a|FLAG_v)), type,
7159fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      i, j, ret, sec, count, rcode, qlen, alen, pllen = 0;
72c421b7068c5dd95baa10f9bd97e578d04ba48c70Rob Landley  unsigned ttl, pri, v[5];
73e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  unsigned char qbuf[280], abuf[512], *p;
7459fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  char *name, *nsname, rrname[256], plname[640], ptrbuf[64];
75e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  struct addrinfo *ai, iplit_hints = { .ai_flags = AI_NUMERICHOST };
76e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
77e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  name = *toys.optargs;
78e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  nsname = toys.optargs[1];
79e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
80e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  if (!TT.type_str && (toys.optflags & FLAG_a)) TT.type_str = "255";
81e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  if (!getaddrinfo(name, 0, &iplit_hints, &ai)) {
8259fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    unsigned char *a;
8359fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    static const char xdigits[] = "0123456789abcdef";
8459fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley
8559fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    if (ai->ai_family == AF_INET) {
86e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      a = (void *)&((struct sockaddr_in *)ai->ai_addr)->sin_addr;
8759fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      snprintf(ptrbuf, sizeof(ptrbuf), "%d.%d.%d.%d.in-addr.arpa",
88e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        a[3], a[2], a[1], a[0]);
8959fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    } else if (ai->ai_family == AF_INET6) {
90e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      a = (void *)&((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr;
91e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      for (j=0, i=15; i>=0; i--) {
92e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        ptrbuf[j++] = xdigits[a[i]&15];
93e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        ptrbuf[j++] = '.';
94e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        ptrbuf[j++] = xdigits[a[i]>>4];
95e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        ptrbuf[j++] = '.';
96e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      }
97e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      strcpy(ptrbuf+j, "ip6.arpa");
98e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    }
99e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    name = ptrbuf;
100e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    if (!TT.type_str) TT.type_str="12";
10159fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  } else if (!TT.type_str) TT.type_str="1";
102e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
10359fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  if (TT.type_str[0]-'0' < 10u) type = atoi(TT.type_str);
10459fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  else {
105e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    type = -1;
106e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    for (i=0; i < sizeof rrt / sizeof *rrt; i++) {
107e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      if (rrt[i].name && !strcasecmp(TT.type_str, rrt[i].name)) {
108e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        type = i;
109e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        break;
110e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      }
111e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    }
112e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    if (!strcasecmp(TT.type_str, "any")) type = 255;
11359fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    if (type < 0) error_exit("Invalid query type: %s", TT.type_str);
114e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  }
115e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
116e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  qlen = res_mkquery(0, name, 1, type, 0, 0, 0, qbuf, sizeof qbuf);
11759fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  if (qlen < 0) error_exit("Invalid query parameters: %s", name);
118e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
119e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  if (nsname) {
120e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    struct addrinfo ns_hints = { .ai_socktype = SOCK_DGRAM };
12159fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley
12259fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    if ((ret = getaddrinfo(nsname, "53", &ns_hints, &ai)) < 0)
12359fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      error_exit("Error looking up server name: %s", gai_strerror(ret));
124e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    int s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
12559fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    if (s < 0 || connect(s, ai->ai_addr, ai->ai_addrlen) < 0)
12659fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      perror_exit("Socket error");
12759fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &(struct timeval){ .tv_sec = 5 },
12859fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      sizeof(struct timeval));
129e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    printf("Using domain server %s:\n", nsname);
130e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    send(s, qbuf, qlen, 0);
131e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    alen = recv(s, abuf, sizeof abuf, 0);
13259fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  } else alen = res_send(qbuf, qlen, abuf, sizeof abuf);
133e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
13459fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  if (alen < 12) error_exit("Host not found.");
135e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
136e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  rcode = abuf[3] & 15;
137e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
138e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  if (verbose) {
139e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    printf("rcode = %d (%s), ancount = %d\n",
140e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      rcode, rct[rcode], 256*abuf[6] + abuf[7]);
14159fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    if (!(abuf[2] & 4)) printf("The following answer is not authoritative:\n");
142e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  }
143e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
14459fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  if (rcode) error_exit("Host not found.");
145e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
146e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  p = abuf + 12;
147e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  for (sec=0; sec<4; sec++) {
148e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    count = 256*abuf[4+2*sec] + abuf[5+2*sec];
14959fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley    if (verbose && count>0 && sec>1)
150e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      puts(sec==2 ? "For authoritative answers, see:"
151e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        : "Additional information:");
15259fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley
153e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    for (; count--; p += pllen) {
15459fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      p += dn_expand(abuf, abuf+alen, p, rrname, sizeof(rrname));
15559fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      type = (p[0]<<8) + p[1];
156e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      p += 4;
157e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      if (!sec) continue;
15859fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      ttl = (p[0]<<24)+(p[1]<<16)+(p[2]<<8)+p[3];
159e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      p += 4;
16059fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      pllen = (p[0]<<8) + p[1];
161e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      p += 2;
16259fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley
16359fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      switch (type<sizeof(rrt)/sizeof(*rrt) ? rrt[type].pl : 0) {
164e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      case PL_IP:
165e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        inet_ntop(rrt[type].af, p, plname, sizeof plname);
166e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        break;
167e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      case PL_NAME:
168e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        dn_expand(abuf, abuf+alen, p, plname, sizeof plname);
169e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        break;
170e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      case PL_TEXT:
171e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        snprintf(plname, sizeof plname, "\"%.*s\"", pllen, p);
172e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        break;
173e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      case PL_SOA:
174e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        i = dn_expand(abuf, abuf+alen, p, plname, sizeof plname - 1);
175e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        strcat(plname, " ");
176e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        i += dn_expand(abuf, abuf+alen, p+i, plname+strlen(plname),
17759fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley          sizeof(plname)-strlen(plname));
178e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        for (j=0; j<5; j++)
17959fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley          v[j] = (p[i+4*j]<<24)+(p[1+i+4*j]<<16)+(p[2+i+4*j]<<8)+p[3+i+4*j];
18059fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley        snprintf(plname+strlen(plname), sizeof(plname)-strlen(plname),
181c421b7068c5dd95baa10f9bd97e578d04ba48c70Rob Landley          "(\n\t\t%u\t;serial (version)\n"
182c421b7068c5dd95baa10f9bd97e578d04ba48c70Rob Landley          "\t\t%u\t;refresh period\n"
183c421b7068c5dd95baa10f9bd97e578d04ba48c70Rob Landley          "\t\t%u\t;retry interval\n"
184c421b7068c5dd95baa10f9bd97e578d04ba48c70Rob Landley          "\t\t%u\t;expire time\n"
185c421b7068c5dd95baa10f9bd97e578d04ba48c70Rob Landley          "\t\t%u\t;default ttl\n"
186e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley          "\t\t)", v[0], v[1], v[2], v[3], v[4]);
187e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        break;
188e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      case PL_MX:
18959fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley        pri = (p[0]<<8)+p[1];
19059fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley        snprintf(plname, sizeof(plname), verbose ? "%d " : "(pri=%d) by ", pri);
19159fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley        dn_expand(abuf, abuf+alen, p+2, plname+strlen(plname),
192e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley          sizeof plname - strlen(plname));
193e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        break;
194e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      case PL_SRV:
19559fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley        for (j=0; j<3; j++) v[j] = (p[2*j]<<8) + p[1+2*j];
19659fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley        snprintf(plname, sizeof(plname), "%u %u %u ", v[0], v[1], v[2]);
19759fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley        dn_expand(abuf, abuf+alen, p+6, plname+strlen(plname),
198e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley          sizeof plname - strlen(plname));
199e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        break;
200e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      default:
201e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        printf("%s unsupported RR type %u\n", rrname, type);
202e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        continue;
203e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley      }
20459fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley
20559fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      if (verbose)
20659fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley        printf("%s\t%u\tIN %s\t%s\n", rrname, ttl, rrt[type].name, plname);
20759fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley      else if (rrt[type].msg)
208e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley        printf("%s %s %s\n", rrname, rrt[type].msg, plname);
209e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    }
210e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley    if (!verbose && sec==1) break;
211e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley  }
212e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley
21359fa8b4f48818f5a4f634633b48440ed3a466c8aRob Landley  toys.exitval = rcode;
214e266735d08ccf6cac442ac4e6e0defcd05fdea7aRob Landley}
215