aboutsummaryrefslogtreecommitdiff
path: root/src/dns/gnunet-dns-redirector.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dns/gnunet-dns-redirector.c')
-rw-r--r--src/dns/gnunet-dns-redirector.c234
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 */
63static void 63static void
64modify_record (const struct GNUNET_DNSPARSER_Record *record) 64modify_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 */
132static void 135static void
133modify_request (void *cls, 136modify_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 */
179static void 182static void
180do_disconnect (void *cls) 183do_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 */
198static void 201static void
199run (void *cls, char *const *args, const char *cfgfile, 202run(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
230int 234int
231main (int argc, char *const *argv) 235main(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