shutdown callback
[oweals/gnunet.git] / src / fs / fs_download.c
index dca419fd35a59be53cbcf629d5def41810c0a4dd..92c4b831d5b06b58990fa9d59a167645cacf91f9 100644 (file)
@@ -170,6 +170,7 @@ GNUNET_FS_download_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
     = GNUNET_TIME_calculate_eta (dc->start_time,
                                 dc->completed,
                                 dc->length);
+  pi->value.download.is_active = (dc->client == NULL) ? GNUNET_NO : GNUNET_YES;
   if (0 == (dc->options & GNUNET_FS_DOWNLOAD_IS_PROBE))
     dc->client_info = dc->h->upcb (dc->h->upcb_cls,
                                   pi);
@@ -330,15 +331,23 @@ schedule_block_download (struct GNUNET_FS_DownloadContext *dc,
          GNUNET_HashCode query;
 
          GNUNET_CRYPTO_hash_to_aes_key (&key, &sk, &iv);
-         GNUNET_CRYPTO_aes_encrypt (block, len,
-                                    &sk,
-                                    &iv,
-                                    enc);
+         if (-1 == GNUNET_CRYPTO_aes_encrypt (block, len,
+                                              &sk,
+                                              &iv,
+                                              enc))
+           {
+             GNUNET_break (0);
+             goto do_download;
+           }
          GNUNET_CRYPTO_hash (enc, len, &query);
          if (0 == memcmp (&query,
                           &chk->query,
                           sizeof (GNUNET_HashCode)))
            {
+#if DEBUG_DOWNLOAD
+             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                         "Matching block already present, no need for download!\n");
+#endif
              /* already got it! */
              prc.dc = dc;
              prc.data = enc;
@@ -360,6 +369,7 @@ schedule_block_download (struct GNUNET_FS_DownloadContext *dc,
          return;
        }
     }
+ do_download:
   if (fh != NULL)
     GNUNET_break (GNUNET_OK == GNUNET_DISK_file_close (fh));
   if (depth < dc->treedepth)
@@ -373,12 +383,18 @@ schedule_block_download (struct GNUNET_FS_DownloadContext *dc,
 
   if ( (dc->th == NULL) &&
        (dc->client != NULL) )
-    dc->th = GNUNET_CLIENT_notify_transmit_ready (dc->client,
-                                                 sizeof (struct SearchMessage),
-                                                 GNUNET_CONSTANTS_SERVICE_TIMEOUT,
-                                                 GNUNET_NO,
-                                                 &transmit_download_request,
-                                                 dc);
+    {
+#if DEBUG_DOWNLOAD
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                 "Asking for transmission to FS service\n");
+#endif
+      dc->th = GNUNET_CLIENT_notify_transmit_ready (dc->client,
+                                                   sizeof (struct SearchMessage),
+                                                   GNUNET_CONSTANTS_SERVICE_TIMEOUT,
+                                                   GNUNET_NO,
+                                                   &transmit_download_request,
+                                                   dc);
+    }
 }
 
 
@@ -905,11 +921,16 @@ process_result_with_request (void *cls,
       ppos = ppos->next;
     }
   GNUNET_CRYPTO_hash_to_aes_key (&sm->chk.key, &skey, &iv);
-  GNUNET_CRYPTO_aes_decrypt (prc->data,
-                            prc->size,
-                            &skey,
-                            &iv,
-                            pt);
+  if (-1 == GNUNET_CRYPTO_aes_decrypt (prc->data,
+                                      prc->size,
+                                      &skey,
+                                      &iv,
+                                      pt))
+    {
+      GNUNET_break (0);
+      dc->emsg = GNUNET_strdup ("internal error decrypting content");
+      goto signal_error;
+    }
   off = compute_disk_offset (GNUNET_ntohll (dc->uri->data.chk.file_length),
                             sm->offset,
                             sm->depth,
@@ -1202,6 +1223,10 @@ transmit_download_request (void *cls,
   dc->th = NULL;
   if (NULL == buf)
     {
+#if DEBUG_DOWNLOAD
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                 "Transmitting download request failed, trying to reconnect\n");
+#endif
       try_reconnect (dc);
       return 0;
     }
@@ -1325,6 +1350,10 @@ try_reconnect (struct GNUNET_FS_DownloadContext *dc)
   
   if (NULL != dc->client)
     {
+#if DEBUG_DOWNLOAD
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                 "Moving all requests back to pending list\n");
+#endif
       if (NULL != dc->th)
        {
          GNUNET_CLIENT_notify_transmit_ready_cancel (dc->th);
@@ -1336,6 +1365,10 @@ try_reconnect (struct GNUNET_FS_DownloadContext *dc)
       GNUNET_CLIENT_disconnect (dc->client, GNUNET_NO);
       dc->client = NULL;
     }
+#if DEBUG_DOWNLOAD
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Will try to reconnect in 1s\n");
+#endif
   dc->task
     = GNUNET_SCHEDULER_add_delayed (dc->h->sched,
                                    GNUNET_TIME_UNIT_SECONDS,
@@ -1625,7 +1658,8 @@ GNUNET_FS_download_start_from_search (struct GNUNET_FS_Handle *h,
   struct GNUNET_FS_ProgressInfo pi;
   struct GNUNET_FS_DownloadContext *dc;
 
-  if (sr->download != NULL)
+  if ( (sr == NULL) ||
+       (sr->download != NULL) )
     {
       GNUNET_break (0);
       return NULL;