diff options
Diffstat (limited to 'src/vpn/gnunet-dns-parser.c')
-rw-r--r-- | src/vpn/gnunet-dns-parser.c | 182 |
1 files changed, 97 insertions, 85 deletions
diff --git a/src/vpn/gnunet-dns-parser.c b/src/vpn/gnunet-dns-parser.c index e3b03fefd..e87109e0c 100644 --- a/src/vpn/gnunet-dns-parser.c +++ b/src/vpn/gnunet-dns-parser.c | |||
@@ -136,114 +136,126 @@ parse_dns_packet (struct dns_pkt *pkt) | |||
136 | } /*}}} */ | 136 | } /*}}} */ |
137 | 137 | ||
138 | static void | 138 | static void |
139 | unparse_dns_name(char* dest, char* src, size_t len) | 139 | unparse_dns_name (char *dest, char *src, size_t len) |
140 | { | 140 | { |
141 | char *b = dest; | 141 | char *b = dest; |
142 | char cnt = 0; | 142 | char cnt = 0; |
143 | |||
143 | dest++; | 144 | dest++; |
144 | while (*src != 0) | 145 | while (*src != 0) |
146 | { | ||
147 | while (*src != '.' && *src != 0) | ||
145 | { | 148 | { |
146 | while (*src != '.' && *src != 0) | 149 | *dest = *src; |
147 | { | ||
148 | *dest = *src; | ||
149 | src++; | ||
150 | dest++; | ||
151 | cnt++; | ||
152 | } | ||
153 | *b = cnt; | ||
154 | cnt = 0; | ||
155 | b = dest; | ||
156 | dest++; | ||
157 | src++; | 150 | src++; |
151 | dest++; | ||
152 | cnt++; | ||
158 | } | 153 | } |
154 | *b = cnt; | ||
155 | cnt = 0; | ||
156 | b = dest; | ||
157 | dest++; | ||
158 | src++; | ||
159 | } | ||
159 | *b = 0; | 160 | *b = 0; |
160 | } | 161 | } |
161 | 162 | ||
162 | struct dns_pkt * | 163 | struct dns_pkt * |
163 | unparse_dns_packet (struct dns_pkt_parsed* ppkt) | 164 | unparse_dns_packet (struct dns_pkt_parsed *ppkt) |
164 | { | 165 | { |
165 | size_t size = sizeof(struct dns_pkt) - 1; | 166 | size_t size = sizeof (struct dns_pkt) - 1; |
166 | int i; | 167 | int i; |
167 | for (i = 0; i < ntohs(ppkt->s.qdcount); i++) | 168 | |
169 | for (i = 0; i < ntohs (ppkt->s.qdcount); i++) | ||
168 | size += ppkt->queries[i]->namelen + 1; | 170 | size += ppkt->queries[i]->namelen + 1; |
169 | 171 | ||
170 | for (i = 0; i < ntohs(ppkt->s.ancount); i++) | 172 | for (i = 0; i < ntohs (ppkt->s.ancount); i++) |
171 | { | 173 | { |
172 | size += ppkt->answers[i]->namelen + 1; | 174 | size += ppkt->answers[i]->namelen + 1; |
173 | size += ppkt->answers[i]->data_len; | 175 | size += ppkt->answers[i]->data_len; |
174 | } | 176 | } |
175 | for (i = 0; i < ntohs(ppkt->s.nscount); i++) | 177 | for (i = 0; i < ntohs (ppkt->s.nscount); i++) |
176 | { | 178 | { |
177 | size += ppkt->nameservers[i]->namelen + 1; | 179 | size += ppkt->nameservers[i]->namelen + 1; |
178 | size += ppkt->nameservers[i]->data_len; | 180 | size += ppkt->nameservers[i]->data_len; |
179 | } | 181 | } |
180 | for (i = 0; i < ntohs(ppkt->s.arcount); i++) | 182 | for (i = 0; i < ntohs (ppkt->s.arcount); i++) |
181 | { | 183 | { |
182 | size += ppkt->additional[i]->namelen + 1; | 184 | size += ppkt->additional[i]->namelen + 1; |
183 | size += ppkt->additional[i]->data_len; | 185 | size += ppkt->additional[i]->data_len; |
184 | } | 186 | } |
187 | |||
188 | size += | ||
189 | 4 * ntohs (ppkt->s.qdcount) + 10 * (ntohs (ppkt->s.ancount) + | ||
190 | ntohs (ppkt->s.arcount) + | ||
191 | ntohs (ppkt->s.nscount)); | ||
185 | 192 | ||
186 | size += 4*ntohs(ppkt->s.qdcount) + 10*( | 193 | struct dns_pkt *pkt = GNUNET_malloc (size); |
187 | ntohs(ppkt->s.ancount)+ | 194 | char *pkt_c = (char *) pkt; |
188 | ntohs(ppkt->s.arcount)+ | ||
189 | ntohs(ppkt->s.nscount)); | ||
190 | 195 | ||
191 | struct dns_pkt *pkt = GNUNET_malloc(size); | 196 | memcpy (&pkt->s, &ppkt->s, sizeof ppkt->s); |
192 | char *pkt_c = (char*)pkt; | ||
193 | memcpy(&pkt->s, &ppkt->s, sizeof ppkt->s); | ||
194 | size_t idx = sizeof ppkt->s; | 197 | size_t idx = sizeof ppkt->s; |
195 | 198 | ||
196 | for (i = 0; i < ntohs(ppkt->s.qdcount); i++) | 199 | for (i = 0; i < ntohs (ppkt->s.qdcount); i++) |
197 | { | 200 | { |
198 | unparse_dns_name(&pkt_c[idx], ppkt->queries[i]->name, ppkt->queries[i]->namelen); | 201 | unparse_dns_name (&pkt_c[idx], ppkt->queries[i]->name, |
199 | idx += ppkt->queries[i]->namelen; | 202 | ppkt->queries[i]->namelen); |
200 | struct dns_query_line *d = (struct dns_query_line*)&pkt_c[idx]; | 203 | idx += ppkt->queries[i]->namelen; |
201 | d->class = ppkt->queries[i]->qclass; | 204 | struct dns_query_line *d = (struct dns_query_line *) &pkt_c[idx]; |
202 | d->type = ppkt->queries[i]->qtype; | 205 | |
203 | idx += sizeof(struct dns_query_line); | 206 | d->class = ppkt->queries[i]->qclass; |
204 | } | 207 | d->type = ppkt->queries[i]->qtype; |
208 | idx += sizeof (struct dns_query_line); | ||
209 | } | ||
205 | 210 | ||
206 | for (i = 0; i < ntohs(ppkt->s.ancount); i++) | 211 | for (i = 0; i < ntohs (ppkt->s.ancount); i++) |
207 | { | 212 | { |
208 | unparse_dns_name(&pkt_c[idx], ppkt->answers[i]->name, ppkt->answers[i]->namelen); | 213 | unparse_dns_name (&pkt_c[idx], ppkt->answers[i]->name, |
209 | idx += ppkt->answers[i]->namelen; | 214 | ppkt->answers[i]->namelen); |
210 | struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx]; | 215 | idx += ppkt->answers[i]->namelen; |
211 | r->type = ppkt->answers[i]->type; | 216 | struct dns_record_line *r = (struct dns_record_line *) &pkt_c[idx]; |
212 | r->class = ppkt->answers[i]->class; | 217 | |
213 | r->ttl = ppkt->answers[i]->ttl; | 218 | r->type = ppkt->answers[i]->type; |
214 | r->data_len = ppkt->answers[i]->data_len; | 219 | r->class = ppkt->answers[i]->class; |
215 | idx += sizeof(struct dns_record_line); | 220 | r->ttl = ppkt->answers[i]->ttl; |
216 | memcpy(&r->data, ppkt->answers[i]->data, ppkt->answers[i]->data_len); | 221 | r->data_len = ppkt->answers[i]->data_len; |
217 | idx += ppkt->answers[i]->data_len; | 222 | idx += sizeof (struct dns_record_line); |
218 | } | 223 | memcpy (&r->data, ppkt->answers[i]->data, ppkt->answers[i]->data_len); |
224 | idx += ppkt->answers[i]->data_len; | ||
225 | } | ||
219 | 226 | ||
220 | for (i = 0; i < ntohs(ppkt->s.nscount); i++) | 227 | for (i = 0; i < ntohs (ppkt->s.nscount); i++) |
221 | { | 228 | { |
222 | unparse_dns_name(&pkt_c[idx], ppkt->nameservers[i]->name, ppkt->nameservers[i]->namelen); | 229 | unparse_dns_name (&pkt_c[idx], ppkt->nameservers[i]->name, |
223 | idx += ppkt->nameservers[i]->namelen; | 230 | ppkt->nameservers[i]->namelen); |
224 | struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx]; | 231 | idx += ppkt->nameservers[i]->namelen; |
225 | r->type = ppkt->nameservers[i]->type; | 232 | struct dns_record_line *r = (struct dns_record_line *) &pkt_c[idx]; |
226 | r->class = ppkt->nameservers[i]->class; | 233 | |
227 | r->ttl = ppkt->nameservers[i]->ttl; | 234 | r->type = ppkt->nameservers[i]->type; |
228 | r->data_len = ppkt->nameservers[i]->data_len; | 235 | r->class = ppkt->nameservers[i]->class; |
229 | idx += sizeof(struct dns_record_line); | 236 | r->ttl = ppkt->nameservers[i]->ttl; |
230 | memcpy(&r->data, ppkt->nameservers[i]->data, ppkt->nameservers[i]->data_len); | 237 | r->data_len = ppkt->nameservers[i]->data_len; |
231 | idx += ppkt->nameservers[i]->data_len; | 238 | idx += sizeof (struct dns_record_line); |
232 | } | 239 | memcpy (&r->data, ppkt->nameservers[i]->data, |
240 | ppkt->nameservers[i]->data_len); | ||
241 | idx += ppkt->nameservers[i]->data_len; | ||
242 | } | ||
233 | 243 | ||
234 | for (i = 0; i < ntohs(ppkt->s.arcount); i++) | 244 | for (i = 0; i < ntohs (ppkt->s.arcount); i++) |
235 | { | 245 | { |
236 | unparse_dns_name(&pkt_c[idx], ppkt->additional[i]->name, ppkt->additional[i]->namelen); | 246 | unparse_dns_name (&pkt_c[idx], ppkt->additional[i]->name, |
237 | idx += ppkt->additional[i]->namelen; | 247 | ppkt->additional[i]->namelen); |
238 | struct dns_record_line *r = (struct dns_record_line*)&pkt_c[idx]; | 248 | idx += ppkt->additional[i]->namelen; |
239 | r->type = ppkt->additional[i]->type; | 249 | struct dns_record_line *r = (struct dns_record_line *) &pkt_c[idx]; |
240 | r->class = ppkt->additional[i]->class; | 250 | |
241 | r->ttl = ppkt->additional[i]->ttl; | 251 | r->type = ppkt->additional[i]->type; |
242 | r->data_len = ppkt->additional[i]->data_len; | 252 | r->class = ppkt->additional[i]->class; |
243 | idx += sizeof(struct dns_record_line); | 253 | r->ttl = ppkt->additional[i]->ttl; |
244 | memcpy(&r->data, ppkt->additional[i]->data, ppkt->additional[i]->data_len); | 254 | r->data_len = ppkt->additional[i]->data_len; |
245 | idx += ppkt->additional[i]->data_len; | 255 | idx += sizeof (struct dns_record_line); |
246 | } | 256 | memcpy (&r->data, ppkt->additional[i]->data, ppkt->additional[i]->data_len); |
257 | idx += ppkt->additional[i]->data_len; | ||
258 | } | ||
247 | 259 | ||
248 | return pkt; | 260 | return pkt; |
249 | } | 261 | } |