Merge branch 'master' of ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / dns / gnunet-dns-redirector.c
index 41667ee9f56ec1b65aa8458ed0eccc5d68c6b060..89929815a2e9467cbc03af0ca544211f43322e17 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2011 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2011 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -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);
 }
 
 
@@ -177,7 +177,7 @@ modify_request (void *cls,
  * Shutdown.
  */
 static void
-do_disconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+do_disconnect (void *cls)
 {
   if (NULL != handle)
   {
@@ -199,13 +199,31 @@ 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);
-  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
-                               &do_disconnect, NULL);
+  GNUNET_SCHEDULER_add_shutdown (&do_disconnect, NULL);
 }
 
 
@@ -222,11 +240,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;
 }