aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-dns-parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vpn/gnunet-dns-parser.c')
-rw-r--r--src/vpn/gnunet-dns-parser.c182
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
138static void 138static void
139unparse_dns_name(char* dest, char* src, size_t len) 139unparse_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
162struct dns_pkt * 163struct dns_pkt *
163unparse_dns_packet (struct dns_pkt_parsed* ppkt) 164unparse_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}