diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-11-04 17:26:56 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-11-04 17:26:56 +0000 |
commit | b569b667c1e5596a8588ae2aa1aa533f54658fbd (patch) | |
tree | ddb380b8f526f7b8bb692ffa63fb91e407f03506 | |
parent | cdabfd952833b891f2063601da05d1ce15b3f5d1 (diff) | |
download | gnunet-b569b667c1e5596a8588ae2aa1aa533f54658fbd.tar.gz gnunet-b569b667c1e5596a8588ae2aa1aa533f54658fbd.zip |
Only start the hijack if the vpn is running
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.c | 26 | ||||
-rw-r--r-- | src/vpn/gnunet-service-dns.c | 22 |
2 files changed, 28 insertions, 20 deletions
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c index 7edd3c52f..566388a66 100644 --- a/src/vpn/gnunet-daemon-vpn.c +++ b/src/vpn/gnunet-daemon-vpn.c | |||
@@ -136,9 +136,9 @@ send_query(void* cls, size_t size, void* buf) { | |||
136 | { | 136 | { |
137 | restart_hijack = 0; | 137 | restart_hijack = 0; |
138 | /* | 138 | /* |
139 | * The message is just a header | 139 | * The message is just a header |
140 | */ | 140 | */ |
141 | GNUNET_assert(sizeof(struct GNUNET_MessageHeader) >= size); | 141 | GNUNET_assert(sizeof(struct GNUNET_MessageHeader) <= size); |
142 | struct GNUNET_MessageHeader* hdr = buf; | 142 | struct GNUNET_MessageHeader* hdr = buf; |
143 | len = sizeof(struct GNUNET_MessageHeader); | 143 | len = sizeof(struct GNUNET_MessageHeader); |
144 | hdr->size = htons(len); | 144 | hdr->size = htons(len); |
@@ -161,10 +161,14 @@ send_query(void* cls, size_t size, void* buf) { | |||
161 | /* | 161 | /* |
162 | * Check whether more data is to be sent | 162 | * Check whether more data is to be sent |
163 | */ | 163 | */ |
164 | if (head != NULL || restart_hijack == 1) | 164 | if (head != NULL) |
165 | { | 165 | { |
166 | GNUNET_CLIENT_notify_transmit_ready(dns_connection, ntohs(head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL); | 166 | GNUNET_CLIENT_notify_transmit_ready(dns_connection, ntohs(head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL); |
167 | } | 167 | } |
168 | else if (restart_hijack == 1) | ||
169 | { | ||
170 | GNUNET_CLIENT_notify_transmit_ready(dns_connection, sizeof(struct GNUNET_MessageHeader), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL); | ||
171 | } | ||
168 | 172 | ||
169 | return len; | 173 | return len; |
170 | } | 174 | } |
@@ -212,6 +216,12 @@ start_helper_and_schedule(void *cls, | |||
212 | GNUNET_DISK_pipe_close_end(helper_out, GNUNET_DISK_PIPE_END_WRITE); | 216 | GNUNET_DISK_pipe_close_end(helper_out, GNUNET_DISK_PIPE_END_WRITE); |
213 | GNUNET_DISK_pipe_close_end(helper_in, GNUNET_DISK_PIPE_END_READ); | 217 | GNUNET_DISK_pipe_close_end(helper_in, GNUNET_DISK_PIPE_END_READ); |
214 | 218 | ||
219 | /* Tell the dns-service to rehijack the dns-port | ||
220 | * The routing-table gets flushed if an interface disappears. | ||
221 | */ | ||
222 | restart_hijack = 1; | ||
223 | GNUNET_CLIENT_notify_transmit_ready(dns_connection, sizeof(struct GNUNET_MessageHeader), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL); | ||
224 | |||
215 | GNUNET_SCHEDULER_add_read_file (sched, GNUNET_TIME_UNIT_FOREVER_REL, fh_from_helper, &helper_read, NULL); | 225 | GNUNET_SCHEDULER_add_read_file (sched, GNUNET_TIME_UNIT_FOREVER_REL, fh_from_helper, &helper_read, NULL); |
216 | } | 226 | } |
217 | 227 | ||
@@ -226,12 +236,6 @@ restart_helper(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tskctx) { | |||
226 | GNUNET_OS_process_close (helper_proc); | 236 | GNUNET_OS_process_close (helper_proc); |
227 | helper_proc = NULL; | 237 | helper_proc = NULL; |
228 | 238 | ||
229 | /* Tell the dns-service to rehijack the dns-port | ||
230 | * The routing-table gets flushed if an interface disappears. | ||
231 | */ | ||
232 | restart_hijack = 1; | ||
233 | GNUNET_CLIENT_notify_transmit_ready(dns_connection, sizeof(struct GNUNET_MessageHeader), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL); | ||
234 | |||
235 | GNUNET_DISK_pipe_close(helper_in); | 239 | GNUNET_DISK_pipe_close(helper_in); |
236 | GNUNET_DISK_pipe_close(helper_out); | 240 | GNUNET_DISK_pipe_close(helper_out); |
237 | 241 | ||
@@ -435,6 +439,10 @@ connect_to_service_dns (void *cls, | |||
435 | GNUNET_YES, | 439 | GNUNET_YES, |
436 | &send_query, | 440 | &send_query, |
437 | NULL); | 441 | NULL); |
442 | else if (restart_hijack == 1) | ||
443 | { | ||
444 | GNUNET_CLIENT_notify_transmit_ready(dns_connection, sizeof(struct GNUNET_MessageHeader), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL); | ||
445 | } | ||
438 | } | 446 | } |
439 | 447 | ||
440 | /** | 448 | /** |
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c index 8dda2fffa..3e69f8660 100644 --- a/src/vpn/gnunet-service-dns.c +++ b/src/vpn/gnunet-service-dns.c | |||
@@ -107,17 +107,17 @@ struct receive_dht_cls { | |||
107 | * Hijack all outgoing DNS-Traffic but for traffic leaving "our" port. | 107 | * Hijack all outgoing DNS-Traffic but for traffic leaving "our" port. |
108 | */ | 108 | */ |
109 | static void | 109 | static void |
110 | hijack(unsigned short port) { | 110 | hijack(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) { |
111 | char port_s[6]; | 111 | char port_s[6]; |
112 | 112 | ||
113 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Hijacking, port is %d\n", port); | 113 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Hijacking, port is %d\n", dnsoutport); |
114 | snprintf(port_s, 6, "%d", port); | 114 | snprintf(port_s, 6, "%d", dnsoutport); |
115 | GNUNET_OS_process_close (GNUNET_OS_start_process(NULL, | 115 | GNUNET_OS_process_close (GNUNET_OS_start_process(NULL, |
116 | NULL, | 116 | NULL, |
117 | "gnunet-helper-hijack-dns", | 117 | "gnunet-helper-hijack-dns", |
118 | "gnunet-hijack-dns", | 118 | "gnunet-hijack-dns", |
119 | port_s, | 119 | port_s, |
120 | NULL)); | 120 | NULL)); |
121 | } | 121 | } |
122 | 122 | ||
123 | /** | 123 | /** |
@@ -277,7 +277,9 @@ rehijack(void *cls, | |||
277 | struct GNUNET_SERVER_Client *client, | 277 | struct GNUNET_SERVER_Client *client, |
278 | const struct GNUNET_MessageHeader *message) { | 278 | const struct GNUNET_MessageHeader *message) { |
279 | unhijack(dnsoutport); | 279 | unhijack(dnsoutport); |
280 | hijack(dnsoutport); | 280 | GNUNET_SCHEDULER_add_delayed(sched, GNUNET_TIME_UNIT_SECONDS, hijack, NULL); |
281 | |||
282 | GNUNET_SERVER_receive_done(client, GNUNET_OK); | ||
281 | } | 283 | } |
282 | 284 | ||
283 | /** | 285 | /** |
@@ -536,8 +538,6 @@ run (void *cls, | |||
536 | 538 | ||
537 | dnsoutport = htons(addr.sin_port); | 539 | dnsoutport = htons(addr.sin_port); |
538 | 540 | ||
539 | hijack(htons(addr.sin_port)); | ||
540 | |||
541 | GNUNET_SCHEDULER_add_now (sched, publish_name, NULL); | 541 | GNUNET_SCHEDULER_add_now (sched, publish_name, NULL); |
542 | 542 | ||
543 | GNUNET_SCHEDULER_add_read_net(sched, GNUNET_TIME_UNIT_FOREVER_REL, dnsout, &read_response, NULL); | 543 | GNUNET_SCHEDULER_add_read_net(sched, GNUNET_TIME_UNIT_FOREVER_REL, dnsout, &read_response, NULL); |