|
|
1.1 ! root 1: /* ! 2: ******************************************************************************* ! 3: * ! 4: * skip.c -- ! 5: * ! 6: * Routines to skip over portions of a query buffer. ! 7: * ! 8: * Note: this file has been submitted for inclusion in ! 9: * BIND resolver library. When this has been done, this file ! 10: * is no longer necessary (assuming there haven't been any ! 11: * changes). ! 12: * ! 13: * Adapted from 4.3BSD BIND res_debug.c ! 14: * ! 15: * Copyright (c) 1985 Regents of the University of California. ! 16: * All rights reserved. The Berkeley software License Agreement ! 17: * specifies the terms and conditions for redistribution. ! 18: * ! 19: ******************************************************************************* ! 20: */ ! 21: ! 22: #ifndef lint ! 23: static char sccsid[] = "@(#)skip.c 5.1 (Berkeley) 11/29/85"; ! 24: #endif not lint ! 25: ! 26: #include <sys/types.h> ! 27: #include <netinet/in.h> ! 28: #include <stdio.h> ! 29: #include <arpa/nameser.h> ! 30: ! 31: char *res_skip_rr(); ! 32: ! 33: ! 34: /* ! 35: ******************************************************************************* ! 36: * ! 37: * res_skip -- ! 38: * ! 39: * Skip the contents of a query. ! 40: * ! 41: * Interpretation of numFieldsToSkip argument: ! 42: * res_skip returns pointer to: ! 43: * 1 -> start of question records. ! 44: * 2 -> start of authoritative answer records. ! 45: * 3 -> start of additional records. ! 46: * 4 -> first byte after end of additional records. ! 47: * ! 48: * Results: ! 49: * (address) - success operation. ! 50: * NULL - a resource record had an incorrect format. ! 51: * ! 52: ******************************************************************************* ! 53: */ ! 54: ! 55: char * ! 56: res_skip(msg, numFieldsToSkip) ! 57: char *msg; ! 58: int numFieldsToSkip; ! 59: { ! 60: register char *cp; ! 61: register HEADER *hp; ! 62: register int tmp; ! 63: register int n; ! 64: ! 65: /* ! 66: * Skip the header fields. ! 67: */ ! 68: hp = (HEADER *)msg; ! 69: cp = msg + sizeof(HEADER); ! 70: ! 71: /* ! 72: * skip question records. ! 73: */ ! 74: if (n = ntohs(hp->qdcount) ) { ! 75: while (--n >= 0) { ! 76: tmp = dn_skip(cp); ! 77: if (tmp == -1) return(NULL); ! 78: cp += tmp; ! 79: cp += sizeof(u_short); /* type */ ! 80: cp += sizeof(u_short); /* class */ ! 81: } ! 82: } ! 83: if (--numFieldsToSkip <= 0) return(cp); ! 84: ! 85: /* ! 86: * skip authoritative answer records ! 87: */ ! 88: if (n = ntohs(hp->ancount)) { ! 89: while (--n >= 0) { ! 90: cp = res_skip_rr(cp); ! 91: if (cp == NULL) return(NULL); ! 92: } ! 93: } ! 94: if (--numFieldsToSkip == 0) return(cp); ! 95: ! 96: /* ! 97: * skip name server records ! 98: */ ! 99: if (n = ntohs(hp->nscount)) { ! 100: while (--n >= 0) { ! 101: cp = res_skip_rr(cp); ! 102: if (cp == NULL) return(NULL); ! 103: } ! 104: } ! 105: if (--numFieldsToSkip == 0) return(cp); ! 106: ! 107: /* ! 108: * skip additional records ! 109: */ ! 110: if (n = ntohs(hp->arcount)) { ! 111: while (--n >= 0) { ! 112: cp = res_skip_rr(cp); ! 113: if (cp == NULL) return(NULL); ! 114: } ! 115: } ! 116: ! 117: return(cp); ! 118: } ! 119: ! 120: ! 121: /* ! 122: ******************************************************************************* ! 123: * ! 124: * res_skip_rr -- ! 125: * ! 126: * Skip over resource record fields. ! 127: * ! 128: * Results: ! 129: * (address) - success operation. ! 130: * NULL - a resource record had an incorrect format. ! 131: ******************************************************************************* ! 132: */ ! 133: ! 134: char * ! 135: res_skip_rr(cp) ! 136: char *cp; ! 137: { ! 138: int tmp; ! 139: int dlen; ! 140: ! 141: if ((tmp = dn_skip(cp)) == -1) ! 142: return (NULL); /* compression error */ ! 143: cp += tmp; ! 144: cp += sizeof(u_short); /* type */ ! 145: cp += sizeof(u_short); /* class */ ! 146: cp += sizeof(u_long); /* ttl */ ! 147: dlen = getshort(cp); ! 148: cp += sizeof(u_short); /* dlen */ ! 149: cp += dlen; ! 150: return (cp); ! 151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.