2 * Copyright (c) 2006 Bjorn Andersson <flex@kryo.se>, Erik Ekman <yarrick@kryo.se>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 readname_loop(char *packet, int packetlen, char **src, char *dst, size_t length, size_t loop)
36 while(*s && len < length - 2) {
39 /* is this a compressed label? */
40 if((c & 0xc0) == 0xc0) {
41 offset = (((s[-1] & 0x3f) << 8) | (s[0] & 0xff));
42 if (offset > packetlen) {
44 // Bad jump first in packet
47 // Bad jump after some data
51 dummy = packet + offset;
52 len += readname_loop(packet, packetlen, &dummy, d, length - len, loop - 1);
56 while(c && len < length - 1) {
63 if (len >= length - 1) {
64 break; /* We used up all space */
80 readname(char *packet, int packetlen, char **src, char *dst, size_t length)
82 return readname_loop(packet, packetlen, src, dst, length, 10);
86 readshort(char *packet, char **src, short *dst)
91 *dst = (p[0] << 8) | p[1];
93 (*src) += sizeof(short);
98 readlong(char *packet, char **src, uint32_t *dst)
100 // A long as described in dns protocol is always 32 bits
105 *dst = ((uint32_t)p[0] << 24)
106 | ((uint32_t)p[1] << 16)
107 | ((uint32_t)p[2] << 8)
110 (*src) += sizeof(uint32_t);
111 return sizeof(uint32_t);
115 readdata(char *packet, char **src, char *dst, size_t len)
120 memcpy(dst, *src, len);
128 putbyte(char **dst, char value)
137 putshort(char **dst, short value)
147 return sizeof(short);
151 putlong(char **dst, uint32_t value)
153 // A long as described in dns protocol is always 32 bits
158 *p++ = (value >> 24);
159 *p++ = (value >> 16);
164 return sizeof(uint32_t);
168 putdata(char **dst, char *data, size_t len)
173 memcpy(*dst, data, len);