diff options
Diffstat (limited to 'src/lib/libc/net/res_debug.c')
| -rw-r--r-- | src/lib/libc/net/res_debug.c | 513 | 
1 files changed, 297 insertions, 216 deletions
| diff --git a/src/lib/libc/net/res_debug.c b/src/lib/libc/net/res_debug.c index d841293f18..14e5ddf790 100644 --- a/src/lib/libc/net/res_debug.c +++ b/src/lib/libc/net/res_debug.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $NetBSD: res_debug.c,v 1.7 1995/02/25 06:20:56 cgd Exp $ */ | 1 | /* $NetBSD: res_debug.c,v 1.8 1996/02/02 15:22:27 mrg Exp $ */ | 
| 2 | 2 | ||
| 3 | /*- | 3 | /*- | 
| 4 | * Copyright (c) 1985, 1990, 1993 | 4 | * Copyright (c) 1985, 1990, 1993 | 
| @@ -56,8 +56,9 @@ | |||
| 56 | #if defined(LIBC_SCCS) && !defined(lint) | 56 | #if defined(LIBC_SCCS) && !defined(lint) | 
| 57 | #if 0 | 57 | #if 0 | 
| 58 | static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; | 58 | static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; | 
| 59 | static char rcsid[] = "$Id: res_debug.c,v 8.7 1995/12/22 10:20:39 vixie Exp "; | ||
| 59 | #else | 60 | #else | 
| 60 | static char rcsid[] = "$NetBSD: res_debug.c,v 1.7 1995/02/25 06:20:56 cgd Exp $"; | 61 | static char rcsid[] = "$NetBSD: res_debug.c,v 1.8 1996/02/02 15:22:27 mrg Exp $"; | 
| 61 | #endif | 62 | #endif | 
| 62 | #endif /* LIBC_SCCS and not lint */ | 63 | #endif /* LIBC_SCCS and not lint */ | 
| 63 | 64 | ||
| @@ -68,18 +69,16 @@ static char rcsid[] = "$NetBSD: res_debug.c,v 1.7 1995/02/25 06:20:56 cgd Exp $" | |||
| 68 | #include <resolv.h> | 69 | #include <resolv.h> | 
| 69 | #include <stdio.h> | 70 | #include <stdio.h> | 
| 70 | #include <string.h> | 71 | #include <string.h> | 
| 72 | #include <netdb.h> | ||
| 71 | 73 | ||
| 72 | void __fp_query(); | 74 | void __fp_query(); | 
| 73 | char *__p_class(), *__p_time(), *__p_type(); | ||
| 74 | char *p_cdname(), *p_fqname(), *p_rr(); | ||
| 75 | static char *p_option __P((u_int32_t)); | ||
| 76 | 75 | ||
| 77 | char *_res_opcodes[] = { | 76 | char *_res_opcodes[] = { | 
| 78 | "QUERY", | 77 | "QUERY", | 
| 79 | "IQUERY", | 78 | "IQUERY", | 
| 80 | "CQUERYM", | 79 | "CQUERYM", | 
| 81 | "CQUERYU", | 80 | "CQUERYU", /* experimental */ | 
| 82 | "4", | 81 | "NOTIFY", /* experimental */ | 
| 83 | "5", | 82 | "5", | 
| 84 | "6", | 83 | "6", | 
| 85 | "7", | 84 | "7", | 
| @@ -112,102 +111,118 @@ char *_res_resultcodes[] = { | |||
| 112 | "NOCHANGE", | 111 | "NOCHANGE", | 
| 113 | }; | 112 | }; | 
| 114 | 113 | ||
| 115 | static char retbuf[16]; | ||
| 116 | |||
| 117 | static char * | 114 | static char * | 
| 118 | dewks(wks) | 115 | dewks(wks) | 
| 119 | int wks; | 116 | int wks; | 
| 120 | { | 117 | { | 
| 118 | static char nbuf[20]; | ||
| 119 | |||
| 121 | switch (wks) { | 120 | switch (wks) { | 
| 122 | case 5: return("rje"); | 121 | case 5: return "rje"; | 
| 123 | case 7: return("echo"); | 122 | case 7: return "echo"; | 
| 124 | case 9: return("discard"); | 123 | case 9: return "discard"; | 
| 125 | case 11: return("systat"); | 124 | case 11: return "systat"; | 
| 126 | case 13: return("daytime"); | 125 | case 13: return "daytime"; | 
| 127 | case 15: return("netstat"); | 126 | case 15: return "netstat"; | 
| 128 | case 17: return("qotd"); | 127 | case 17: return "qotd"; | 
| 129 | case 19: return("chargen"); | 128 | case 19: return "chargen"; | 
| 130 | case 20: return("ftp-data"); | 129 | case 20: return "ftp-data"; | 
| 131 | case 21: return("ftp"); | 130 | case 21: return "ftp"; | 
| 132 | case 23: return("telnet"); | 131 | case 23: return "telnet"; | 
| 133 | case 25: return("smtp"); | 132 | case 25: return "smtp"; | 
| 134 | case 37: return("time"); | 133 | case 37: return "time"; | 
| 135 | case 39: return("rlp"); | 134 | case 39: return "rlp"; | 
| 136 | case 42: return("name"); | 135 | case 42: return "name"; | 
| 137 | case 43: return("whois"); | 136 | case 43: return "whois"; | 
| 138 | case 53: return("domain"); | 137 | case 53: return "domain"; | 
| 139 | case 57: return("apts"); | 138 | case 57: return "apts"; | 
| 140 | case 59: return("apfs"); | 139 | case 59: return "apfs"; | 
| 141 | case 67: return("bootps"); | 140 | case 67: return "bootps"; | 
| 142 | case 68: return("bootpc"); | 141 | case 68: return "bootpc"; | 
| 143 | case 69: return("tftp"); | 142 | case 69: return "tftp"; | 
| 144 | case 77: return("rje"); | 143 | case 77: return "rje"; | 
| 145 | case 79: return("finger"); | 144 | case 79: return "finger"; | 
| 146 | case 87: return("link"); | 145 | case 87: return "link"; | 
| 147 | case 95: return("supdup"); | 146 | case 95: return "supdup"; | 
| 148 | case 100: return("newacct"); | 147 | case 100: return "newacct"; | 
| 149 | case 101: return("hostnames"); | 148 | case 101: return "hostnames"; | 
| 150 | case 102: return("iso-tsap"); | 149 | case 102: return "iso-tsap"; | 
| 151 | case 103: return("x400"); | 150 | case 103: return "x400"; | 
| 152 | case 104: return("x400-snd"); | 151 | case 104: return "x400-snd"; | 
| 153 | case 105: return("csnet-ns"); | 152 | case 105: return "csnet-ns"; | 
| 154 | case 109: return("pop-2"); | 153 | case 109: return "pop-2"; | 
| 155 | case 111: return("sunrpc"); | 154 | case 111: return "sunrpc"; | 
| 156 | case 113: return("auth"); | 155 | case 113: return "auth"; | 
| 157 | case 115: return("sftp"); | 156 | case 115: return "sftp"; | 
| 158 | case 117: return("uucp-path"); | 157 | case 117: return "uucp-path"; | 
| 159 | case 119: return("nntp"); | 158 | case 119: return "nntp"; | 
| 160 | case 121: return("erpc"); | 159 | case 121: return "erpc"; | 
| 161 | case 123: return("ntp"); | 160 | case 123: return "ntp"; | 
| 162 | case 133: return("statsrv"); | 161 | case 133: return "statsrv"; | 
| 163 | case 136: return("profile"); | 162 | case 136: return "profile"; | 
| 164 | case 144: return("NeWS"); | 163 | case 144: return "NeWS"; | 
| 165 | case 161: return("snmp"); | 164 | case 161: return "snmp"; | 
| 166 | case 162: return("snmp-trap"); | 165 | case 162: return "snmp-trap"; | 
| 167 | case 170: return("print-srv"); | 166 | case 170: return "print-srv"; | 
| 168 | default: (void) sprintf(retbuf, "%d", wks); return(retbuf); | 167 | default: (void) sprintf(nbuf, "%d", wks); return (nbuf); | 
| 169 | } | 168 | } | 
| 170 | } | 169 | } | 
| 171 | 170 | ||
| 172 | static char * | 171 | /* XXX: we should use getprotobynumber() instead. */ | 
| 172 | static const char * | ||
| 173 | deproto(protonum) | 173 | deproto(protonum) | 
| 174 | int protonum; | 174 | int protonum; | 
| 175 | { | 175 | { | 
| 176 | static char nbuf[20]; | ||
| 177 | |||
| 176 | switch (protonum) { | 178 | switch (protonum) { | 
| 177 | case 1: return("icmp"); | 179 | case 1: return "icmp"; | 
| 178 | case 2: return("igmp"); | 180 | case 2: return "igmp"; | 
| 179 | case 3: return("ggp"); | 181 | case 3: return "ggp"; | 
| 180 | case 5: return("st"); | 182 | case 5: return "st"; | 
| 181 | case 6: return("tcp"); | 183 | case 6: return "tcp"; | 
| 182 | case 7: return("ucl"); | 184 | case 7: return "ucl"; | 
| 183 | case 8: return("egp"); | 185 | case 8: return "egp"; | 
| 184 | case 9: return("igp"); | 186 | case 9: return "igp"; | 
| 185 | case 11: return("nvp-II"); | 187 | case 11: return "nvp-II"; | 
| 186 | case 12: return("pup"); | 188 | case 12: return "pup"; | 
| 187 | case 16: return("chaos"); | 189 | case 16: return "chaos"; | 
| 188 | case 17: return("udp"); | 190 | case 17: return "udp"; | 
| 189 | default: (void) sprintf(retbuf, "%d", protonum); return(retbuf); | 191 | default: (void) sprintf(nbuf, "%d", protonum); return (nbuf); | 
| 190 | } | 192 | } | 
| 191 | } | 193 | } | 
| 192 | 194 | ||
| 193 | static char * | 195 | static const u_char * | 
| 194 | do_rrset(msg, cp, cnt, pflag, file, hs) | 196 | do_rrset(msg, len, cp, cnt, pflag, file, hs) | 
| 195 | int cnt, pflag; | 197 | int cnt, pflag, len; | 
| 196 | char *cp,*msg, *hs; | 198 | const u_char *cp, *msg; | 
| 199 | const char *hs; | ||
| 197 | FILE *file; | 200 | FILE *file; | 
| 198 | { | 201 | { | 
| 199 | int n; | 202 | int n; | 
| 200 | int sflag; | 203 | int sflag; | 
| 204 | |||
| 201 | /* | 205 | /* | 
| 202 | * Print answer records | 206 | * Print answer records. | 
| 203 | */ | 207 | */ | 
| 204 | sflag = (_res.pfcode & pflag); | 208 | sflag = (_res.pfcode & pflag); | 
| 205 | if (n = ntohs(cnt)) { | 209 | if (n = ntohs(cnt)) { | 
| 206 | if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) | 210 | if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) | 
| 207 | fprintf(file, hs); | 211 | fprintf(file, hs); | 
| 208 | while (--n >= 0) { | 212 | while (--n >= 0) { | 
| 209 | cp = p_rr(cp, msg, file); | 213 | if ((!_res.pfcode) || sflag) { | 
| 210 | if ((cp-msg) > PACKETSZ) | 214 | cp = p_rr(cp, msg, file); | 
| 215 | } else { | ||
| 216 | unsigned int dlen; | ||
| 217 | cp += __dn_skipname(cp, cp + MAXCDNAME); | ||
| 218 | cp += sizeof(u_int16_t); | ||
| 219 | cp += sizeof(u_int16_t); | ||
| 220 | cp += sizeof(u_int32_t); | ||
| 221 | dlen = _getshort((u_char*)cp); | ||
| 222 | cp += sizeof(u_int16_t); | ||
| 223 | cp += dlen; | ||
| 224 | } | ||
| 225 | if ((cp - msg) > len) | ||
| 211 | return (NULL); | 226 | return (NULL); | 
| 212 | } | 227 | } | 
| 213 | if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) | 228 | if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) | 
| @@ -216,8 +231,9 @@ do_rrset(msg, cp, cnt, pflag, file, hs) | |||
| 216 | return(cp); | 231 | return(cp); | 
| 217 | } | 232 | } | 
| 218 | 233 | ||
| 234 | void | ||
| 219 | __p_query(msg) | 235 | __p_query(msg) | 
| 220 | char *msg; | 236 | const u_char *msg; | 
| 221 | { | 237 | { | 
| 222 | __fp_query(msg, stdout); | 238 | __fp_query(msg, stdout); | 
| 223 | } | 239 | } | 
| @@ -231,15 +247,14 @@ __fp_resstat(statp, file) | |||
| 231 | struct __res_state *statp; | 247 | struct __res_state *statp; | 
| 232 | FILE *file; | 248 | FILE *file; | 
| 233 | { | 249 | { | 
| 234 | int bit; | 250 | register u_long mask; | 
| 235 | 251 | ||
| 236 | fprintf(file, ";; res options:"); | 252 | fprintf(file, ";; res options:"); | 
| 237 | if (!statp) | 253 | if (!statp) | 
| 238 | statp = &_res; | 254 | statp = &_res; | 
| 239 | for (bit = 0; bit < 32; bit++) { /* XXX 32 - bad assumption! */ | 255 | for (mask = 1; mask != 0; mask <<= 1) | 
| 240 | if (statp->options & (1<<bit)) | 256 | if (statp->options & mask) | 
| 241 | fprintf(file, " %s", p_option(1<<bit)); | 257 | fprintf(file, " %s", p_option(mask)); | 
| 242 | } | ||
| 243 | putc('\n', file); | 258 | putc('\n', file); | 
| 244 | } | 259 | } | 
| 245 | 260 | ||
| @@ -248,19 +263,27 @@ __fp_resstat(statp, file) | |||
| 248 | * This is intended to be primarily a debugging routine. | 263 | * This is intended to be primarily a debugging routine. | 
| 249 | */ | 264 | */ | 
| 250 | void | 265 | void | 
| 251 | __fp_query(msg,file) | 266 | __fp_nquery(msg, len, file) | 
| 252 | char *msg; | 267 | const u_char *msg; | 
| 268 | int len; | ||
| 253 | FILE *file; | 269 | FILE *file; | 
| 254 | { | 270 | { | 
| 255 | register char *cp; | 271 | register const u_char *cp, *endMark; | 
| 256 | register HEADER *hp; | 272 | register const HEADER *hp; | 
| 257 | register int n; | 273 | register int n; | 
| 258 | 274 | ||
| 275 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) | ||
| 276 | return; | ||
| 277 | |||
| 278 | #define TruncTest(x) if (x >= endMark) goto trunc | ||
| 279 | #define ErrorTest(x) if (x == NULL) goto error | ||
| 280 | |||
| 259 | /* | 281 | /* | 
| 260 | * Print header fields. | 282 | * Print header fields. | 
| 261 | */ | 283 | */ | 
| 262 | hp = (HEADER *)msg; | 284 | hp = (HEADER *)msg; | 
| 263 | cp = msg + sizeof(HEADER); | 285 | cp = msg + HFIXEDSZ; | 
| 286 | endMark = cp + len; | ||
| 264 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX) || hp->rcode) { | 287 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX) || hp->rcode) { | 
| 265 | fprintf(file,";; ->>HEADER<<- opcode: %s, status: %s, id: %d", | 288 | fprintf(file,";; ->>HEADER<<- opcode: %s, status: %s, id: %d", | 
| 266 | _res_opcodes[hp->opcode], | 289 | _res_opcodes[hp->opcode], | 
| @@ -268,7 +291,8 @@ __fp_query(msg,file) | |||
| 268 | ntohs(hp->id)); | 291 | ntohs(hp->id)); | 
| 269 | putc('\n', file); | 292 | putc('\n', file); | 
| 270 | } | 293 | } | 
| 271 | putc(';', file); | 294 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX)) | 
| 295 | putc(';', file); | ||
| 272 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD2)) { | 296 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD2)) { | 
| 273 | fprintf(file,"; flags:"); | 297 | fprintf(file,"; flags:"); | 
| 274 | if (hp->qr) | 298 | if (hp->qr) | 
| @@ -281,20 +305,17 @@ __fp_query(msg,file) | |||
| 281 | fprintf(file," rd"); | 305 | fprintf(file," rd"); | 
| 282 | if (hp->ra) | 306 | if (hp->ra) | 
| 283 | fprintf(file," ra"); | 307 | fprintf(file," ra"); | 
| 284 | if (hp->pr) | ||
| 285 | fprintf(file," pr"); | ||
| 286 | } | 308 | } | 
| 287 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD1)) { | 309 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD1)) { | 
| 288 | fprintf(file,"; Ques: %d", ntohs(hp->qdcount)); | 310 | fprintf(file,"; Ques: %d", ntohs(hp->qdcount)); | 
| 289 | fprintf(file,", Ans: %d", ntohs(hp->ancount)); | 311 | fprintf(file,", Ans: %d", ntohs(hp->ancount)); | 
| 290 | fprintf(file,", Auth: %d", ntohs(hp->nscount)); | 312 | fprintf(file,", Auth: %d", ntohs(hp->nscount)); | 
| 291 | fprintf(file,", Addit: %d\n", ntohs(hp->arcount)); | 313 | fprintf(file, ", Addit: %d", ntohs(hp->arcount)); | 
| 292 | } | 314 | } | 
| 293 | #if 0 | 315 | if ((!_res.pfcode) || (_res.pfcode & | 
| 294 | if (_res.pfcode & (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1)) { | 316 | (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1))) { | 
| 295 | putc('\n',file); | 317 | putc('\n',file); | 
| 296 | } | 318 | } | 
| 297 | #endif | ||
| 298 | /* | 319 | /* | 
| 299 | * Print question records. | 320 | * Print question records. | 
| 300 | */ | 321 | */ | 
| @@ -302,55 +323,85 @@ __fp_query(msg,file) | |||
| 302 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 323 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 
| 303 | fprintf(file,";; QUESTIONS:\n"); | 324 | fprintf(file,";; QUESTIONS:\n"); | 
| 304 | while (--n >= 0) { | 325 | while (--n >= 0) { | 
| 326 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | ||
| 305 | fprintf(file,";;\t"); | 327 | fprintf(file,";;\t"); | 
| 306 | cp = p_cdname(cp, msg, file); | 328 | TruncTest(cp); | 
| 307 | if (cp == NULL) | 329 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 
| 308 | return; | 330 | cp = p_cdnname(cp, msg, len, file); | 
| 331 | else { | ||
| 332 | int n; | ||
| 333 | char name[MAXDNAME]; | ||
| 334 | |||
| 335 | if ((n = dn_expand(msg, msg+len, cp, name, | ||
| 336 | sizeof name)) < 0) | ||
| 337 | cp = NULL; | ||
| 338 | else | ||
| 339 | cp += n; | ||
| 340 | } | ||
| 341 | ErrorTest(cp); | ||
| 342 | TruncTest(cp); | ||
| 309 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 343 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 
| 310 | fprintf(file, ", type = %s", | 344 | fprintf(file, ", type = %s", | 
| 311 | __p_type(_getshort(cp))); | 345 | __p_type(_getshort((u_char*)cp))); | 
| 312 | cp += sizeof(u_int16_t); | 346 | cp += INT16SZ; | 
| 347 | TruncTest(cp); | ||
| 313 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 348 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 
| 314 | fprintf(file, ", class = %s\n\n", | 349 | fprintf(file, ", class = %s\n", | 
| 315 | __p_class(_getshort(cp))); | 350 | __p_class(_getshort((u_char*)cp))); | 
| 316 | cp += sizeof(u_int16_t); | 351 | cp += INT16SZ; | 
| 352 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | ||
| 353 | putc('\n', file); | ||
| 317 | } | 354 | } | 
| 318 | } | 355 | } | 
| 319 | /* | 356 | /* | 
| 320 | * Print authoritative answer records | 357 | * Print authoritative answer records | 
| 321 | */ | 358 | */ | 
| 322 | cp = do_rrset(msg, cp, hp->ancount, RES_PRF_ANS, file, | 359 | TruncTest(cp); | 
| 360 | cp = do_rrset(msg, len, cp, hp->ancount, RES_PRF_ANS, file, | ||
| 323 | ";; ANSWERS:\n"); | 361 | ";; ANSWERS:\n"); | 
| 324 | if (cp == NULL) | 362 | ErrorTest(cp); | 
| 325 | return; | ||
| 326 | 363 | ||
| 327 | /* | 364 | /* | 
| 328 | * print name server records | 365 | * print name server records | 
| 329 | */ | 366 | */ | 
| 330 | cp = do_rrset(msg, cp, hp->nscount, RES_PRF_AUTH, file, | 367 | TruncTest(cp); | 
| 368 | cp = do_rrset(msg, len, cp, hp->nscount, RES_PRF_AUTH, file, | ||
| 331 | ";; AUTHORITY RECORDS:\n"); | 369 | ";; AUTHORITY RECORDS:\n"); | 
| 332 | if (!cp) | 370 | ErrorTest(cp); | 
| 333 | return; | ||
| 334 | 371 | ||
| 372 | TruncTest(cp); | ||
| 335 | /* | 373 | /* | 
| 336 | * print additional records | 374 | * print additional records | 
| 337 | */ | 375 | */ | 
| 338 | cp = do_rrset(msg, cp, hp->arcount, RES_PRF_ADD, file, | 376 | cp = do_rrset(msg, len, cp, hp->arcount, RES_PRF_ADD, file, | 
| 339 | ";; ADDITIONAL RECORDS:\n"); | 377 | ";; ADDITIONAL RECORDS:\n"); | 
| 340 | if (!cp) | 378 | ErrorTest(cp); | 
| 379 | return; | ||
| 380 | trunc: | ||
| 381 | fprintf(file, "\n;; ...truncated\n"); | ||
| 341 | return; | 382 | return; | 
| 383 | error: | ||
| 384 | fprintf(file, "\n;; ...malformed\n"); | ||
| 342 | } | 385 | } | 
| 343 | 386 | ||
| 344 | char * | 387 | void | 
| 345 | p_cdname(cp, msg, file) | 388 | __fp_query(msg, file) | 
| 346 | char *cp, *msg; | 389 | const u_char *msg; | 
| 390 | FILE *file; | ||
| 391 | { | ||
| 392 | fp_nquery(msg, PACKETSZ, file); | ||
| 393 | } | ||
| 394 | |||
| 395 | const u_char * | ||
| 396 | __p_cdnname(cp, msg, len, file) | ||
| 397 | const u_char *cp, *msg; | ||
| 398 | int len; | ||
| 347 | FILE *file; | 399 | FILE *file; | 
| 348 | { | 400 | { | 
| 349 | char name[MAXDNAME]; | 401 | char name[MAXDNAME]; | 
| 350 | int n; | 402 | int n; | 
| 351 | 403 | ||
| 352 | if ((n = dn_expand((u_char *)msg, (u_char *)cp + MAXCDNAME, | 404 | if ((n = dn_expand(msg, msg + len, cp, name, sizeof name)) < 0) | 
| 353 | (u_char *)cp, (u_char *)name, sizeof(name))) < 0) | ||
| 354 | return (NULL); | 405 | return (NULL); | 
| 355 | if (name[0] == '\0') | 406 | if (name[0] == '\0') | 
| 356 | putc('.', file); | 407 | putc('.', file); | 
| @@ -359,16 +410,26 @@ p_cdname(cp, msg, file) | |||
| 359 | return (cp + n); | 410 | return (cp + n); | 
| 360 | } | 411 | } | 
| 361 | 412 | ||
| 362 | char * | 413 | const u_char * | 
| 363 | p_fqname(cp, msg, file) | 414 | __p_cdname(cp, msg, file) | 
| 364 | char *cp, *msg; | 415 | const u_char *cp, *msg; | 
| 416 | FILE *file; | ||
| 417 | { | ||
| 418 | return (p_cdnname(cp, msg, PACKETSZ, file)); | ||
| 419 | } | ||
| 420 | |||
| 421 | /* XXX: the rest of these functions need to become length-limited, too. (vix) | ||
| 422 | */ | ||
| 423 | |||
| 424 | const u_char * | ||
| 425 | __p_fqname(cp, msg, file) | ||
| 426 | const u_char *cp, *msg; | ||
| 365 | FILE *file; | 427 | FILE *file; | 
| 366 | { | 428 | { | 
| 367 | char name[MAXDNAME]; | 429 | char name[MAXDNAME]; | 
| 368 | int n, len; | 430 | int n; | 
| 369 | 431 | ||
| 370 | if ((n = dn_expand((u_char *)msg, (u_char *)cp + MAXCDNAME, | 432 | if ((n = dn_expand(msg, cp + MAXCDNAME, cp, name, sizeof name)) < 0) | 
| 371 | (u_char *)cp, (u_char *)name, sizeof(name))) < 0) | ||
| 372 | return (NULL); | 433 | return (NULL); | 
| 373 | if (name[0] == '\0') { | 434 | if (name[0] == '\0') { | 
| 374 | putc('.', file); | 435 | putc('.', file); | 
| @@ -383,17 +444,21 @@ p_fqname(cp, msg, file) | |||
| 383 | /* | 444 | /* | 
| 384 | * Print resource record fields in human readable form. | 445 | * Print resource record fields in human readable form. | 
| 385 | */ | 446 | */ | 
| 386 | char * | 447 | const u_char * | 
| 387 | p_rr(cp, msg, file) | 448 | __p_rr(cp, msg, file) | 
| 388 | char *cp, *msg; | 449 | const u_char *cp, *msg; | 
| 389 | FILE *file; | 450 | FILE *file; | 
| 390 | { | 451 | { | 
| 391 | int type, class, dlen, n, c; | 452 | int type, class, dlen, n, c; | 
| 392 | struct in_addr inaddr; | 453 | struct in_addr inaddr; | 
| 393 | char *cp1, *cp2; | 454 | const u_char *cp1, *cp2; | 
| 394 | u_int32_t tmpttl, t; | 455 | u_int32_t tmpttl, t; | 
| 395 | int lcnt; | 456 | int lcnt; | 
| 396 | 457 | ||
| 458 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) { | ||
| 459 | h_errno = NETDB_INTERNAL; | ||
| 460 | return (NULL); | ||
| 461 | } | ||
| 397 | if ((cp = p_fqname(cp, msg, file)) == NULL) | 462 | if ((cp = p_fqname(cp, msg, file)) == NULL) | 
| 398 | return (NULL); /* compression error */ | 463 | return (NULL); /* compression error */ | 
| 399 | type = _getshort(cp); | 464 | type = _getshort(cp); | 
| @@ -406,7 +471,7 @@ p_rr(cp, msg, file) | |||
| 406 | cp += sizeof(u_int16_t); | 471 | cp += sizeof(u_int16_t); | 
| 407 | cp1 = cp; | 472 | cp1 = cp; | 
| 408 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_TTLID)) | 473 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_TTLID)) | 
| 409 | fprintf(file, "\t%lu", tmpttl); | 474 | fprintf(file, "\t%lu", (u_long)tmpttl); | 
| 410 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_CLASS)) | 475 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_CLASS)) | 
| 411 | fprintf(file, "\t%s", __p_class(class)); | 476 | fprintf(file, "\t%s", __p_class(class)); | 
| 412 | fprintf(file, "\t%s", __p_type(type)); | 477 | fprintf(file, "\t%s", __p_type(type)); | 
| @@ -429,7 +494,7 @@ p_rr(cp, msg, file) | |||
| 429 | 494 | ||
| 430 | address = inet_ntoa(inaddr); | 495 | address = inet_ntoa(inaddr); | 
| 431 | cp += sizeof(inaddr); | 496 | cp += sizeof(inaddr); | 
| 432 | protocol = *(u_char*)cp; | 497 | protocol = *cp; | 
| 433 | cp += sizeof(u_char); | 498 | cp += sizeof(u_char); | 
| 434 | port = _getshort(cp); | 499 | port = _getshort(cp); | 
| 435 | cp += sizeof(u_int16_t); | 500 | cp += sizeof(u_int16_t); | 
| @@ -448,52 +513,75 @@ p_rr(cp, msg, file) | |||
| 448 | case T_NS: | 513 | case T_NS: | 
| 449 | case T_PTR: | 514 | case T_PTR: | 
| 450 | putc('\t', file); | 515 | putc('\t', file); | 
| 451 | cp = p_fqname(cp, msg, file); | 516 | if ((cp = p_fqname(cp, msg, file)) == NULL) | 
| 517 | return (NULL); | ||
| 452 | break; | 518 | break; | 
| 453 | 519 | ||
| 454 | case T_HINFO: | 520 | case T_HINFO: | 
| 521 | case T_ISDN: | ||
| 522 | cp2 = cp + dlen; | ||
| 455 | if (n = *cp++) { | 523 | if (n = *cp++) { | 
| 456 | fprintf(file,"\t%.*s", n, cp); | 524 | fprintf(file,"\t%.*s", n, cp); | 
| 457 | cp += n; | 525 | cp += n; | 
| 458 | } | 526 | } | 
| 459 | if (n = *cp++) { | 527 | if ((cp < cp2) && (n = *cp++)) { | 
| 460 | fprintf(file,"\t%.*s", n, cp); | 528 | fprintf(file,"\t%.*s", n, cp); | 
| 461 | cp += n; | 529 | cp += n; | 
| 462 | } | 530 | } else if (type == T_HINFO) | 
| 531 | fprintf(file, "\n;; *** Warning *** OS-type missing"); | ||
| 463 | break; | 532 | break; | 
| 464 | 533 | ||
| 465 | case T_SOA: | 534 | case T_SOA: | 
| 466 | putc('\t', file); | 535 | putc('\t', file); | 
| 467 | cp = p_fqname(cp, msg, file); /* origin */ | 536 | if ((cp = p_fqname(cp, msg, file)) == NULL) | 
| 537 | return (NULL); | ||
| 468 | putc(' ', file); | 538 | putc(' ', file); | 
| 469 | cp = p_fqname(cp, msg, file); /* mail addr */ | 539 | if ((cp = p_fqname(cp, msg, file)) == NULL) | 
| 540 | return (NULL); | ||
| 470 | fputs(" (\n", file); | 541 | fputs(" (\n", file); | 
| 471 | t = _getlong(cp); cp += sizeof(u_int32_t); | 542 | t = _getlong(cp); cp += sizeof(u_int32_t); | 
| 472 | fprintf(file,"\t\t\t%lu\t; serial\n", t); | 543 | fprintf(file, "\t\t\t%lu\t; serial\n", (u_long)t); | 
| 473 | t = _getlong(cp); cp += sizeof(u_int32_t); | 544 | t = _getlong(cp); cp += sizeof(u_int32_t); | 
| 474 | fprintf(file,"\t\t\t%lu\t; refresh (%s)\n", t, __p_time(t)); | 545 | fprintf(file, "\t\t\t%lu\t; refresh (%s)\n", | 
| 546 | (u_long)t, __p_time(t)); | ||
| 475 | t = _getlong(cp); cp += sizeof(u_int32_t); | 547 | t = _getlong(cp); cp += sizeof(u_int32_t); | 
| 476 | fprintf(file,"\t\t\t%lu\t; retry (%s)\n", t, __p_time(t)); | 548 | fprintf(file, "\t\t\t%lu\t; retry (%s)\n", | 
| 549 | (u_long)t, __p_time(t)); | ||
| 477 | t = _getlong(cp); cp += sizeof(u_int32_t); | 550 | t = _getlong(cp); cp += sizeof(u_int32_t); | 
| 478 | fprintf(file,"\t\t\t%lu\t; expire (%s)\n", t, __p_time(t)); | 551 | fprintf(file, "\t\t\t%lu\t; expire (%s)\n", | 
| 552 | (u_long)t, __p_time(t)); | ||
| 479 | t = _getlong(cp); cp += sizeof(u_int32_t); | 553 | t = _getlong(cp); cp += sizeof(u_int32_t); | 
| 480 | fprintf(file,"\t\t\t%lu )\t; minimum (%s)", t, __p_time(t)); | 554 | fprintf(file, "\t\t\t%lu )\t; minimum (%s)", | 
| 555 | (u_long)t, __p_time(t)); | ||
| 481 | break; | 556 | break; | 
| 482 | 557 | ||
| 483 | case T_MX: | 558 | case T_MX: | 
| 484 | case T_AFSDB: | 559 | case T_AFSDB: | 
| 485 | fprintf(file,"\t%d ", _getshort(cp)); | 560 | case T_RT: | 
| 486 | cp += sizeof(u_int16_t); | 561 | fprintf(file, "\t%d ", _getshort(cp)); | 
| 487 | cp = p_fqname(cp, msg, file); | 562 | cp += INT16SZ; | 
| 563 | if ((cp = p_fqname(cp, msg, file)) == NULL) | ||
| 564 | return (NULL); | ||
| 565 | break; | ||
| 566 | |||
| 567 | case T_PX: | ||
| 568 | fprintf(file, "\t%d ", _getshort(cp)); | ||
| 569 | cp += INT16SZ; | ||
| 570 | if ((cp = p_fqname(cp, msg, file)) == NULL) | ||
| 571 | return (NULL); | ||
| 572 | putc(' ', file); | ||
| 573 | if ((cp = p_fqname(cp, msg, file)) == NULL) | ||
| 574 | return (NULL); | ||
| 488 | break; | 575 | break; | 
| 489 | 576 | ||
| 490 | case T_TXT: | 577 | case T_TXT: | 
| 578 | case T_X25: | ||
| 491 | (void) fputs("\t\"", file); | 579 | (void) fputs("\t\"", file); | 
| 492 | cp2 = cp1 + dlen; | 580 | cp2 = cp1 + dlen; | 
| 493 | while (cp < cp2) { | 581 | while (cp < cp2) { | 
| 494 | if (n = (unsigned char) *cp++) { | 582 | if (n = (unsigned char) *cp++) { | 
| 495 | for (c = n; c > 0 && cp < cp2; c--) | 583 | for (c = n; c > 0 && cp < cp2; c--) | 
| 496 | if (*cp == '\n') { | 584 | if ((*cp == '\n') || (*cp == '"')) { | 
| 497 | (void) putc('\\', file); | 585 | (void) putc('\\', file); | 
| 498 | (void) putc(*cp++, file); | 586 | (void) putc(*cp++, file); | 
| 499 | } else | 587 | } else | 
| @@ -503,12 +591,19 @@ p_rr(cp, msg, file) | |||
| 503 | putc('"', file); | 591 | putc('"', file); | 
| 504 | break; | 592 | break; | 
| 505 | 593 | ||
| 594 | case T_NSAP: | ||
| 595 | (void) fprintf(file, "\t%s", inet_nsap_ntoa(dlen, cp, NULL)); | ||
| 596 | cp += dlen; | ||
| 597 | break; | ||
| 598 | |||
| 506 | case T_MINFO: | 599 | case T_MINFO: | 
| 507 | case T_RP: | 600 | case T_RP: | 
| 508 | putc('\t', file); | 601 | putc('\t', file); | 
| 509 | cp = p_fqname(cp, msg, file); | 602 | if ((cp = p_fqname(cp, msg, file)) == NULL) | 
| 603 | return (NULL); | ||
| 510 | putc(' ', file); | 604 | putc(' ', file); | 
| 511 | cp = p_fqname(cp, msg, file); | 605 | if ((cp = p_fqname(cp, msg, file)) == NULL) | 
| 606 | return (NULL); | ||
| 512 | break; | 607 | break; | 
| 513 | 608 | ||
| 514 | case T_UINFO: | 609 | case T_UINFO: | 
| @@ -558,7 +653,7 @@ p_rr(cp, msg, file) | |||
| 558 | case T_UNSPEC: | 653 | case T_UNSPEC: | 
| 559 | { | 654 | { | 
| 560 | int NumBytes = 8; | 655 | int NumBytes = 8; | 
| 561 | char *DataPtr; | 656 | u_char *DataPtr; | 
| 562 | int i; | 657 | int i; | 
| 563 | 658 | ||
| 564 | if (dlen < NumBytes) NumBytes = dlen; | 659 | if (dlen < NumBytes) NumBytes = dlen; | 
| @@ -588,113 +683,98 @@ p_rr(cp, msg, file) | |||
| 588 | return (cp); | 683 | return (cp); | 
| 589 | } | 684 | } | 
| 590 | 685 | ||
| 591 | static char nbuf[40]; | ||
| 592 | |||
| 593 | /* | 686 | /* | 
| 594 | * Return a string for the type | 687 | * Return a string for the type | 
| 595 | */ | 688 | */ | 
| 596 | char * | 689 | const char * | 
| 597 | __p_type(type) | 690 | __p_type(type) | 
| 598 | int type; | 691 | int type; | 
| 599 | { | 692 | { | 
| 693 | static char nbuf[20]; | ||
| 694 | |||
| 600 | switch (type) { | 695 | switch (type) { | 
| 601 | case T_A: | 696 | case T_A: return "A"; | 
| 602 | return("A"); | 697 | case T_NS: return "NS"; | 
| 603 | case T_NS: /* authoritative server */ | 698 | case T_CNAME: return "CNAME"; | 
| 604 | return("NS"); | 699 | case T_SOA: return "SOA"; | 
| 605 | case T_CNAME: /* canonical name */ | 700 | case T_MB: return "MB"; | 
| 606 | return("CNAME"); | 701 | case T_MG: return "MG"; | 
| 607 | case T_SOA: /* start of authority zone */ | 702 | case T_MR: return "MR"; | 
| 608 | return("SOA"); | 703 | case T_NULL: return "NULL"; | 
| 609 | case T_MB: /* mailbox domain name */ | 704 | case T_WKS: return "WKS"; | 
| 610 | return("MB"); | 705 | case T_PTR: return "PTR"; | 
| 611 | case T_MG: /* mail group member */ | 706 | case T_HINFO: return "HINFO"; | 
| 612 | return("MG"); | 707 | case T_MINFO: return "MINFO"; | 
| 613 | case T_MR: /* mail rename name */ | 708 | case T_MX: return "MX"; | 
| 614 | return("MR"); | 709 | case T_TXT: return "TXT"; | 
| 615 | case T_NULL: /* null resource record */ | 710 | case T_RP: return "RP"; | 
| 616 | return("NULL"); | 711 | case T_AFSDB: return "AFSDB"; | 
| 617 | case T_WKS: /* well known service */ | 712 | case T_X25: return "X25"; | 
| 618 | return("WKS"); | 713 | case T_ISDN: return "ISDN"; | 
| 619 | case T_PTR: /* domain name pointer */ | 714 | case T_RT: return "RT"; | 
| 620 | return("PTR"); | 715 | case T_NSAP: return "NSAP"; | 
| 621 | case T_HINFO: /* host information */ | 716 | case T_NSAP_PTR: return "NSAP_PTR"; | 
| 622 | return("HINFO"); | 717 | case T_SIG: return "SIG"; | 
| 623 | case T_MINFO: /* mailbox information */ | 718 | case T_KEY: return "KEY"; | 
| 624 | return("MINFO"); | 719 | case T_PX: return "PX"; | 
| 625 | case T_MX: /* mail routing info */ | 720 | case T_GPOS: return "GPOS"; | 
| 626 | return("MX"); | 721 | case T_AAAA: return "AAAA"; | 
| 627 | case T_TXT: /* text */ | 722 | case T_LOC: return "LOC"; | 
| 628 | return("TXT"); | 723 | case T_AXFR: return "AXFR"; | 
| 629 | case T_RP: /* responsible person */ | 724 | case T_MAILB: return "MAILB"; | 
| 630 | return("RP"); | 725 | case T_MAILA: return "MAILA"; | 
| 631 | case T_AFSDB: /* AFS cell database */ | 726 | case T_ANY: return "ANY"; | 
| 632 | return("AFSDB"); | 727 | case T_UINFO: return "UINFO"; | 
| 633 | case T_AXFR: /* zone transfer */ | 728 | case T_UID: return "UID"; | 
| 634 | return("AXFR"); | 729 | case T_GID: return "GID"; | 
| 635 | case T_MAILB: /* mail box */ | ||
| 636 | return("MAILB"); | ||
| 637 | case T_MAILA: /* mail address */ | ||
| 638 | return("MAILA"); | ||
| 639 | case T_ANY: /* matches any type */ | ||
| 640 | return("ANY"); | ||
| 641 | case T_UINFO: | ||
| 642 | return("UINFO"); | ||
| 643 | case T_UID: | ||
| 644 | return("UID"); | ||
| 645 | case T_GID: | ||
| 646 | return("GID"); | ||
| 647 | #ifdef ALLOW_T_UNSPEC | 730 | #ifdef ALLOW_T_UNSPEC | 
| 648 | case T_UNSPEC: | 731 | case T_UNSPEC: return "UNSPEC"; | 
| 649 | return("UNSPEC"); | ||
| 650 | #endif /* ALLOW_T_UNSPEC */ | 732 | #endif /* ALLOW_T_UNSPEC */ | 
| 651 | 733 | default: (void)sprintf(nbuf, "%d", type); return (nbuf); | |
| 652 | default: | ||
| 653 | (void)sprintf(nbuf, "%d", type); | ||
| 654 | return(nbuf); | ||
| 655 | } | 734 | } | 
| 656 | } | 735 | } | 
| 657 | 736 | ||
| 658 | /* | 737 | /* | 
| 659 | * Return a mnemonic for class | 738 | * Return a mnemonic for class | 
| 660 | */ | 739 | */ | 
| 661 | char * | 740 | const char * | 
| 662 | __p_class(class) | 741 | __p_class(class) | 
| 663 | int class; | 742 | int class; | 
| 664 | { | 743 | { | 
| 744 | static char nbuf[20]; | ||
| 665 | 745 | ||
| 666 | switch (class) { | 746 | switch (class) { | 
| 667 | case C_IN: /* internet class */ | 747 | case C_IN: return "IN"; | 
| 668 | return("IN"); | 748 | case C_HS: return "HS"; | 
| 669 | case C_HS: /* hesiod class */ | 749 | case C_ANY: return "ANY"; | 
| 670 | return("HS"); | 750 | default: (void)sprintf(nbuf, "%d", class); return (nbuf); | 
| 671 | case C_ANY: /* matches any class */ | ||
| 672 | return("ANY"); | ||
| 673 | default: | ||
| 674 | (void)sprintf(nbuf, "%d", class); | ||
| 675 | return(nbuf); | ||
| 676 | } | 751 | } | 
| 677 | } | 752 | } | 
| 678 | 753 | ||
| 679 | /* | 754 | /* | 
| 680 | * Return a mnemonic for an option | 755 | * Return a mnemonic for an option | 
| 681 | */ | 756 | */ | 
| 682 | static char * | 757 | const char * | 
| 683 | p_option(option) | 758 | __p_option(option) | 
| 684 | u_int32_t option; | 759 | u_long option; | 
| 685 | { | 760 | { | 
| 761 | static char nbuf[40]; | ||
| 762 | |||
| 686 | switch (option) { | 763 | switch (option) { | 
| 687 | case RES_INIT: return "init"; | 764 | case RES_INIT: return "init"; | 
| 688 | case RES_DEBUG: return "debug"; | 765 | case RES_DEBUG: return "debug"; | 
| 689 | case RES_AAONLY: return "aaonly"; | 766 | case RES_AAONLY: return "aaonly(unimpl)"; | 
| 690 | case RES_USEVC: return "usevc"; | 767 | case RES_USEVC: return "usevc"; | 
| 691 | case RES_PRIMARY: return "primry"; | 768 | case RES_PRIMARY: return "primry(unimpl)"; | 
| 692 | case RES_IGNTC: return "igntc"; | 769 | case RES_IGNTC: return "igntc"; | 
| 693 | case RES_RECURSE: return "recurs"; | 770 | case RES_RECURSE: return "recurs"; | 
| 694 | case RES_DEFNAMES: return "defnam"; | 771 | case RES_DEFNAMES: return "defnam"; | 
| 695 | case RES_STAYOPEN: return "styopn"; | 772 | case RES_STAYOPEN: return "styopn"; | 
| 696 | case RES_DNSRCH: return "dnsrch"; | 773 | case RES_DNSRCH: return "dnsrch"; | 
| 697 | default: sprintf(nbuf, "?0x%x?", option); return nbuf; | 774 | case RES_INSECURE1: return "insecure1"; | 
| 775 | case RES_INSECURE2: return "insecure2"; | ||
| 776 | default: sprintf(nbuf, "?0x%lx?", (u_long)option); | ||
| 777 | return (nbuf); | ||
| 698 | } | 778 | } | 
| 699 | } | 779 | } | 
| 700 | 780 | ||
| @@ -705,6 +785,7 @@ char * | |||
| 705 | __p_time(value) | 785 | __p_time(value) | 
| 706 | u_int32_t value; | 786 | u_int32_t value; | 
| 707 | { | 787 | { | 
| 788 | static char nbuf[40]; | ||
| 708 | int secs, mins, hours, days; | 789 | int secs, mins, hours, days; | 
| 709 | register char *p; | 790 | register char *p; | 
| 710 | 791 | ||
