More W32 resolver workarounds
[oweals/gnunet.git] / src / dns / gnunet-dns-redirector.c
index bde869816448ef86dd1a9e3dd36f6b399b4134c0..4d1a452a55fa84754c1b23ee1314358548cbbea1 100644 (file)
 
 #include "platform.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_dns_service-new.h"
+#include "gnunet_dns_service.h"
 #include "gnunet_dnsparser_lib.h"
 
 /**
- * Handle to transport service.
+ * Handle to DNS service.
  */
 static struct GNUNET_DNS_Handle *handle;
 
@@ -56,26 +56,42 @@ static int verbosity;
 
 
 /**
- * Output the given DNS query to stdout.
+ * Modify the given DNS record.
  *
- * @param query query to display.
+ * @param record record to modify
  */
 static void
 modify_record (const struct GNUNET_DNSPARSER_Record *record)
 {
+  char buf[INET6_ADDRSTRLEN];
+
   switch (record->type)
   {
-  case GNUNET_DNSPARSER_TYPE_A:    
+  case GNUNET_DNSPARSER_TYPE_A:
     if (record->data.raw.data_len != sizeof (struct in_addr))
       return;
     if (NULL != n4)
-      inet_pton (AF_INET, n4, record->data.raw.data);
+    {
+      if (verbosity > 1)
+       fprintf (stderr,
+                "Changing A record from `%s' to `%s'\n",
+                inet_ntop (AF_INET, record->data.raw.data, buf, sizeof (buf)),
+                n4);
+      GNUNET_assert (1 == inet_pton (AF_INET, n4, record->data.raw.data));
+    }
     break;
   case GNUNET_DNSPARSER_TYPE_AAAA:
     if (record->data.raw.data_len != sizeof (struct in6_addr))
       return;
     if (NULL != n6)
-      inet_pton (AF_INET6, n6, record->data.raw.data);
+    {
+      if (verbosity > 1)
+       fprintf (stderr,
+                "Changing AAAA record from `%s' to `%s'\n",
+                inet_ntop (AF_INET6, record->data.raw.data, buf, sizeof (buf)),
+                n6);
+      GNUNET_assert (1 == inet_pton (AF_INET6, n6, record->data.raw.data));
+    }
     break;
   case GNUNET_DNSPARSER_TYPE_NS:
   case GNUNET_DNSPARSER_TYPE_CNAME:
@@ -113,7 +129,7 @@ modify_record (const struct GNUNET_DNSPARSER_Record *record)
  * @param request_length number of bytes in request
  * @param request udp payload of the DNS request
  */
-static void 
+static void
 modify_request (void *cls,
                struct GNUNET_DNS_RequestHandle *rh,
                size_t request_length,
@@ -128,8 +144,7 @@ modify_request (void *cls,
   p = GNUNET_DNSPARSER_parse (request, request_length);
   if (NULL == p)
   {
-    fprintf (stderr, "Received malformed DNS packet!\n");
-    // FIXME: drop instead?
+    fprintf (stderr, "Received malformed DNS packet, leaving it untouched\n");
     GNUNET_DNS_request_forward (rh);
     return;
   }
@@ -138,12 +153,23 @@ modify_request (void *cls,
   buf = NULL;
   ret = GNUNET_DNSPARSER_pack (p, 1024, &buf, &len);
   GNUNET_DNSPARSER_free_packet (p);
-  fprintf (stderr, "PACK: %d\n", ret);
   if (GNUNET_OK != ret)
+  {
+    if (GNUNET_NO == ret)
+      fprintf (stderr,
+              "Modified DNS response did not fit, keeping old response\n");
+    else
+      GNUNET_break (0); /* our modifications should have been sane! */
     GNUNET_DNS_request_forward (rh);
+  }
   else
+  {
+    if (verbosity > 0)
+      fprintf (stdout,
+              "Injecting modified DNS response\n");
     GNUNET_DNS_request_answer (rh, len, buf);
-  GNUNET_free_non_null (buf);      
+  }
+  GNUNET_free_non_null (buf);
 }
 
 
@@ -173,8 +199,27 @@ static void
 run (void *cls, char *const *args, const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
+  struct in_addr i4;
+  struct in6_addr i6;
+  if ( (n4 != NULL) &&
+       (1 != inet_pton (AF_INET, n4, &i4)) )
+  {
+    fprintf (stderr,
+            "`%s' is nto a valid IPv4 address!\n",
+            n4);
+    return;
+  }
+  if ( (n6 != NULL) &&
+       (1 != inet_pton (AF_INET6, n6, &i6)) )
+  {
+    fprintf (stderr,
+            "`%s' is nto a valid IPv6 address!\n",
+            n6);
+    return;
+  }
+
   handle =
-    GNUNET_DNS_connect (cfg, 
+    GNUNET_DNS_connect (cfg,
                        GNUNET_DNS_FLAG_POST_RESOLUTION,
                        &modify_request,
                        NULL);
@@ -196,11 +241,17 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_VERBOSE (&verbosity),
     GNUNET_GETOPT_OPTION_END
   };
-  return (GNUNET_OK ==
-          GNUNET_PROGRAM_run (argc, argv, "gnunet-dns-redirector",
-                              gettext_noop
-                              ("Change DNS replies to point elsewhere."), options,
-                              &run, NULL)) ? ret : 1;
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
+  ret = (GNUNET_OK ==
+        GNUNET_PROGRAM_run (argc, argv, "gnunet-dns-redirector",
+                            gettext_noop
+                            ("Change DNS replies to point elsewhere."), options,
+                            &run, NULL)) ? ret : 1;
+  GNUNET_free ((void*) argv);
+  return ret;
 }