plane hacking
[oweals/gnunet.git] / src / fs / fs.h
index b3bf24e2ada5828c9906c4d5ca62c4cbf5a98f63..edbde19daf131a4aa7a97095d36aac5577228d05 100644 (file)
@@ -5,7 +5,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
@@ -31,6 +31,7 @@
 #include "gnunet_datastore_service.h"
 #include "gnunet_fs_service.h"
 #include "gnunet_block_lib.h"
+#include "block_fs.h"
 
 /**
  * Maximum size of the datastore queue for P2P operations.
@@ -1301,17 +1302,38 @@ struct GNUNET_FS_PublishContext
    */
   struct GNUNET_FS_FileInformation *fi_pos;
 
+  /**
+   * Non-null if we are currently hashing a file.
+   */
+  struct GNUNET_CRYPTO_FileHashContext *fhc;
+
   /**
    * Connection to the datastore service.
    */
   struct GNUNET_DATASTORE_Handle *dsh;
 
+  /**
+   * Queue entry for reservation/unreservation.
+   */
+  struct GNUNET_DATASTORE_QueueEntry *qre;
+
   /**
    * ID of the task performing the upload. NO_TASK if the upload has
    * completed.
    */
   GNUNET_SCHEDULER_TaskIdentifier upload_task;
 
+  /**
+   * Storage space to reserve for the operation.
+   */
+  uint64_t reserve_space;
+
+  /**
+   * Overall number of entries to reserve for the
+   * publish operation.
+   */
+  uint32_t reserve_entries;
+
   /**
    * Typically GNUNET_NO.  Set to GNUNET_YES if "upload_task" is
    * GNUNET_SCHEDULER_NO_TASK and we're waiting for a response from
@@ -1811,16 +1833,78 @@ struct GNUNET_FS_DownloadContext
    */
   int has_finished;
 
+  /**
+   * Have we tried (and failed) to find matching full
+   * data from the meta data yet?
+   */
+  int tried_full_data;
 };
 
+
+/**
+ * Information about an (updateable) node in the
+ * namespace.
+ */
+struct NamespaceUpdateNode
+{
+  /**
+   * Identifier for this node.
+   */
+  char *id;
+
+  /**
+   * Identifier of children of this node.
+   */
+  char *update;
+
+  /**
+   * Metadata for this entry.
+   */
+  struct GNUNET_CONTAINER_MetaData *md;
+
+  /**
+   * URI of this entry in the namespace.
+   */
+  struct GNUNET_FS_Uri *uri;
+
+  /**
+   * Namespace update generation ID.  Used to ensure
+   * freshness of the scc_id.
+   */
+  unsigned int nug;
+  
+  /**
+   * SCC this entry belongs to (if nug is current).
+   */
+  unsigned int scc_id;
+
+};
+
+
 struct GNUNET_FS_Namespace
 {
 
+  /**
+   * Handle to the FS service context.
+   */
+  struct GNUNET_FS_Handle *h;
+  
+  /**
+   * Array with information about nodes in the namespace.
+   */
+  struct NamespaceUpdateNode **update_nodes;
+
   /**
    * Private key for the namespace.
    */
   struct GNUNET_CRYPTO_RsaPrivateKey *key;
 
+  /**
+   * Hash map mapping identifiers of update nodes
+   * to the update nodes (initialized on-demand).
+   */
+  struct GNUNET_CONTAINER_MultiHashMap *update_map;
+
   /**
    * Name of the file with the private key.
    */
@@ -1831,10 +1915,20 @@ struct GNUNET_FS_Namespace
    */ 
   char *name;
 
+  /**
+   * Size of the update nodes array.
+   */
+  unsigned int update_node_count;
+
   /**
    * Reference counter.
    */
   unsigned int rc;
+
+  /**
+   * Generator for unique nug numbers.
+   */
+  unsigned int nug_gen;
 };
 
 
@@ -1859,6 +1953,11 @@ struct IndexStartMessage
    */
   struct GNUNET_MessageHeader header;
 
+  /**
+   * For alignment.
+   */
+  uint32_t reserved GNUNET_PACKED;
+
   /**
    * ID of device containing the file, as seen by the client.  This
    * device ID is obtained using a call like "statvfs" (and converting
@@ -1866,7 +1965,7 @@ struct IndexStartMessage
    * OS does not support this, in which case the service must do a
    * full hash recomputation.
    */
-  uint32_t device GNUNET_PACKED;
+  uint64_t device GNUNET_PACKED;
   
   /**
    * Inode of the file on the given device, as seen by the client
@@ -2123,6 +2222,32 @@ struct PutMessage
 };
 
 
+/**
+ * Message send by a peer that wants to be excluded
+ * from migration for a while.
+ */
+struct MigrationStopMessage
+{
+  /**
+   * Message type will be 
+   * GNUNET_MESSAGE_TYPE_FS_MIGRATION_STOP.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Always zero.
+   */
+  uint32_t reserved GNUNET_PACKED;
+
+  /**
+   * How long should the block last?
+   */
+  struct GNUNET_TIME_RelativeNBO duration;
+
+};
+
+
+
 #endif
 
 /* end of fs.h */