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