Only start the hijack if the vpn is running
authorPhilipp Tölke <toelke@in.tum.de>
Thu, 4 Nov 2010 17:26:56 +0000 (17:26 +0000)
committerPhilipp Tölke <toelke@in.tum.de>
Thu, 4 Nov 2010 17:26:56 +0000 (17:26 +0000)
src/vpn/gnunet-daemon-vpn.c
src/vpn/gnunet-service-dns.c

index 7edd3c52f3fc5b62f9a5648f7460e74706b334cc..566388a66b504c1710d47fcb4ed2a69afb311c5c 100644 (file)
@@ -136,9 +136,9 @@ send_query(void* cls, size_t size, void* buf) {
       {
        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);
@@ -161,10 +161,14 @@ send_query(void* cls, size_t size, void* buf) {
     /*
      * 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;
 }
@@ -212,6 +216,12 @@ start_helper_and_schedule(void *cls,
     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);
 }
 
@@ -226,12 +236,6 @@ restart_helper(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tskctx) {
     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);
 
@@ -435,6 +439,10 @@ connect_to_service_dns (void *cls,
                                          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);
+      }
 }
 
 /**
index 8dda2fffadec2d20aa7b4ff37b80c345744d6762..3e69f86603da234bc22a5aad3c9ebe292e1490df 100644 (file)
@@ -107,17 +107,17 @@ struct receive_dht_cls {
  * 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));
 }
 
 /**
@@ -277,7 +277,9 @@ rehijack(void *cls,
         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);
 }
 
 /**
@@ -536,8 +538,6 @@ run (void *cls,
 
   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);