Tell core that we want to have this packet delivered
[oweals/gnunet.git] / src / peerinfo-tool / gnunet-peerinfo.c
index c056b390e13bf8b978e7fa43ea623e0e32f6b641..1963d6a98c0bd161cb9494f93575913cb7530980 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,13 +37,42 @@ 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;
 
-#define FIXME 0
+struct PrintContext
+{
+  struct GNUNET_PeerIdentity peer;
+  char **address_list;
+  unsigned int num_addresses;
+  uint32_t off;
+};
+
+
+static void
+dump_pc (struct PrintContext *pc)
+{
+  struct GNUNET_CRYPTO_HashAsciiEncoded enc;
+  unsigned int i;
+
+  GNUNET_CRYPTO_hash_to_enc (&pc->peer.hashPubKey, &enc);
+  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_free (pc);
+}
+
 
-#if FIXME
 /**
  * Function to call with a human-readable format of an address
  *
@@ -51,18 +80,45 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg;
  * @param address NULL on error, otherwise 0-terminated printable UTF-8 string
  */
 static void
-print_resolved_address (void *cls,
-                       const char *address)
+process_resolved_address (void *cls,
+                         const char *address)
 {
-  /* FIXME: need to buffer output from all requests and print it at
-     once, otherwise we mix results... */
+  struct PrintContext *pc = cls;
+
   if (address == NULL)
     {
+      pc->off--;
+      if (pc->off == 0)
+       dump_pc (pc);
       return;
     }
-  fprintf (stderr, " %s\n", address);
+  GNUNET_array_append (pc->address_list,
+                      pc->num_addresses,
+                      GNUNET_strdup (address));
 }
-#endif
+
+
+/**
+ * Iterator callback to go over all addresses.
+ *
+ * @param cls closure
+ * @param tname name of the transport
+ * @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, uint16_t addrlen)
+{
+  struct PrintContext *pc = cls;
+  pc->off++;
+  return GNUNET_OK;
+}
+
 
 /**
  * Iterator callback to go over all addresses.
@@ -78,59 +134,69 @@ static int
 print_address (void *cls,
               const char *tname,
               struct GNUNET_TIME_Absolute expiration,
-              const void *addr, size_t addrlen)
+              const void *addr, uint16_t addrlen)
 {
-#if FIXME
-  GNUNET_TRANSPORT_address_lookup (sched,
-                                  cfg,
+  struct PrintContext *pc = cls;
+  GNUNET_TRANSPORT_address_lookup (cfg,
                                   addr,
                                   addrlen,
                                   no_resolve,
                                   tname,
                                   GNUNET_TIME_UNIT_SECONDS,
-                                  &print_resolved_address,
-                                  NULL);
-#endif
+                                  &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)
+                 const struct GNUNET_HELLO_Message *hello)
 {
   struct GNUNET_CRYPTO_HashAsciiEncoded enc;
+  struct PrintContext *pc;
 
   if (peer == NULL)    
-    return;    
-  GNUNET_CRYPTO_hash_to_enc (&peer->hashPubKey, &enc);
+    {
+      GNUNET_PEERINFO_disconnect (peerinfo);
+      fprintf (stderr,
+              _("Error in communication with PEERINFO service\n"));
+      return;    
+    }
   if (be_quiet)
     {
+      GNUNET_CRYPTO_hash_to_enc (&peer->hashPubKey, &enc);
       printf ("%s\n", (const char *) &enc);
       return;
     }
-  printf (_("Peer `%s' with trust %8u\n"), (const char *) &enc, trust);
-  GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &print_address, NULL);
+  pc = GNUNET_malloc (sizeof (struct PrintContext));
+  pc->peer = *peer;  
+  GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &count_address, pc);
+  if (0 == pc->off)
+    {
+      dump_pc (pc);
+      return;
+    }
+  GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &print_address, pc);
 }
 
+
 /**
  * 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, 
      const struct GNUNET_CONFIGURATION_Handle *c)
@@ -141,14 +207,25 @@ 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)
     {
-      (void) GNUNET_PEERINFO_iterate (cfg,
-                                     sched,
+      peerinfo = GNUNET_PEERINFO_connect (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);
@@ -186,22 +263,6 @@ run (void *cls,
 }
 
 
-/**
- * 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.
  *
@@ -212,6 +273,18 @@ 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,