diff options
Diffstat (limited to 'src/dns/gnunet-dns-redirector.c')
-rw-r--r-- | src/dns/gnunet-dns-redirector.c | 227 |
1 files changed, 114 insertions, 113 deletions
diff --git a/src/dns/gnunet-dns-redirector.c b/src/dns/gnunet-dns-redirector.c index f1978ce92..6a3899a46 100644 --- a/src/dns/gnunet-dns-redirector.c +++ b/src/dns/gnunet-dns-redirector.c | |||
@@ -61,51 +61,51 @@ static unsigned int verbosity; | |||
61 | * @param record record to modify | 61 | * @param record record to modify |
62 | */ | 62 | */ |
63 | static void | 63 | static void |
64 | modify_record(const struct GNUNET_DNSPARSER_Record *record) | 64 | modify_record (const struct GNUNET_DNSPARSER_Record *record) |
65 | { | 65 | { |
66 | char buf[INET6_ADDRSTRLEN]; | 66 | char buf[INET6_ADDRSTRLEN]; |
67 | 67 | ||
68 | switch (record->type) | 68 | switch (record->type) |
69 | { | ||
70 | case GNUNET_DNSPARSER_TYPE_A: | ||
71 | if (record->data.raw.data_len != sizeof(struct in_addr)) | ||
72 | return; | ||
73 | if (NULL != n4) | ||
74 | { | ||
75 | if (verbosity > 1) | ||
76 | fprintf (stderr, | ||
77 | "Changing A record from `%s' to `%s'\n", | ||
78 | inet_ntop (AF_INET, record->data.raw.data, buf, sizeof(buf)), | ||
79 | n4); | ||
80 | GNUNET_assert (1 == inet_pton (AF_INET, n4, record->data.raw.data)); | ||
81 | } | ||
82 | break; | ||
83 | |||
84 | case GNUNET_DNSPARSER_TYPE_AAAA: | ||
85 | if (record->data.raw.data_len != sizeof(struct in6_addr)) | ||
86 | return; | ||
87 | if (NULL != n6) | ||
69 | { | 88 | { |
70 | case GNUNET_DNSPARSER_TYPE_A: | 89 | if (verbosity > 1) |
71 | if (record->data.raw.data_len != sizeof(struct in_addr)) | 90 | fprintf (stderr, |
72 | return; | 91 | "Changing AAAA record from `%s' to `%s'\n", |
73 | if (NULL != n4) | 92 | inet_ntop (AF_INET6, record->data.raw.data, buf, sizeof(buf)), |
74 | { | 93 | n6); |
75 | if (verbosity > 1) | 94 | GNUNET_assert (1 == inet_pton (AF_INET6, n6, record->data.raw.data)); |
76 | fprintf(stderr, | ||
77 | "Changing A record from `%s' to `%s'\n", | ||
78 | inet_ntop(AF_INET, record->data.raw.data, buf, sizeof(buf)), | ||
79 | n4); | ||
80 | GNUNET_assert(1 == inet_pton(AF_INET, n4, record->data.raw.data)); | ||
81 | } | ||
82 | break; | ||
83 | |||
84 | case GNUNET_DNSPARSER_TYPE_AAAA: | ||
85 | if (record->data.raw.data_len != sizeof(struct in6_addr)) | ||
86 | return; | ||
87 | if (NULL != n6) | ||
88 | { | ||
89 | if (verbosity > 1) | ||
90 | fprintf(stderr, | ||
91 | "Changing AAAA record from `%s' to `%s'\n", | ||
92 | inet_ntop(AF_INET6, record->data.raw.data, buf, sizeof(buf)), | ||
93 | n6); | ||
94 | GNUNET_assert(1 == inet_pton(AF_INET6, n6, record->data.raw.data)); | ||
95 | } | ||
96 | break; | ||
97 | |||
98 | case GNUNET_DNSPARSER_TYPE_NS: | ||
99 | case GNUNET_DNSPARSER_TYPE_CNAME: | ||
100 | case GNUNET_DNSPARSER_TYPE_PTR: | ||
101 | case GNUNET_DNSPARSER_TYPE_SOA: | ||
102 | case GNUNET_DNSPARSER_TYPE_MX: | ||
103 | case GNUNET_DNSPARSER_TYPE_TXT: | ||
104 | break; | ||
105 | |||
106 | default: | ||
107 | break; | ||
108 | } | 95 | } |
96 | break; | ||
97 | |||
98 | case GNUNET_DNSPARSER_TYPE_NS: | ||
99 | case GNUNET_DNSPARSER_TYPE_CNAME: | ||
100 | case GNUNET_DNSPARSER_TYPE_PTR: | ||
101 | case GNUNET_DNSPARSER_TYPE_SOA: | ||
102 | case GNUNET_DNSPARSER_TYPE_MX: | ||
103 | case GNUNET_DNSPARSER_TYPE_TXT: | ||
104 | break; | ||
105 | |||
106 | default: | ||
107 | break; | ||
108 | } | ||
109 | } | 109 | } |
110 | 110 | ||
111 | 111 | ||
@@ -133,10 +133,10 @@ modify_record(const struct GNUNET_DNSPARSER_Record *record) | |||
133 | * @param request udp payload of the DNS request | 133 | * @param request udp payload of the DNS request |
134 | */ | 134 | */ |
135 | static void | 135 | static void |
136 | modify_request(void *cls, | 136 | modify_request (void *cls, |
137 | struct GNUNET_DNS_RequestHandle *rh, | 137 | struct GNUNET_DNS_RequestHandle *rh, |
138 | size_t request_length, | 138 | size_t request_length, |
139 | const char *request) | 139 | const char *request) |
140 | { | 140 | { |
141 | struct GNUNET_DNSPARSER_Packet *p; | 141 | struct GNUNET_DNSPARSER_Packet *p; |
142 | unsigned int i; | 142 | unsigned int i; |
@@ -144,35 +144,35 @@ modify_request(void *cls, | |||
144 | size_t len; | 144 | size_t len; |
145 | int ret; | 145 | int ret; |
146 | 146 | ||
147 | p = GNUNET_DNSPARSER_parse(request, request_length); | 147 | p = GNUNET_DNSPARSER_parse (request, request_length); |
148 | if (NULL == p) | 148 | if (NULL == p) |
149 | { | 149 | { |
150 | fprintf(stderr, "Received malformed DNS packet, leaving it untouched\n"); | 150 | fprintf (stderr, "Received malformed DNS packet, leaving it untouched\n"); |
151 | GNUNET_DNS_request_forward(rh); | 151 | GNUNET_DNS_request_forward (rh); |
152 | return; | 152 | return; |
153 | } | 153 | } |
154 | for (i = 0; i < p->num_answers; i++) | 154 | for (i = 0; i < p->num_answers; i++) |
155 | modify_record(&p->answers[i]); | 155 | modify_record (&p->answers[i]); |
156 | buf = NULL; | 156 | buf = NULL; |
157 | ret = GNUNET_DNSPARSER_pack(p, 1024, &buf, &len); | 157 | ret = GNUNET_DNSPARSER_pack (p, 1024, &buf, &len); |
158 | GNUNET_DNSPARSER_free_packet(p); | 158 | GNUNET_DNSPARSER_free_packet (p); |
159 | if (GNUNET_OK != ret) | 159 | if (GNUNET_OK != ret) |
160 | { | 160 | { |
161 | if (GNUNET_NO == ret) | 161 | if (GNUNET_NO == ret) |
162 | fprintf(stderr, | 162 | fprintf (stderr, |
163 | "Modified DNS response did not fit, keeping old response\n"); | 163 | "Modified DNS response did not fit, keeping old response\n"); |
164 | else | 164 | else |
165 | GNUNET_break(0); /* our modifications should have been sane! */ | 165 | GNUNET_break (0); /* our modifications should have been sane! */ |
166 | GNUNET_DNS_request_forward(rh); | 166 | GNUNET_DNS_request_forward (rh); |
167 | } | 167 | } |
168 | else | 168 | else |
169 | { | 169 | { |
170 | if (verbosity > 0) | 170 | if (verbosity > 0) |
171 | fprintf(stdout, | 171 | fprintf (stdout, |
172 | "Injecting modified DNS response\n"); | 172 | "Injecting modified DNS response\n"); |
173 | GNUNET_DNS_request_answer(rh, len, buf); | 173 | GNUNET_DNS_request_answer (rh, len, buf); |
174 | } | 174 | } |
175 | GNUNET_free_non_null(buf); | 175 | GNUNET_free_non_null (buf); |
176 | } | 176 | } |
177 | 177 | ||
178 | 178 | ||
@@ -180,13 +180,13 @@ modify_request(void *cls, | |||
180 | * Shutdown. | 180 | * Shutdown. |
181 | */ | 181 | */ |
182 | static void | 182 | static void |
183 | do_disconnect(void *cls) | 183 | do_disconnect (void *cls) |
184 | { | 184 | { |
185 | if (NULL != handle) | 185 | if (NULL != handle) |
186 | { | 186 | { |
187 | GNUNET_DNS_disconnect(handle); | 187 | GNUNET_DNS_disconnect (handle); |
188 | handle = NULL; | 188 | handle = NULL; |
189 | } | 189 | } |
190 | } | 190 | } |
191 | 191 | ||
192 | 192 | ||
@@ -199,67 +199,68 @@ do_disconnect(void *cls) | |||
199 | * @param cfg configuration | 199 | * @param cfg configuration |
200 | */ | 200 | */ |
201 | static void | 201 | static void |
202 | run(void *cls, char *const *args, const char *cfgfile, | 202 | run (void *cls, char *const *args, const char *cfgfile, |
203 | const struct GNUNET_CONFIGURATION_Handle *cfg) | 203 | const struct GNUNET_CONFIGURATION_Handle *cfg) |
204 | { | 204 | { |
205 | struct in_addr i4; | 205 | struct in_addr i4; |
206 | struct in6_addr i6; | 206 | struct in6_addr i6; |
207 | 207 | ||
208 | if ((n4 != NULL) && | 208 | if ((n4 != NULL) && |
209 | (1 != inet_pton(AF_INET, n4, &i4))) | 209 | (1 != inet_pton (AF_INET, n4, &i4))) |
210 | { | 210 | { |
211 | fprintf(stderr, | 211 | fprintf (stderr, |
212 | "`%s' is nto a valid IPv4 address!\n", | 212 | "`%s' is nto a valid IPv4 address!\n", |
213 | n4); | 213 | n4); |
214 | return; | 214 | return; |
215 | } | 215 | } |
216 | if ((n6 != NULL) && | 216 | if ((n6 != NULL) && |
217 | (1 != inet_pton(AF_INET6, n6, &i6))) | 217 | (1 != inet_pton (AF_INET6, n6, &i6))) |
218 | { | 218 | { |
219 | fprintf(stderr, | 219 | fprintf (stderr, |
220 | "`%s' is nto a valid IPv6 address!\n", | 220 | "`%s' is nto a valid IPv6 address!\n", |
221 | n6); | 221 | n6); |
222 | return; | 222 | return; |
223 | } | 223 | } |
224 | 224 | ||
225 | handle = | 225 | handle = |
226 | GNUNET_DNS_connect(cfg, | 226 | GNUNET_DNS_connect (cfg, |
227 | GNUNET_DNS_FLAG_POST_RESOLUTION, | 227 | GNUNET_DNS_FLAG_POST_RESOLUTION, |
228 | &modify_request, | 228 | &modify_request, |
229 | NULL); | 229 | NULL); |
230 | GNUNET_SCHEDULER_add_shutdown(&do_disconnect, NULL); | 230 | GNUNET_SCHEDULER_add_shutdown (&do_disconnect, NULL); |
231 | } | 231 | } |
232 | 232 | ||
233 | 233 | ||
234 | int | 234 | int |
235 | main(int argc, char *const *argv) | 235 | main (int argc, char *const *argv) |
236 | { | 236 | { |
237 | struct GNUNET_GETOPT_CommandLineOption options[] = { | 237 | struct GNUNET_GETOPT_CommandLineOption options[] = { |
238 | GNUNET_GETOPT_option_string('4', | 238 | GNUNET_GETOPT_option_string ('4', |
239 | "ipv4", | 239 | "ipv4", |
240 | "IPV4", | 240 | "IPV4", |
241 | gettext_noop("set A records"), | 241 | gettext_noop ("set A records"), |
242 | &n4), | 242 | &n4), |
243 | 243 | ||
244 | GNUNET_GETOPT_option_string('6', | 244 | GNUNET_GETOPT_option_string ('6', |
245 | "ipv4", | 245 | "ipv4", |
246 | "IPV6", | 246 | "IPV6", |
247 | gettext_noop("set AAAA records"), | 247 | gettext_noop ("set AAAA records"), |
248 | &n6), | 248 | &n6), |
249 | 249 | ||
250 | GNUNET_GETOPT_option_verbose(&verbosity), | 250 | GNUNET_GETOPT_option_verbose (&verbosity), |
251 | GNUNET_GETOPT_OPTION_END | 251 | GNUNET_GETOPT_OPTION_END |
252 | }; | 252 | }; |
253 | 253 | ||
254 | if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args(argc, argv, &argc, &argv)) | 254 | if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) |
255 | return 2; | 255 | return 2; |
256 | 256 | ||
257 | ret = (GNUNET_OK == | 257 | ret = (GNUNET_OK == |
258 | GNUNET_PROGRAM_run(argc, argv, "gnunet-dns-redirector", | 258 | GNUNET_PROGRAM_run (argc, argv, "gnunet-dns-redirector", |
259 | gettext_noop | 259 | gettext_noop |
260 | ("Change DNS replies to point elsewhere."), options, | 260 | ("Change DNS replies to point elsewhere."), |
261 | &run, NULL)) ? ret : 1; | 261 | options, |
262 | GNUNET_free((void*)argv); | 262 | &run, NULL)) ? ret : 1; |
263 | GNUNET_free ((void*) argv); | ||
263 | return ret; | 264 | return ret; |
264 | } | 265 | } |
265 | 266 | ||