{
restart_hijack = 0;
/*
- * The message is just a header
+ * The message is just a header
*/
- GNUNET_assert(sizeof(struct GNUNET_MessageHeader) >= size);
+ GNUNET_assert(sizeof(struct GNUNET_MessageHeader) <= size);
struct GNUNET_MessageHeader* hdr = buf;
len = sizeof(struct GNUNET_MessageHeader);
hdr->size = htons(len);
/*
* Check whether more data is to be sent
*/
- if (head != NULL || restart_hijack == 1)
+ if (head != NULL)
{
GNUNET_CLIENT_notify_transmit_ready(dns_connection, ntohs(head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
}
+ else if (restart_hijack == 1)
+ {
+ GNUNET_CLIENT_notify_transmit_ready(dns_connection, sizeof(struct GNUNET_MessageHeader), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
+ }
return len;
}
GNUNET_DISK_pipe_close_end(helper_out, GNUNET_DISK_PIPE_END_WRITE);
GNUNET_DISK_pipe_close_end(helper_in, GNUNET_DISK_PIPE_END_READ);
+ /* Tell the dns-service to rehijack the dns-port
+ * The routing-table gets flushed if an interface disappears.
+ */
+ restart_hijack = 1;
+ GNUNET_CLIENT_notify_transmit_ready(dns_connection, sizeof(struct GNUNET_MessageHeader), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
+
GNUNET_SCHEDULER_add_read_file (sched, GNUNET_TIME_UNIT_FOREVER_REL, fh_from_helper, &helper_read, NULL);
}
GNUNET_OS_process_close (helper_proc);
helper_proc = NULL;
- /* Tell the dns-service to rehijack the dns-port
- * The routing-table gets flushed if an interface disappears.
- */
- restart_hijack = 1;
- GNUNET_CLIENT_notify_transmit_ready(dns_connection, sizeof(struct GNUNET_MessageHeader), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
-
GNUNET_DISK_pipe_close(helper_in);
GNUNET_DISK_pipe_close(helper_out);
GNUNET_YES,
&send_query,
NULL);
+ else if (restart_hijack == 1)
+ {
+ GNUNET_CLIENT_notify_transmit_ready(dns_connection, sizeof(struct GNUNET_MessageHeader), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
+ }
}
/**
* Hijack all outgoing DNS-Traffic but for traffic leaving "our" port.
*/
static void
-hijack(unsigned short port) {
+hijack(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
char port_s[6];
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Hijacking, port is %d\n", port);
- snprintf(port_s, 6, "%d", port);
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Hijacking, port is %d\n", dnsoutport);
+ snprintf(port_s, 6, "%d", dnsoutport);
GNUNET_OS_process_close (GNUNET_OS_start_process(NULL,
- NULL,
- "gnunet-helper-hijack-dns",
- "gnunet-hijack-dns",
- port_s,
- NULL));
+ NULL,
+ "gnunet-helper-hijack-dns",
+ "gnunet-hijack-dns",
+ port_s,
+ NULL));
}
/**
struct GNUNET_SERVER_Client *client,
const struct GNUNET_MessageHeader *message) {
unhijack(dnsoutport);
- hijack(dnsoutport);
+ GNUNET_SCHEDULER_add_delayed(sched, GNUNET_TIME_UNIT_SECONDS, hijack, NULL);
+
+ GNUNET_SERVER_receive_done(client, GNUNET_OK);
}
/**
dnsoutport = htons(addr.sin_port);
- hijack(htons(addr.sin_port));
-
GNUNET_SCHEDULER_add_now (sched, publish_name, NULL);
GNUNET_SCHEDULER_add_read_net(sched, GNUNET_TIME_UNIT_FOREVER_REL, dnsout, &read_response, NULL);