-adding some rudimentary logging
[oweals/gnunet.git] / src / peerinfo-tool / gnunet-peerinfo.c
index ba6609596abab4fd5fdaab8dd6baa5ef6378f920..21c996661077d6e688da8f63e5d6cf1367aa8a9c 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -37,8 +37,6 @@ static int be_quiet;
 
 static int get_self;
 
-static struct GNUNET_SCHEDULER_Handle *sched;
-
 static struct GNUNET_PEERINFO_Handle *peerinfo;
 
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
@@ -49,7 +47,6 @@ struct PrintContext
   char **address_list;
   unsigned int num_addresses;
   uint32_t off;
-  uint32_t trust;
 };
 
 
@@ -60,19 +57,14 @@ dump_pc (struct PrintContext *pc)
   unsigned int i;
 
   GNUNET_CRYPTO_hash_to_enc (&pc->peer.hashPubKey, &enc);
-  printf (_("Peer `%s' with trust %8u\n"), 
-         (const char *) &enc,
-         pc->trust);
-  for (i=0;i<pc->num_addresses;i++)
-    {
-      printf ("\t%s\n",
-             pc->address_list[i]);
-      GNUNET_free (pc->address_list[i]);
-    }
+  printf (_("Peer `%s'\n"), (const char *) &enc);
+  for (i = 0; i < pc->num_addresses; i++)
+  {
+    printf ("\t%s\n", pc->address_list[i]);
+    GNUNET_free (pc->address_list[i]);
+  }
   printf ("\n");
-  GNUNET_array_grow (pc->address_list,
-                    pc->num_addresses,
-                    0);
+  GNUNET_array_grow (pc->address_list, pc->num_addresses, 0);
   GNUNET_free (pc);
 }
 
@@ -84,21 +76,19 @@ dump_pc (struct PrintContext *pc)
  * @param address NULL on error, otherwise 0-terminated printable UTF-8 string
  */
 static void
-process_resolved_address (void *cls,
-                         const char *address)
+process_resolved_address (void *cls, const char *address)
 {
   struct PrintContext *pc = cls;
 
   if (address == NULL)
-    {
-      pc->off--;
-      if (pc->off == 0)
-       dump_pc (pc);
-      return;
-    }
-  GNUNET_array_append (pc->address_list,
-                      pc->num_addresses,
-                      GNUNET_strdup (address));
+  {
+    pc->off--;
+    if (pc->off == 0)
+      dump_pc (pc);
+    return;
+  }
+  GNUNET_array_append (pc->address_list, pc->num_addresses,
+                       GNUNET_strdup (address));
 }
 
 
@@ -106,19 +96,16 @@ process_resolved_address (void *cls,
  * Iterator callback to go over all addresses.
  *
  * @param cls closure
- * @param tname name of the transport
+ * @param address the address
  * @param expiration expiration time
- * @param addr the address
- * @param addrlen length of the address
  * @return GNUNET_OK to keep the address and continue
  */
 static int
-count_address (void *cls,
-              const char *tname,
-              struct GNUNET_TIME_Absolute expiration,
-              const void *addr, size_t addrlen)
+count_address (void *cls, const struct GNUNET_HELLO_Address *address,
+               struct GNUNET_TIME_Absolute expiration)
 {
   struct PrintContext *pc = cls;
+
   pc->off++;
   return GNUNET_OK;
 }
@@ -128,81 +115,57 @@ count_address (void *cls,
  * Iterator callback to go over all addresses.
  *
  * @param cls closure
- * @param tname name of the transport
+ * @param address the address
  * @param expiration expiration time
- * @param addr the address
- * @param addrlen length of the address
  * @return GNUNET_OK to keep the address and continue
  */
 static int
-print_address (void *cls,
-              const char *tname,
-              struct GNUNET_TIME_Absolute expiration,
-              const void *addr, size_t addrlen)
+print_address (void *cls, const struct GNUNET_HELLO_Address *address,
+               struct GNUNET_TIME_Absolute expiration)
 {
   struct PrintContext *pc = cls;
-  GNUNET_TRANSPORT_address_lookup (sched,
-                                  cfg,
-                                  addr,
-                                  addrlen,
-                                  no_resolve,
-                                  tname,
-                                  GNUNET_TIME_UNIT_SECONDS,
-                                  &process_resolved_address,
-                                  pc);
+
+  GNUNET_TRANSPORT_address_to_string (cfg, address, no_resolve,
+                                      GNUNET_TIME_relative_multiply
+                                      (GNUNET_TIME_UNIT_SECONDS, 10),
+                                      &process_resolved_address, pc);
   return GNUNET_OK;
 }
 
 
 /**
  * Print information about the peer.
- * Currently prints the GNUNET_PeerIdentity, trust and the IP.
+ * Currently prints the GNUNET_PeerIdentity and the IP.
  * Could of course do more (e.g. resolve via DNS).
  */
 static void
-print_peer_info (void *cls,
-                 const struct GNUNET_PeerIdentity *peer,
-                 const struct GNUNET_HELLO_Message *hello, uint32_t trust)
+print_peer_info (void *cls, const struct GNUNET_PeerIdentity *peer,
+                 const struct GNUNET_HELLO_Message *hello, const char *err_msg)
 {
   struct GNUNET_CRYPTO_HashAsciiEncoded enc;
   struct PrintContext *pc;
 
-  if (peer == NULL)    
-    {
-      GNUNET_PEERINFO_disconnect (peerinfo);
-      switch (trust)
-       {
-       case 0:
-         break;
-       case 1:
-         fprintf (stderr,
-                  _("Timeout trying to interact with PEERINFO service\n"));
-         break;
-       case 2:
-         fprintf (stderr,
-                  _("Error in communication with PEERINFO service\n"));
-         break;
-       default:
-         GNUNET_break (0);
-         break;
-       }
-      return;    
-    }
-  if (be_quiet)
-    {
-      GNUNET_CRYPTO_hash_to_enc (&peer->hashPubKey, &enc);
-      printf ("%s\n", (const char *) &enc);
-      return;
-    }
+  if (peer == NULL)
+  {
+    if (err_msg != NULL)
+      FPRINTF (stderr, "%s",  _("Error in communication with PEERINFO service\n"));
+    GNUNET_PEERINFO_disconnect (peerinfo);
+    return;
+  }
+  if ((be_quiet) || (NULL == hello))
+  {
+    GNUNET_CRYPTO_hash_to_enc (&peer->hashPubKey, &enc);
+    printf ("%s\n", (const char *) &enc);
+    return;
+  }
   pc = GNUNET_malloc (sizeof (struct PrintContext));
-  pc->peer = *peer;  
-  pc->trust = trust;
+  pc->peer = *peer;
   GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &count_address, pc);
   if (0 == pc->off)
-    {
-      dump_pc (pc);
-      return;
-    }
+  {
+    dump_pc (pc);
+    return;
+  }
   GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &print_address, pc);
 }
 
@@ -211,16 +174,12 @@ print_peer_info (void *cls,
  * Main function that will be run by the scheduler.
  *
  * @param cls closure
- * @param s the scheduler to use
  * @param args remaining command-line arguments
  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
  * @param c configuration
  */
 static void
-run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *s,
-     char *const *args,
-     const char *cfgfile, 
+run (void *cls, char *const *args, const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *c)
 {
   struct GNUNET_CRYPTO_RsaPrivateKey *priv;
@@ -229,73 +188,55 @@ run (void *cls,
   struct GNUNET_CRYPTO_HashAsciiEncoded enc;
   char *fn;
 
-  sched = s;
   cfg = c;
+  if (args[0] != NULL)
+  {
+    FPRINTF (stderr, _("Invalid command line argument `%s'\n"), args[0]);
+    return;
+  }
   if (get_self != GNUNET_YES)
+  {
+    peerinfo = GNUNET_PEERINFO_connect (cfg);
+    if (peerinfo == NULL)
     {
-      peerinfo = GNUNET_PEERINFO_connect (sched, cfg);
-      if (peerinfo == NULL)
-       {
-         fprintf (stderr,
-                  _("Could not access PEERINFO service.  Exiting.\n"));
-         return;
-       }
-      (void) GNUNET_PEERINFO_iterate (peerinfo,
-                                     NULL,
-                                     0,
-                                     GNUNET_TIME_relative_multiply
-                                     (GNUNET_TIME_UNIT_SECONDS, 2),
-                                     &print_peer_info, NULL);
+      FPRINTF (stderr, "%s",  _("Could not access PEERINFO service.  Exiting.\n"));
+      return;
     }
+    GNUNET_PEERINFO_iterate (peerinfo, NULL,
+                             GNUNET_TIME_relative_multiply
+                             (GNUNET_TIME_UNIT_SECONDS, 5), &print_peer_info,
+                             NULL);
+  }
   else
+  {
+    if (GNUNET_OK !=
+        GNUNET_CONFIGURATION_get_value_filename (cfg, "GNUNETD", "HOSTKEY",
+                                                 &fn))
     {
-      if (GNUNET_OK !=
-          GNUNET_CONFIGURATION_get_value_filename (cfg,
-                                                   "GNUNETD",
-                                                   "HOSTKEY", &fn))
-       {
-          fprintf (stderr, 
-                  _("Could not find option `%s:%s' in configuration.\n"), 
-                  "GNUNETD",
-                  "HOSTKEYFILE");
-         return;
-       }
-      priv = GNUNET_CRYPTO_rsa_key_create_from_file (fn);
-      if (priv == NULL)
-        {
-          fprintf (stderr, _("Loading hostkey from `%s' failed.\n"), fn);
-          GNUNET_free (fn);
-          return;
-        }
+      FPRINTF (stderr, _("Could not find option `%s:%s' in configuration.\n"),
+               "GNUNETD", "HOSTKEYFILE");
+      return;
+    }
+    priv = GNUNET_CRYPTO_rsa_key_create_from_file (fn);
+    if (priv == NULL)
+    {
+      FPRINTF (stderr, _("Loading hostkey from `%s' failed.\n"), fn);
       GNUNET_free (fn);
-      GNUNET_CRYPTO_rsa_key_get_public (priv, &pub);
-      GNUNET_CRYPTO_rsa_key_free (priv);
-      GNUNET_CRYPTO_hash (&pub, sizeof (pub), &pid.hashPubKey);
-      GNUNET_CRYPTO_hash_to_enc (&pid.hashPubKey, &enc);
-      if (be_quiet)
-        printf ("%s\n", (char *) &enc);
-      else
-        printf (_("I am peer `%s'.\n"), (const char *) &enc);
+      return;
     }
+    GNUNET_free (fn);
+    GNUNET_CRYPTO_rsa_key_get_public (priv, &pub);
+    GNUNET_CRYPTO_rsa_key_free (priv);
+    GNUNET_CRYPTO_hash (&pub, sizeof (pub), &pid.hashPubKey);
+    GNUNET_CRYPTO_hash_to_enc (&pid.hashPubKey, &enc);
+    if (be_quiet)
+      printf ("%s\n", (char *) &enc);
+    else
+      printf (_("I am peer `%s'.\n"), (const char *) &enc);
+  }
 }
 
 
-/**
- * gnunet-peerinfo command line options
- */
-static struct GNUNET_GETOPT_CommandLineOption options[] = {
-  {'n', "numeric", NULL,
-   gettext_noop ("don't resolve host names"),
-   0, &GNUNET_GETOPT_set_one, &no_resolve},
-  {'q', "quiet", NULL,
-   gettext_noop ("output only the identity strings"),
-   0, &GNUNET_GETOPT_set_one, &be_quiet},
-  {'s', "self", NULL,
-   gettext_noop ("output our own identity only"),
-   0, &GNUNET_GETOPT_set_one, &get_self},
-  GNUNET_GETOPT_OPTION_END
-};
-
 /**
  * The main function to obtain peer information.
  *
@@ -306,10 +247,20 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
 int
 main (int argc, char *const *argv)
 {
+  static const struct GNUNET_GETOPT_CommandLineOption options[] = {
+    {'n', "numeric", NULL,
+     gettext_noop ("don't resolve host names"),
+     0, &GNUNET_GETOPT_set_one, &no_resolve},
+    {'q', "quiet", NULL,
+     gettext_noop ("output only the identity strings"),
+     0, &GNUNET_GETOPT_set_one, &be_quiet},
+    {'s', "self", NULL,
+     gettext_noop ("output our own identity only"),
+     0, &GNUNET_GETOPT_set_one, &get_self},
+    GNUNET_GETOPT_OPTION_END
+  };
   return (GNUNET_OK ==
-          GNUNET_PROGRAM_run (argc,
-                              argv,
-                              "gnunet-peerinfo",
+          GNUNET_PROGRAM_run (argc, argv, "gnunet-peerinfo",
                               gettext_noop ("Print information about peers."),
                               options, &run, NULL)) ? 0 : 1;
 }