aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-10-18 18:41:19 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-10-18 18:41:19 +0000
commit13e485d648e02876be8ab5cf78b1c87430b04d4d (patch)
tree978e72049f3bfd22722bc518eee843fd94c948ae /src
parente7d61b1a418b271876e82a3693332559339e6189 (diff)
downloadgnunet-13e485d648e02876be8ab5cf78b1c87430b04d4d.tar.gz
gnunet-13e485d648e02876be8ab5cf78b1c87430b04d4d.zip
allow "unparsing" of dns-packets
Diffstat (limited to 'src')
-rw-r--r--src/vpn/gnunet-dns-parser.c112
-rw-r--r--src/vpn/gnunet-dns-parser.h3
2 files changed, 115 insertions, 0 deletions
diff --git a/src/vpn/gnunet-dns-parser.c b/src/vpn/gnunet-dns-parser.c
index df0e63ed7..31b0af1a7 100644
--- a/src/vpn/gnunet-dns-parser.c
+++ b/src/vpn/gnunet-dns-parser.c
@@ -135,6 +135,118 @@ parse_dns_packet (struct dns_pkt *pkt)
135 return ppkt; 135 return ppkt;
136} /*}}} */ 136} /*}}} */
137 137
138static void
139unparse_dns_name(char* dest, char* src, size_t len)
140{
141 char *b = dest;
142 char cnt = 0;
143 dest++;
144 while (*src != 0)
145 {
146 while (*src != '.' && *src != 0)
147 {
148 *dest = *src;
149 src++;
150 dest++;
151 cnt++;
152 }
153 *b = cnt;
154 cnt = 0;
155 b = dest;
156 dest++;
157 }
158 *b = 0;
159}
160
161struct dns_pkt *
162unparse_dns_packet (struct dns_pkt_parsed* ppkt)
163{
164 size_t size = sizeof(struct dns_pkt) - 1;
165 int i;
166 for (i = 0; i < ppkt->s.qdcount; i++)
167 size += ppkt->queries[i]->namelen + 1;
168
169 for (i = 0; i < ppkt->s.ancount; i++)
170 {
171 size += ppkt->answers[i]->namelen + 1;
172 size += ppkt->answers[i]->data_len;
173 }
174 for (i = 0; i < ppkt->s.nscount; i++)
175 {
176 size += ppkt->nameservers[i]->namelen + 1;
177 size += ppkt->nameservers[i]->data_len;
178 }
179 for (i = 0; i < ppkt->s.arcount; i++)
180 {
181 size += ppkt->additional[i]->namelen + 1;
182 size += ppkt->additional[i]->data_len;
183 }
184
185 size += 4*ppkt->s.qdcount + 10*(
186 ppkt->s.ancount+
187 ppkt->s.arcount+
188 ppkt->s.nscount);
189
190 struct dns_pkt *pkt = GNUNET_malloc(size);
191 char *pkt_c = (char*)pkt;
192 memcpy(&pkt->s, &ppkt->s, sizeof ppkt->s);
193 size_t idx = sizeof ppkt->s;
194
195 for (i = 0; i < ppkt->s.qdcount; i++)
196 {
197 unparse_dns_name(&pkt_c[idx], ppkt->queries[i]->name, ppkt->queries[i]->namelen);
198 idx += ppkt->queries[i]->namelen;
199 struct dns_query_line *d = (struct dns_query_line*)&pkt_c[idx];
200 d->class = ppkt->queries[i]->qclass;
201 d->type = ppkt->queries[i]->qtype;
202 idx += sizeof(struct dns_query_line);
203 }
204
205 for (i = 0; i < ppkt->s.ancount; i++)
206 {
207 unparse_dns_name(&pkt_c[idx], ppkt->answers[i]->name, ppkt->answers[i]->namelen);
208 idx += ppkt->answers[i]->namelen;
209 struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx];
210 r->type = ppkt->answers[i]->type;
211 r->class = ppkt->answers[i]->class;
212 r->ttl = ppkt->answers[i]->ttl;
213 r->data_len = ppkt->answers[i]->data_len;
214 idx += sizeof(struct dns_record_line);
215 memcpy(&r->data, ppkt->answers[i]->data, ppkt->answers[i]->data_len);
216 idx += ppkt->answers[i]->data_len;
217 }
218
219 for (i = 0; i < ppkt->s.nscount; i++)
220 {
221 unparse_dns_name(&pkt_c[idx], ppkt->nameservers[i]->name, ppkt->nameservers[i]->namelen);
222 idx += ppkt->nameservers[i]->namelen;
223 struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx];
224 r->type = ppkt->nameservers[i]->type;
225 r->class = ppkt->nameservers[i]->class;
226 r->ttl = ppkt->nameservers[i]->ttl;
227 r->data_len = ppkt->nameservers[i]->data_len;
228 idx += sizeof(struct dns_record_line);
229 memcpy(&r->data, ppkt->nameservers[i]->data, ppkt->nameservers[i]->data_len);
230 idx += ppkt->nameservers[i]->data_len;
231 }
232
233 for (i = 0; i < ppkt->s.arcount; i++)
234 {
235 unparse_dns_name(&pkt_c[idx], ppkt->additional[i]->name, ppkt->additional[i]->namelen);
236 idx += ppkt->additional[i]->namelen;
237 struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx];
238 r->type = ppkt->additional[i]->type;
239 r->class = ppkt->additional[i]->class;
240 r->ttl = ppkt->additional[i]->ttl;
241 r->data_len = ppkt->additional[i]->data_len;
242 idx += sizeof(struct dns_record_line);
243 memcpy(&r->data, ppkt->additional[i]->data, ppkt->additional[i]->data_len);
244 idx += ppkt->additional[i]->data_len;
245 }
246
247 return pkt;
248}
249
138void 250void
139free_parsed_dns_packet (struct dns_pkt_parsed *ppkt) 251free_parsed_dns_packet (struct dns_pkt_parsed *ppkt)
140{ 252{
diff --git a/src/vpn/gnunet-dns-parser.h b/src/vpn/gnunet-dns-parser.h
index 70a1e4b9e..b5cc7e1e8 100644
--- a/src/vpn/gnunet-dns-parser.h
+++ b/src/vpn/gnunet-dns-parser.h
@@ -7,6 +7,9 @@
7struct dns_pkt_parsed * 7struct dns_pkt_parsed *
8parse_dns_packet (struct dns_pkt *pkt); 8parse_dns_packet (struct dns_pkt *pkt);
9 9
10struct dns_pkt *
11unparse_dns_packet (struct dns_pkt_parsed *pkt);
12
10void 13void
11free_parsed_dns_packet (struct dns_pkt_parsed *ppkt); 14free_parsed_dns_packet (struct dns_pkt_parsed *ppkt);
12 15