Merge branch 'master' of git+ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / fs / gnunet-directory.c
index fe2ae8af66508b573f6ced3a73f729d7554ebd40..dabf554fbd9015c1d29eb8686206ec51b0a072fa 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2001, 2002, 2004, 2005, 2006, 2007, 2009 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2009 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
 
      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
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -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
 
      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 fs/gnunet-directory.c
 */
 /**
  * @file fs/gnunet-directory.c
@@ -31,28 +31,44 @@ static int ret;
  * Print a meta data entry.
  *
  * @param cls closure (unused)
  * Print a meta data entry.
  *
  * @param cls closure (unused)
+ * @param plugin_name name of the plugin that generated the meta data
  * @param type type of the keyword
  * @param format format of data
  * @param data_mime_type mime type of data
  * @param data value of the meta data
  * @param type type of the keyword
  * @param format format of data
  * @param data_mime_type mime type of data
  * @param data value of the meta data
- * @param data_size number of bytes in data
+ * @param data_size number of bytes in @a data
  * @return always 0 (to continue iterating)
  */
 static int
 item_printer (void *cls,
  * @return always 0 (to continue iterating)
  */
 static int
 item_printer (void *cls,
-             const char *plugin_name,
-             enum EXTRACTOR_MetaType type, 
-             enum EXTRACTOR_MetaFormat format,
-             const char *data_mime_type,
-             const char *data,
-             size_t data_size)
+              const char *plugin_name,
+              enum EXTRACTOR_MetaType type,
+              enum EXTRACTOR_MetaFormat format,
+              const char *data_mime_type,
+              const char *data,
+              size_t data_size)
 {
 {
-  if ( (format != EXTRACTOR_METAFORMAT_UTF8) &&
-       (format != EXTRACTOR_METAFORMAT_C_STRING) )
+  if (type == EXTRACTOR_METATYPE_GNUNET_FULL_DATA)
+  {
+    printf (_("\t<original file embedded in %u bytes of meta data>\n"),
+            (unsigned int) data_size);
     return 0;
     return 0;
+  }
+  if ((format != EXTRACTOR_METAFORMAT_UTF8) &&
+      (format != EXTRACTOR_METAFORMAT_C_STRING))
+    return 0;
+  if (type == EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME)
+    return 0;
+#if HAVE_LIBEXTRACTOR
   printf ("\t%20s: %s\n",
           dgettext (LIBEXTRACTOR_GETTEXT_DOMAIN,
   printf ("\t%20s: %s\n",
           dgettext (LIBEXTRACTOR_GETTEXT_DOMAIN,
-                    EXTRACTOR_metatype_to_string (type)), data);
+                    EXTRACTOR_metatype_to_string (type)),
+    data);
+#else
+  printf ("\t%20d: %s\n",
+          type,
+          data);
+#endif
   return 0;
 }
 
   return 0;
 }
 
@@ -74,21 +90,31 @@ item_printer (void *cls,
  * @param data data available for the file (length bytes)
  */
 static void
  * @param data data available for the file (length bytes)
  */
 static void
-print_entry (void *cls,
-            const char *filename,
-            const struct GNUNET_FS_Uri *uri,
-            const struct GNUNET_CONTAINER_MetaData *meta,
-            size_t length,
-            const void *data)
+print_entry (void *cls, const char *filename, const struct GNUNET_FS_Uri *uri,
+             const struct GNUNET_CONTAINER_MetaData *meta, size_t length,
+             const void *data)
 {
   char *string;
 {
   char *string;
-
+  char *name;
+
+  name =
+      GNUNET_CONTAINER_meta_data_get_by_type (meta,
+                                              EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME);
+  if (uri == NULL)
+  {
+    printf (_("Directory `%s' meta data:\n"), name ? name : "");
+    GNUNET_CONTAINER_meta_data_iterate (meta, &item_printer, NULL);
+    printf ("\n");
+    printf (_("Directory `%s' contents:\n"), name ? name : "");
+    GNUNET_free_non_null (name);
+    return;
+  }
   string = GNUNET_FS_uri_to_string (uri);
   string = GNUNET_FS_uri_to_string (uri);
-  printf ("%s:\n", string);
+  printf ("%s (%s):\n", name ? name : "", string);
   GNUNET_free (string);
   GNUNET_free (string);
-  GNUNET_CONTAINER_meta_data_iterate (meta,
-                                     &item_printer,
-                                     NULL);
+  GNUNET_CONTAINER_meta_data_iterate (meta, &item_printer, NULL);
+  printf ("\n");
+  GNUNET_free_non_null (name);
 }
 
 
 }
 
 
@@ -96,16 +122,12 @@ print_entry (void *cls,
  * Main function that will be run by the scheduler.
  *
  * @param cls closure
  * Main function that will be run by the scheduler.
  *
  * @param cls closure
- * @param sched the scheduler to use
  * @param args remaining command-line arguments
  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
  * @param cfg configuration
  */
 static void
  * @param args remaining command-line arguments
  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
  * @param cfg configuration
  */
 static void
-run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *sched,
-     char *const *args,
-     const char *cfgfile,
+run (void *cls, char *const *args, const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
   struct GNUNET_DISK_MapHandle *map;
      const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
   struct GNUNET_DISK_MapHandle *map;
@@ -117,53 +139,38 @@ run (void *cls,
   int i;
 
   if (NULL == args[0])
   int i;
 
   if (NULL == args[0])
-    {
-      fprintf (stderr,
-              _("You must specify a filename to inspect."));
-      ret = 1;
-      return;
-    }
+  {
+    FPRINTF (stderr, "%s",  _("You must specify a filename to inspect.\n"));
+    ret = 1;
+    return;
+  }
   i = 0;
   while (NULL != (filename = args[i++]))
   i = 0;
   while (NULL != (filename = args[i++]))
+  {
+    if ((GNUNET_OK != GNUNET_DISK_file_size (filename, &size, GNUNET_YES, GNUNET_YES)) ||
+        (NULL ==
+         (h =
+          GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_READ,
+                                 GNUNET_DISK_PERM_NONE))))
     {
     {
-      if ( (GNUNET_OK !=
-           GNUNET_DISK_file_size (filename,
-                                  &size,
-                                  GNUNET_YES)) ||
-          (NULL == (h = GNUNET_DISK_file_open (filename,
-                                               GNUNET_DISK_OPEN_READ,
-                                               GNUNET_DISK_PERM_NONE))) )
-       {
-         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                     _("Failed to read directory `%s'\n"),
-                     filename);
-         ret = 1;
-         continue;
-       }
-      len = (size_t) size;
-      data = GNUNET_DISK_file_map (h,
-                                  &map,
-                                  GNUNET_DISK_MAP_TYPE_READ,
-                                  len);
-      GNUNET_assert (NULL != data);
-      GNUNET_FS_directory_list_contents (len,
-                                        data,
-                                        0, 
-                                        &print_entry,
-                                        NULL);
-      GNUNET_DISK_file_unmap (map);
-      GNUNET_DISK_file_close (h);
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Failed to read directory `%s'\n"),
+                  filename);
+      ret = 1;
+      continue;
     }
     }
+    len = (size_t) size;
+    data = GNUNET_DISK_file_map (h, &map, GNUNET_DISK_MAP_TYPE_READ, len);
+    GNUNET_assert (NULL != data);
+    if (GNUNET_OK != GNUNET_FS_directory_list_contents (len, data, 0, &print_entry, NULL))
+      fprintf (stdout, _("`%s' is not a GNUnet directory\n"),
+              filename);
+    else
+      printf ("\n");
+    GNUNET_DISK_file_unmap (map);
+    GNUNET_DISK_file_close (h);
+  }
 }
 
 }
 
-/**
- * gnunet-directory command line options
- */
-static struct GNUNET_GETOPT_CommandLineOption options[] = {
-  GNUNET_GETOPT_OPTION_END
-};
-
-
 /**
  * The main function to inspect GNUnet directories.
  *
 /**
  * The main function to inspect GNUnet directories.
  *
@@ -174,13 +181,20 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
 int
 main (int argc, char *const *argv)
 {
 int
 main (int argc, char *const *argv)
 {
-  return (GNUNET_OK ==
-          GNUNET_PROGRAM_run (argc,
-                              argv,
-                              "gnunet-directory",
-                              gettext_noop
-                              ("Display GNUnet directories."),
-                              options, &run, NULL)) ? ret : 1;
+  static struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_OPTION_END
+  };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
+  ret = (GNUNET_OK ==
+        GNUNET_PROGRAM_run (argc, argv, "gnunet-directory [OPTIONS] FILENAME",
+                            gettext_noop
+                            ("Display contents of a GNUnet directory"),
+                            options, &run, NULL)) ? ret : 1;
+  GNUNET_free ((void*) argv);
+  return ret;
 }
 
 /* end of gnunet-directory.c */
 }
 
 /* end of gnunet-directory.c */