make clang static analysis happy
[oweals/gnunet.git] / src / fs / fs_unindex.c
index 2d16e9aeea725f388f7e2576db6a484e754077ce..5d1e7c8f09f617ed8a27acb3ab7c98c88970ffd2 100644 (file)
 
 /**
  * @file fs/fs_unindex.c
- * @author Krista Bennett
+ * @author Krista Grothoff
  * @author Christian Grothoff
  * @brief Unindex file.
- *
- * TODO:
- * - code cleanup (share more with upload.c)
  */
 #include "platform.h"
 #include "gnunet_constants.h"
@@ -78,80 +75,13 @@ unindex_reader (void *cls,
 }
 
 
-/**
- * Continuation called to notify client about result of the
- * datastore removal operation.
- *
- * @param cls closure
- * @param success GNUNET_SYSERR on failure
- * @param msg NULL on success, otherwise an error message
- */
-static void
-process_cont (void *cls,
-             int success,
-             const char *msg)
-{
-  struct GNUNET_FS_UnindexContext *uc = cls;
-  // FIXME: may want to check for errors
-  // OTHER than content-not-present!
-  GNUNET_FS_tree_encoder_next (uc->tc);
-}
-
-
-/**
- * Function called asking for the current (encoded)
- * block to be processed.  After processing the
- * client should either call "GNUNET_FS_tree_encode_next"
- * or (on error) "GNUNET_FS_tree_encode_finish".
- *
- * @param cls closure
- * @param query the query for the block (key for lookup in the datastore)
- * @param offset offset of the block
- * @param type type of the block (IBLOCK or DBLOCK)
- * @param block the (encrypted) block
- * @param block_size size of block (in bytes)
- */
-static void 
-unindex_process (void *cls,
-                const GNUNET_HashCode *query,
-                uint64_t offset,
-                unsigned int type,
-                const void *block,
-                uint16_t block_size)
-{
-  struct GNUNET_FS_UnindexContext *uc = cls;
-  uint32_t size;
-  const void *data;
-  struct OnDemandBlock odb;
-
-  if (type != GNUNET_DATASTORE_BLOCKTYPE_DBLOCK)
-    {
-      size = block_size;
-      data = block;
-    }
-  else /* on-demand encoded DBLOCK */
-    {
-      size = sizeof(struct OnDemandBlock);
-      odb.offset = offset;
-      odb.file_id = uc->file_id;
-      data = &odb;
-    }
-  GNUNET_DATASTORE_remove (uc->dsh,
-                          query,
-                          block_size,
-                          block,
-                          &process_cont,
-                          uc,
-                          GNUNET_CONSTANTS_SERVICE_TIMEOUT);
-}
-
-
 /**
  * Fill in all of the generic fields for 
  * an unindex event.
  *
- * @param pc structure to fill in
- * @param sc overall unindex context
+ * @param pi structure to fill in
+ * @param uc overall unindex context
+ * @param offset where we are in the file (for progress)
  */
 static void
 make_unindex_status (struct GNUNET_FS_ProgressInfo *pi,
@@ -166,8 +96,8 @@ make_unindex_status (struct GNUNET_FS_ProgressInfo *pi,
     = GNUNET_TIME_calculate_eta (uc->start_time,
                                 offset,
                                 uc->file_size);
-  pi->value.publish.duration = GNUNET_TIME_absolute_get_duration (uc->start_time);
-  pi->value.publish.completed = offset;
+  pi->value.unindex.duration = GNUNET_TIME_absolute_get_duration (uc->start_time);
+  pi->value.unindex.completed = offset;
 }
 
 
@@ -226,6 +156,79 @@ signal_unindex_error (struct GNUNET_FS_UnindexContext *uc,
 }
 
 
+/**
+ * Continuation called to notify client about result of the
+ * datastore removal operation.
+ *
+ * @param cls closure
+ * @param success GNUNET_SYSERR on failure
+ * @param msg NULL on success, otherwise an error message
+ */
+static void
+process_cont (void *cls,
+             int success,
+             const char *msg)
+{
+  struct GNUNET_FS_UnindexContext *uc = cls;
+  if (success == GNUNET_SYSERR)
+    {
+      signal_unindex_error (uc,
+                           msg);
+      return;
+    }
+  
+  GNUNET_FS_tree_encoder_next (uc->tc);
+}
+
+
+/**
+ * Function called asking for the current (encoded)
+ * block to be processed.  After processing the
+ * client should either call "GNUNET_FS_tree_encode_next"
+ * or (on error) "GNUNET_FS_tree_encode_finish".
+ *
+ * @param cls closure
+ * @param query the query for the block (key for lookup in the datastore)
+ * @param offset offset of the block
+ * @param type type of the block (IBLOCK or DBLOCK)
+ * @param block the (encrypted) block
+ * @param block_size size of block (in bytes)
+ */
+static void 
+unindex_process (void *cls,
+                const GNUNET_HashCode *query,
+                uint64_t offset,
+                uint32_t type,
+                const void *block,
+                uint16_t block_size)
+{
+  struct GNUNET_FS_UnindexContext *uc = cls;
+  uint32_t size;
+  const void *data;
+  struct OnDemandBlock odb;
+
+  if (type != GNUNET_DATASTORE_BLOCKTYPE_DBLOCK)
+    {
+      size = block_size;
+      data = block;
+    }
+  else /* on-demand encoded DBLOCK */
+    {
+      size = sizeof(struct OnDemandBlock);
+      odb.offset = GNUNET_htonll (offset);
+      odb.file_id = uc->file_id;
+      data = &odb;
+    }
+  GNUNET_DATASTORE_remove (uc->dsh,
+                          query,
+                          size,
+                          data,
+                          &process_cont,
+                          uc,
+                          GNUNET_CONSTANTS_SERVICE_TIMEOUT);
+}
+
+
 /**
  * Function called when the tree encoder has
  * processed all blocks.  Clean up.
@@ -281,7 +284,7 @@ process_fs_response (void *cls,
 {
   struct GNUNET_FS_UnindexContext *uc = cls;
 
-  GNUNET_CLIENT_disconnect (uc->client);
+  GNUNET_CLIENT_disconnect (uc->client, GNUNET_NO);
   uc->client = NULL;
   if (uc->state != UNINDEX_STATE_FS_NOTIFY) 
     {
@@ -313,7 +316,8 @@ process_fs_response (void *cls,
       return;
     }
   uc->fh = GNUNET_DISK_file_open (uc->filename,
-                                 GNUNET_DISK_OPEN_READ);
+                                 GNUNET_DISK_OPEN_READ,
+                                 GNUNET_DISK_PERM_NONE);
   if (NULL == uc->fh)
     {
       GNUNET_DATASTORE_disconnect (uc->dsh, GNUNET_NO);
@@ -369,11 +373,13 @@ process_hash (void *cls,
   req.header.type = htons (GNUNET_MESSAGE_TYPE_FS_UNINDEX);
   req.reserved = 0;
   req.file_id = *file_id;
-  GNUNET_CLIENT_transmit_and_get_response (uc->client,
-                                          &req.header,
-                                          GNUNET_CONSTANTS_SERVICE_TIMEOUT,
-                                          &process_fs_response,
-                                          uc);
+  GNUNET_break (GNUNET_OK == 
+               GNUNET_CLIENT_transmit_and_get_response (uc->client,
+                                                        &req.header,
+                                                        GNUNET_CONSTANTS_SERVICE_TIMEOUT,
+                                                        GNUNET_YES,
+                                                        &process_fs_response,
+                                                        uc));
 }
 
 
@@ -382,11 +388,13 @@ process_hash (void *cls,
  *
  * @param h handle to the file sharing subsystem
  * @param filename file to unindex
+ * @param cctx initial value for the client context
  * @return NULL on error, otherwise handle 
  */
 struct GNUNET_FS_UnindexContext *
-GNUNET_FS_unindex (struct GNUNET_FS_Handle *h,
-                  const char *filename)
+GNUNET_FS_unindex_start (struct GNUNET_FS_Handle *h,
+                        const char *filename,
+                        void *cctx)
 {
   struct GNUNET_FS_UnindexContext *ret;
   struct GNUNET_FS_ProgressInfo pi;
@@ -402,6 +410,7 @@ GNUNET_FS_unindex (struct GNUNET_FS_Handle *h,
   ret->filename = GNUNET_strdup (filename);
   ret->start_time = GNUNET_TIME_absolute_get ();
   ret->file_size = size;
+  ret->client_info = cctx;
 
   // FIXME: make persistent!
   pi.status = GNUNET_FS_STATUS_UNINDEX_START;
@@ -412,7 +421,6 @@ GNUNET_FS_unindex (struct GNUNET_FS_Handle *h,
               &pi);
   GNUNET_CRYPTO_hash_file (h->sched,
                           GNUNET_SCHEDULER_PRIORITY_IDLE,
-                          GNUNET_NO,
                           filename,
                           HASHING_BLOCKSIZE,
                           &process_hash,