-fix
[oweals/gnunet.git] / src / gns / gnunet-gns.c
index d1ef663315ea1c03eaad15c7d9d31bfe0b885bf0..0524b3def4424420a31d4069162a1f5f10692f31 100644 (file)
@@ -22,8 +22,6 @@
  * @brief command line tool to access distributed GNS
  * @author Christian Grothoff
  *
- * TODO:
- * - everything
  */
 #include "platform.h"
 #include <gnunet_util_lib.h>
@@ -176,8 +174,8 @@ run (void *cls, char *const *args, const char *cfgfile,
   struct GNUNET_CRYPTO_ShortHashAsciiEncoded zonename;
   struct GNUNET_CRYPTO_RsaPrivateKey *shorten_key = NULL;
   struct GNUNET_CRYPTO_RsaPrivateKey *private_key = NULL;
-  struct GNUNET_CRYPTO_ShortHashCode private_zone;
-  struct GNUNET_CRYPTO_ShortHashCode shorten_zone;
+  struct GNUNET_CRYPTO_ShortHashCode *private_zone = NULL;
+  struct GNUNET_CRYPTO_ShortHashCode *shorten_zone = NULL;
 
   shorten_request = NULL;
   lookup_request = NULL;
@@ -224,10 +222,11 @@ run (void *cls, char *const *args, const char *cfgfile,
     {
       shorten_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
       GNUNET_CRYPTO_rsa_key_get_public (shorten_key, &pkey);
+      shorten_zone = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_ShortHashCode));
       GNUNET_CRYPTO_short_hash(&pkey,
                          sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
-                         &shorten_zone);
-      GNUNET_CRYPTO_short_hash_to_enc (&shorten_zone, &zonename);
+                         shorten_zone);
+      GNUNET_CRYPTO_short_hash_to_enc (shorten_zone, &zonename);
       if (!raw)
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                     "Using shorten zone: %s!\n", &zonename);
@@ -243,7 +242,7 @@ run (void *cls, char *const *args, const char *cfgfile,
     if (!raw)
       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                   "No private zone key file name specified in configuration!\n");
-    shorten_key = NULL;
+    private_key = NULL;
   }
   else
   {
@@ -251,10 +250,11 @@ run (void *cls, char *const *args, const char *cfgfile,
     {
       private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
       GNUNET_CRYPTO_rsa_key_get_public (private_key, &pkey);
+      private_zone = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_ShortHashCode));
       GNUNET_CRYPTO_short_hash(&pkey,
                          sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
-                         &private_zone);
-      GNUNET_CRYPTO_short_hash_to_enc (&private_zone, &zonename);
+                         private_zone);
+      GNUNET_CRYPTO_short_hash_to_enc (private_zone, &zonename);
       if (!raw)
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                     "Using private zone: %s!\n", &zonename);
@@ -287,14 +287,19 @@ run (void *cls, char *const *args, const char *cfgfile,
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                _("Failed to connect to GNS\n"));
+    if (NULL != shorten_key)
+    {
+      GNUNET_CRYPTO_rsa_key_free (shorten_key);
+      shorten_key = NULL;
+    }
     return;
   }
   
-  if (NULL != shorten_name)
+  if ((NULL != shorten_name) && (NULL != shorten_zone) && (NULL != private_zone))
   {
     shorten_request = GNUNET_GNS_shorten_zone (gns, shorten_name,
-                             &private_zone,
-                             &shorten_zone,
+                             private_zone,
+                             shorten_zone,
                              zone,
                              &process_shorten_result,
                              shorten_name);
@@ -320,7 +325,24 @@ run (void *cls, char *const *args, const char *cfgfile,
 
   if (NULL != shorten_key)
     GNUNET_CRYPTO_rsa_key_free (shorten_key);
+
+  if (NULL != shorten_zone)
+    GNUNET_free (shorten_zone);
+
+  if (NULL != private_zone)
+    GNUNET_free (private_zone);
   
+  if ((NULL == auth_name) &&
+      (NULL == shorten_name) &&
+      (NULL == lookup_name))
+  {
+    if (!raw)
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                 "Please specify lookup, shorten or authority operation!\n");
+    GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
+    return;
+  }
+
   shutdown_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
                                                 &do_shutdown, NULL);
 }
@@ -338,16 +360,16 @@ main (int argc, char *const *argv)
 {
   static const struct GNUNET_GETOPT_CommandLineOption options[] = {
     {'s', "shorten", NULL,
-     gettext_noop ("try to shorten a given GNS name"), 1,
+     gettext_noop ("try to shorten a given name"), 1,
      &GNUNET_GETOPT_set_string, &shorten_name},
     {'u', "lookup", NULL,
-      gettext_noop ("Lookup a record using GNS (NOT IMPLEMENTED)"), 1,
+      gettext_noop ("Lookup a record for the given name"), 1,
       &GNUNET_GETOPT_set_string, &lookup_name},
     {'a', "authority", NULL,
       gettext_noop ("Get the authority of a particular name"), 1,
       &GNUNET_GETOPT_set_string, &auth_name},
     {'t', "type", NULL,
-      gettext_noop ("Specify the type of the record lookup"), 1,
+      gettext_noop ("Specify the type of the record to lookup"), 1,
       &GNUNET_GETOPT_set_string, &lookup_type},
     {'r', "raw", NULL,
       gettext_noop ("No unneeded output"), 0,