2 * Copyright (c) 2006-2007 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.
22 readname_loop(char *packet, int packetlen, char **src, char *dst, size_t length, size_t loop)
37 while(*s && len < length - 2) {
40 /* is this a compressed label? */
41 if((c & 0xc0) == 0xc0) {
42 offset = (((s[-1] & 0x3f) << 8) | (s[0] & 0xff));
43 if (offset > packetlen) {
45 /* Bad jump first in packet */
48 /* Bad jump after some data */
52 dummy = packet + offset;
53 len += readname_loop(packet, packetlen, &dummy, d, length - len, loop - 1);
57 while(c && len < length - 1) {
64 if (len >= length - 1) {
65 break; /* We used up all space */
81 readname(char *packet, int packetlen, char **src, char *dst, size_t length)
83 return readname_loop(packet, packetlen, src, dst, length, 10);
87 readshort(char *packet, char **src, short *dst)
91 p = (unsigned char *) *src;
92 *dst = (p[0] << 8) | p[1];
94 (*src) += sizeof(short);
99 readlong(char *packet, char **src, uint32_t *dst)
101 /* A long as described in dns protocol is always 32 bits */
104 p = (unsigned char *) *src;
106 *dst = ((uint32_t)p[0] << 24)
107 | ((uint32_t)p[1] << 16)
108 | ((uint32_t)p[2] << 8)
111 (*src) += sizeof(uint32_t);
112 return sizeof(uint32_t);
116 readdata(char *packet, char **src, char *dst, size_t len)
121 memcpy(dst, *src, len);
129 putname(char **buf, size_t buflen, const char *host)
140 word = strtok(h, ".");
142 if (strlen(word) > 63 || strlen(word) > left) {
147 left -= (strlen(word) + 1);
148 *p++ = (char)strlen(word);
149 memcpy(p, word, strlen(word));
152 word = strtok(NULL, ".");
160 return buflen - left;
164 putbyte(char **dst, unsigned char value)
173 putshort(char **dst, unsigned short value)
177 p = (unsigned char *) *dst;
183 return sizeof(short);
187 putlong(char **dst, uint32_t value)
189 /* A long as described in dns protocol is always 32 bits */
192 p = (unsigned char *) *dst;
194 *p++ = (value >> 24);
195 *p++ = (value >> 16);
200 return sizeof(uint32_t);
204 putdata(char **dst, char *data, size_t len)
209 memcpy(*dst, data, len);