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