Merge branch 'master' of ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / gns / gnunet-dns2gns.c
index 35f0a016d9496fa12a17b9a02ab55c08b5f17436..813ecdf8ef9c7dfe3036fbd2652b6c7d7bb1cb37 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2012-2013 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2012-2013 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.
 */
 /**
  * @file gnunet-dns2gns.c
@@ -170,16 +170,20 @@ static struct GNUNET_IDENTITY_Operation *id_op;
  * Task run on shutdown.  Cleans up everything.
  *
  * @param cls unused
- * @param tc scheduler context
  */
 static void
-do_shutdown (void *cls,
-            const struct GNUNET_SCHEDULER_TaskContext *tc)
+do_shutdown (void *cls)
 {
   if (NULL != t4)
+  {
     GNUNET_SCHEDULER_cancel (t4);
+    t4 = NULL;
+  }
   if (NULL != t6)
+  {
     GNUNET_SCHEDULER_cancel (t6);
+    t6 = NULL;
+  }
   if (NULL != listen_socket4)
   {
     GNUNET_NETWORK_socket_close (listen_socket4);
@@ -252,12 +256,10 @@ send_response (struct Request *request)
 /**
  * Task run on timeout.  Cleans up request.
  *
- * @param cls 'struct Request' of the request to clean up
- * @param tc scheduler context
+ * @param cls `struct Request *` of the request to clean up
  */
 static void
-do_timeout (void *cls,
-           const struct GNUNET_SCHEDULER_TaskContext *tc)
+do_timeout (void *cls)
 {
   struct Request *request = cls;
 
@@ -333,7 +335,7 @@ result_processor (void *cls,
          rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET;
          rec.type = GNUNET_DNSPARSER_TYPE_A;
          rec.data.raw.data = GNUNET_new (struct in_addr);
-         memcpy (rec.data.raw.data,
+         GNUNET_memcpy (rec.data.raw.data,
                  rd[i].data,
                  rd[i].data_size);
          rec.data.raw.data_len = sizeof (struct in_addr);
@@ -347,7 +349,7 @@ result_processor (void *cls,
          rec.data.raw.data = GNUNET_new (struct in6_addr);
          rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET;
          rec.type = GNUNET_DNSPARSER_TYPE_AAAA;
-         memcpy (rec.data.raw.data,
+         GNUNET_memcpy (rec.data.raw.data,
                  rd[i].data,
                  rd[i].data_size);
          rec.data.raw.data_len = sizeof (struct in6_addr);
@@ -360,7 +362,7 @@ result_processor (void *cls,
          rec.data.hostname = GNUNET_strdup (rd[i].data);
          rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET;
          rec.type = GNUNET_DNSPARSER_TYPE_CNAME;
-         memcpy (rec.data.hostname,
+         GNUNET_memcpy (rec.data.hostname,
                  rd[i].data,
                  rd[i].data_size);
          GNUNET_array_append (packet->answers,
@@ -437,7 +439,7 @@ handle_request (struct GNUNET_NETWORK_Handle *lsock,
   request->packet = packet;
   request->addr = &request[1];
   request->addr_len = addr_len;
-  memcpy (&request[1], addr, addr_len);
+  GNUNET_memcpy (&request[1], addr, addr_len);
   request->timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
                                                        &do_timeout,
                                                        request);
@@ -481,7 +483,6 @@ handle_request (struct GNUNET_NETWORK_Handle *lsock,
                                         &my_zone,
                                         type,
                                         GNUNET_NO,
-                                        NULL /* no shorten */,
                                         &result_processor,
                                         request);
   }
@@ -507,21 +508,21 @@ handle_request (struct GNUNET_NETWORK_Handle *lsock,
  * Task to read IPv4 DNS packets.
  *
  * @param cls the 'listen_socket4'
- * @param tc scheduler context
  */
 static void
-read_dns4 (void *cls,
-          const struct GNUNET_SCHEDULER_TaskContext *tc)
+read_dns4 (void *cls)
 {
   struct sockaddr_in v4;
   socklen_t addrlen;
   ssize_t size;
+  const struct GNUNET_SCHEDULER_TaskContext *tc;
 
   GNUNET_assert (listen_socket4 == cls);
   t4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
                                      listen_socket4,
                                      &read_dns4,
                                      listen_socket4);
+  tc = GNUNET_SCHEDULER_get_task_context ();
   if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason))
     return; /* shutdown? */
   size = GNUNET_NETWORK_socket_recvfrom_amount (listen_socket4);
@@ -531,17 +532,20 @@ read_dns4 (void *cls,
       return; /* read error!? */
     }
   {
-    char buf[size];
+    char buf[size + 1];
 
     addrlen = sizeof (v4);
     GNUNET_break (size ==
                  GNUNET_NETWORK_socket_recvfrom (listen_socket4,
                                                  buf,
-                                                 size,
+                                                 size + 1,
                                                  (struct sockaddr *) &v4,
                                                  &addrlen));
-    handle_request (listen_socket4, &v4, addrlen,
-                   buf, size);
+    handle_request (listen_socket4,
+                   &v4,
+                   addrlen,
+                   buf,
+                   size);
   }
 }
 
@@ -550,21 +554,21 @@ read_dns4 (void *cls,
  * Task to read IPv6 DNS packets.
  *
  * @param cls the 'listen_socket6'
- * @param tc scheduler context
  */
 static void
-read_dns6 (void *cls,
-          const struct GNUNET_SCHEDULER_TaskContext *tc)
+read_dns6 (void *cls)
 {
   struct sockaddr_in6 v6;
   socklen_t addrlen;
   ssize_t size;
+  const struct GNUNET_SCHEDULER_TaskContext *tc;
 
   GNUNET_assert (listen_socket6 == cls);
   t6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
                                      listen_socket6,
                                      &read_dns6,
                                      listen_socket6);
+  tc = GNUNET_SCHEDULER_get_task_context ();
   if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason))
     return; /* shutdown? */
   size = GNUNET_NETWORK_socket_recvfrom_amount (listen_socket6);
@@ -611,57 +615,57 @@ run_dnsd ()
                                                 SOCK_DGRAM,
                                                 IPPROTO_UDP);
   if (NULL != listen_socket4)
-    {
-      struct sockaddr_in v4;
+  {
+    struct sockaddr_in v4;
 
-      memset (&v4, 0, sizeof (v4));
-      v4.sin_family = AF_INET;
+    memset (&v4, 0, sizeof (v4));
+    v4.sin_family = AF_INET;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-      v4.sin_len = sizeof (v4);
+    v4.sin_len = sizeof (v4);
 #endif
-      v4.sin_port = htons (listen_port);
-      if (GNUNET_OK !=
-         GNUNET_NETWORK_socket_bind (listen_socket4,
-                                     (struct sockaddr *) &v4,
-                                     sizeof (v4)))
-       {
-         GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
-         GNUNET_NETWORK_socket_close (listen_socket4);
-         listen_socket4 = NULL;
-       }
+    v4.sin_port = htons (listen_port);
+    if (GNUNET_OK !=
+       GNUNET_NETWORK_socket_bind (listen_socket4,
+                                   (struct sockaddr *) &v4,
+                                   sizeof (v4)))
+    {
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
+      GNUNET_NETWORK_socket_close (listen_socket4);
+      listen_socket4 = NULL;
     }
+  }
   listen_socket6 = GNUNET_NETWORK_socket_create (PF_INET6,
                                                SOCK_DGRAM,
                                                IPPROTO_UDP);
   if (NULL != listen_socket6)
-    {
-      struct sockaddr_in6 v6;
+  {
+    struct sockaddr_in6 v6;
 
-      memset (&v6, 0, sizeof (v6));
-      v6.sin6_family = AF_INET6;
+    memset (&v6, 0, sizeof (v6));
+    v6.sin6_family = AF_INET6;
 #if HAVE_SOCKADDR_IN_SIN_LEN
-      v6.sin6_len = sizeof (v6);
+    v6.sin6_len = sizeof (v6);
 #endif
-      v6.sin6_port = htons (listen_port);
-      if (GNUNET_OK !=
-         GNUNET_NETWORK_socket_bind (listen_socket6,
-                                     (struct sockaddr *) &v6,
-                                     sizeof (v6)))
-       {
-         GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
-         GNUNET_NETWORK_socket_close (listen_socket6);
-         listen_socket6 = NULL;
-       }
+    v6.sin6_port = htons (listen_port);
+    if (GNUNET_OK !=
+       GNUNET_NETWORK_socket_bind (listen_socket6,
+                                   (struct sockaddr *) &v6,
+                                   sizeof (v6)))
+    {
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
+      GNUNET_NETWORK_socket_close (listen_socket6);
+      listen_socket6 = NULL;
     }
+  }
   if ( (NULL == listen_socket4) &&
        (NULL == listen_socket6) )
-    {
-      GNUNET_GNS_disconnect (gns);
-      gns = NULL;
-      GNUNET_DNSSTUB_stop (dns_stub);
-      dns_stub = NULL;
-      return;
-    }
+  {
+    GNUNET_GNS_disconnect (gns);
+    gns = NULL;
+    GNUNET_DNSSTUB_stop (dns_stub);
+    dns_stub = NULL;
+    return;
+  }
   if (NULL != listen_socket4)
     t4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
                                        listen_socket4,
@@ -672,7 +676,6 @@ run_dnsd ()
                                        listen_socket6,
                                        &read_dns6,
                                        listen_socket6);
-
 }
 
 
@@ -723,7 +726,9 @@ identity_cb (void *cls,
  * @param c configuration
  */
 static void
-run (void *cls, char *const *args, const char *cfgfile,
+run (void *cls,
+     char *const *args,
+     const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *c)
 {
   cfg = c;
@@ -734,8 +739,7 @@ run (void *cls, char *const *args, const char *cfgfile,
                 _("No DNS server specified!\n"));
     return;
   }
-  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
-                               &do_shutdown, NULL);
+  GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
   if (NULL == gns_zone_str)
     {
       identity = GNUNET_IDENTITY_connect (cfg,
@@ -749,8 +753,8 @@ run (void *cls, char *const *args, const char *cfgfile,
   if ( (NULL == gns_zone_str) ||
        (GNUNET_OK !=
        GNUNET_CRYPTO_ecdsa_public_key_from_string (gns_zone_str,
-                                                 strlen (gns_zone_str),
-                                                 &my_zone)) )
+                                                   strlen (gns_zone_str),
+                                                   &my_zone)) )
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                _("No valid GNS zone specified!\n"));
@@ -783,7 +787,7 @@ main (int argc,
       gettext_noop ("Authoritative DNS suffix to use (optional); default: zkey.eu"), 1,
       &GNUNET_GETOPT_set_string, &dns_suffix},
     {'p', "port", "UDPPORT",
-      gettext_noop ("UDP port to listen on for inbound DNS requests; default: 53"), 1,
+      gettext_noop ("UDP port to listen on for inbound DNS requests; default: 2853"), 1,
       &GNUNET_GETOPT_set_uint, &listen_port},
     {'z', "zone", "PUBLICKEY",
       gettext_noop ("Public key of the GNS zone to use (overrides default)"), 1,
@@ -792,13 +796,17 @@ main (int argc,
   };
   int ret;
 
-  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv,
-                                                &argc, &argv))
+  if (GNUNET_OK !=
+      GNUNET_STRINGS_get_utf8_args (argc, argv,
+                                    &argc, &argv))
     return 2;
-  GNUNET_log_setup ("gnunet-dns2gns", "WARNING", NULL);
+  GNUNET_log_setup ("gnunet-dns2gns",
+                    "WARNING",
+                    NULL);
   ret =
       (GNUNET_OK ==
-       GNUNET_PROGRAM_run (argc, argv, "gnunet-dns2gns",
+       GNUNET_PROGRAM_run (argc, argv,
+                           "gnunet-dns2gns",
                            _("GNUnet DNS-to-GNS proxy (a DNS server)"),
                           options,
                            &run, NULL)) ? 0 : 1;