diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-10-18 18:41:19 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-10-18 18:41:19 +0000 |
commit | 13e485d648e02876be8ab5cf78b1c87430b04d4d (patch) | |
tree | 978e72049f3bfd22722bc518eee843fd94c948ae /src | |
parent | e7d61b1a418b271876e82a3693332559339e6189 (diff) | |
download | gnunet-13e485d648e02876be8ab5cf78b1c87430b04d4d.tar.gz gnunet-13e485d648e02876be8ab5cf78b1c87430b04d4d.zip |
allow "unparsing" of dns-packets
Diffstat (limited to 'src')
-rw-r--r-- | src/vpn/gnunet-dns-parser.c | 112 | ||||
-rw-r--r-- | src/vpn/gnunet-dns-parser.h | 3 |
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 | ||
138 | static void | ||
139 | unparse_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 | |||
161 | struct dns_pkt * | ||
162 | unparse_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 | |||
138 | void | 250 | void |
139 | free_parsed_dns_packet (struct dns_pkt_parsed *ppkt) | 251 | free_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 @@ | |||
7 | struct dns_pkt_parsed * | 7 | struct dns_pkt_parsed * |
8 | parse_dns_packet (struct dns_pkt *pkt); | 8 | parse_dns_packet (struct dns_pkt *pkt); |
9 | 9 | ||
10 | struct dns_pkt * | ||
11 | unparse_dns_packet (struct dns_pkt_parsed *pkt); | ||
12 | |||
10 | void | 13 | void |
11 | free_parsed_dns_packet (struct dns_pkt_parsed *ppkt); | 14 | free_parsed_dns_packet (struct dns_pkt_parsed *ppkt); |
12 | 15 | ||