-help seaspider some more
[oweals/gnunet.git] / src / fs / gnunet-directory.c
index 1b17f69d24dc2f99f2100b58aa15d42bfa462960..c722f57ff232c581719194460a51449799b19d57 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
 
      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
@@ -40,16 +40,20 @@ static int ret;
  * @return always 0 (to continue iterating)
  */
 static int
  * @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)
+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)
 {
 {
-  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;
+  }
+  if ((format != EXTRACTOR_METAFORMAT_UTF8) &&
+      (format != EXTRACTOR_METAFORMAT_C_STRING))
+    return 0;
+  if (type == EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME)
     return 0;
   printf ("\t%20s: %s\n",
           dgettext (LIBEXTRACTOR_GETTEXT_DOMAIN,
     return 0;
   printf ("\t%20s: %s\n",
           dgettext (LIBEXTRACTOR_GETTEXT_DOMAIN,
@@ -75,30 +79,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)
   if (uri == NULL)
-    {
-      printf (_("Directory summary:\n"));
-      GNUNET_CONTAINER_meta_data_iterate (meta,
-                                         &item_printer,
-                                         NULL);
-      printf ("\n");
-      return;
-    }
+  {
+    printf (_("Directory `%s' meta data:\n"), name);
+    GNUNET_CONTAINER_meta_data_iterate (meta, &item_printer, NULL);
+    printf ("\n");
+    printf (_("Directory `%s' contents:\n"), name);
+    GNUNET_free (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, 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 (name);
 }
 
 
 }
 
 
@@ -106,16 +111,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;
@@ -127,43 +128,36 @@ 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);
+  }
 }
 
 /**
 }
 
 /**
@@ -180,11 +174,9 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_END
   };
   return (GNUNET_OK ==
     GNUNET_GETOPT_OPTION_END
   };
   return (GNUNET_OK ==
-          GNUNET_PROGRAM_run (argc,
-                              argv,
-                              "gnunet-directory",
+          GNUNET_PROGRAM_run (argc, argv, "gnunet-directory [OPTIONS] FILENAME",
                               gettext_noop
                               gettext_noop
-                              ("Display GNUnet directories."),
+                              ("Display contents of a GNUnet directory"),
                               options, &run, NULL)) ? ret : 1;
 }
 
                               options, &run, NULL)) ? ret : 1;
 }