More W32 resolver workarounds
[oweals/gnunet.git] / src / dns / gnunet-dns-redirector.c
index cc317e5e424e0901f1487ec6366f14de29aef07f..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,9 +56,9 @@ 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)
@@ -67,17 +67,17 @@ modify_record (const struct GNUNET_DNSPARSER_Record *record)
 
   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)
     {
       if (verbosity > 1)
-       fprintf (stderr, 
+       fprintf (stderr,
                 "Changing A record from `%s' to `%s'\n",
                 inet_ntop (AF_INET, record->data.raw.data, buf, sizeof (buf)),
                 n4);
-      inet_pton (AF_INET, n4, record->data.raw.data);
+      GNUNET_assert (1 == inet_pton (AF_INET, n4, record->data.raw.data));
     }
     break;
   case GNUNET_DNSPARSER_TYPE_AAAA:
@@ -86,11 +86,11 @@ modify_record (const struct GNUNET_DNSPARSER_Record *record)
     if (NULL != n6)
     {
       if (verbosity > 1)
-       fprintf (stderr, 
+       fprintf (stderr,
                 "Changing AAAA record from `%s' to `%s'\n",
                 inet_ntop (AF_INET6, record->data.raw.data, buf, sizeof (buf)),
                 n6);
-      inet_pton (AF_INET6, n6, record->data.raw.data);
+      GNUNET_assert (1 == inet_pton (AF_INET6, n6, record->data.raw.data));
     }
     break;
   case GNUNET_DNSPARSER_TYPE_NS:
@@ -129,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,
@@ -156,7 +156,7 @@ modify_request (void *cls,
   if (GNUNET_OK != ret)
   {
     if (GNUNET_NO == ret)
-      fprintf (stderr, 
+      fprintf (stderr,
               "Modified DNS response did not fit, keeping old response\n");
     else
       GNUNET_break (0); /* our modifications should have been sane! */
@@ -169,7 +169,7 @@ modify_request (void *cls,
               "Injecting modified DNS response\n");
     GNUNET_DNS_request_answer (rh, len, buf);
   }
-  GNUNET_free_non_null (buf);      
+  GNUNET_free_non_null (buf);
 }
 
 
@@ -199,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);
@@ -222,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;
 }