gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r11166 - in gnunet: . src/fs


From: gnunet
Subject: [GNUnet-SVN] r11166 - in gnunet: . src/fs
Date: Mon, 3 May 2010 21:52:40 +0200

Author: grothoff
Date: 2010-05-03 21:52:40 +0200 (Mon, 03 May 2010)
New Revision: 11166

Modified:
   gnunet/TODO
   gnunet/src/fs/fs.c
   gnunet/src/fs/fs.h
   gnunet/src/fs/fs_download.c
Log:
download deserialization and not keeping a file handle open per active download

Modified: gnunet/TODO
===================================================================
--- gnunet/TODO 2010-05-03 16:39:34 UTC (rev 11165)
+++ gnunet/TODO 2010-05-03 19:52:40 UTC (rev 11166)
@@ -1,7 +1,5 @@
 0.9.0pre1:
 * FS: [CG]
-  - resume signalling for search/download must be recursive!
-  - deserialization code (download)
   - serialization code (download)
   - linking of downloads to searches (expose opaque struct SearchResult;
     allow starting download based on search result (new API):
@@ -11,6 +9,7 @@
     => expose link to search result in download events (including search 
result's
        client-info pointer!)
   - generate SUSPEND events (publish, unindex, search, download)
+  - fix 'start_time' time stamps (search, publish, unindex, download)
   - actually call 'sync' functions (publish, unindex, search, download)
   - code review:
     => refactor fs.c to join common code segments!

Modified: gnunet/src/fs/fs.c
===================================================================
--- gnunet/src/fs/fs.c  2010-05-03 16:39:34 UTC (rev 11165)
+++ gnunet/src/fs/fs.c  2010-05-03 19:52:40 UTC (rev 11166)
@@ -28,6 +28,7 @@
 #include "gnunet_util_lib.h"
 #include "gnunet_fs_service.h"
 #include "fs.h"
+#include "fs_tree.h"
 
 
 /**
@@ -1767,6 +1768,71 @@
 
 
 /**
+ * Send the 'resume' signal to the callback; also actually
+ * resume the download (put it in the queue).  Does this
+ * recursively for the top-level download and all child
+ * downloads.
+ * 
+ * @param dc download to resume
+ */
+static void
+signal_download_resume (struct GNUNET_FS_DownloadContext *dc)
+{
+  struct GNUNET_FS_DownloadContext *dcc;
+  struct GNUNET_FS_ProgressInfo pi;
+  
+  pi.status = GNUNET_FS_STATUS_DOWNLOAD_RESUME;
+  pi.value.download.specifics.resume.meta = dc->meta;
+  pi.value.download.specifics.resume.message = dc->emsg;
+  GNUNET_FS_download_make_status_ (&pi,
+                                  dc);
+  dcc = dc->child_head;
+  while (NULL != dcc)
+    {
+      signal_download_resume (dcc);
+      dcc = dcc->next;
+    }
+  if (dc->pending != NULL)
+    GNUNET_FS_download_start_downloading_ (dc);
+}
+
+
+/**
+ * Free this download context and all of its descendants.
+ * (only works during deserialization since not all possible
+ * state it taken care of).
+ *
+ * @param dc context to free
+ */
+static void
+free_download_context (struct GNUNET_FS_DownloadContext *dc)
+{
+  struct GNUNET_FS_DownloadContext *dcc;
+  struct DownloadRequest *dr;
+  if (dc->meta != NULL)
+    GNUNET_CONTAINER_meta_data_destroy (dc->meta);
+  if (dc->uri != NULL)
+    GNUNET_FS_uri_destroy (dc->uri);
+  GNUNET_free_non_null (dc->temp_filename);
+  GNUNET_free_non_null (dc->emsg);
+  GNUNET_free_non_null (dc->filename);
+  while (NULL != (dcc = dc->child_head))
+    {
+      GNUNET_CONTAINER_DLL_remove (dc->child_head,
+                                  dc->child_tail,
+                                  dcc);
+      free_download_context (dcc);
+    }
+  while (NULL != (dr = dc->pending))
+    {
+      dc->pending = dr->next;
+      GNUNET_free (dr);
+    }
+  GNUNET_free (dc);
+}
+
+
+/**
  * Deserialize a download.
  *
  * @param h overall context
@@ -1781,41 +1847,81 @@
                      const char *serialization)
 {
   struct GNUNET_FS_DownloadContext *dc;
-  struct GNUNET_FS_DownloadContext *dcc;
+  struct DownloadRequest *dr;
   char pbuf[32];
-  struct GNUNET_FS_ProgressInfo pi;
   char *emsg;
   char *uris;
   char *dn;
+  uint32_t options;
+  uint32_t status;
+  uint32_t num_pending;
 
   uris = NULL;
   emsg = NULL;
+  dr = NULL;
   dc = GNUNET_malloc (sizeof (struct GNUNET_FS_DownloadContext));
   dc->parent = parent;
   dc->h = h;
   dc->serialization = GNUNET_strdup (serialization);
-#if 0
-  /* FIXME */
   if ( (GNUNET_OK !=
-       GNUNET_BIO_read_string (rh, "-uri", &uris, 10*1024)) ||
-       (NULL == (sc->uri = GNUNET_FS_uri_parse (uris, &emsg))) ||       
-       ( (GNUNET_YES != GNUNET_FS_uri_test_ksk (sc->uri)) &&
-        (GNUNET_YES != GNUNET_FS_uri_test_sks (sc->uri)) ) ||
+       GNUNET_BIO_read_string (rh, "download-uri", &uris, 10*1024)) ||
+       (NULL == (dc->uri = GNUNET_FS_uri_parse (uris, &emsg))) ||       
+       ( (GNUNET_YES != GNUNET_FS_uri_test_chk (dc->uri)) &&
+        (GNUNET_YES != GNUNET_FS_uri_test_loc (dc->uri)) ) ||
        (GNUNET_OK !=
-       GNUNET_BIO_read_int64 (rh, &sc->start_time.value)) ||
+       GNUNET_BIO_read_meta_data (rh, "download-meta", &dc->meta)) ||
        (GNUNET_OK !=
-       GNUNET_BIO_read_string (rh, "search-emsg", &sc->emsg, 10*1024)) ||
+       GNUNET_BIO_read_string (rh, "download-emsg", &dc->emsg, 10*1024)) ||
        (GNUNET_OK !=
+       GNUNET_BIO_read_string (rh, "download-fn", &dc->filename, 10*1024)) ||
+       (GNUNET_OK !=
+       GNUNET_BIO_read_string (rh, "download-tfn", &dc->temp_filename, 
10*1024)) ||
+       (GNUNET_OK !=
+       GNUNET_BIO_read_int64 (rh, &dc->old_file_size)) ||
+       (GNUNET_OK !=
+       GNUNET_BIO_read_int64 (rh, &dc->offset)) ||
+       (GNUNET_OK !=
+       GNUNET_BIO_read_int64 (rh, &dc->length)) ||
+       (GNUNET_OK !=
+       GNUNET_BIO_read_int64 (rh, &dc->completed)) ||
+       (GNUNET_OK !=
+       GNUNET_BIO_read_int64 (rh, &dc->start_time.value)) ||
+       (GNUNET_OK !=
+       GNUNET_BIO_read_int32 (rh, &dc->anonymity)) ||
+       (GNUNET_OK !=
        GNUNET_BIO_read_int32 (rh, &options)) ||
        (GNUNET_OK !=
-       GNUNET_BIO_read (rh, "search-pause", &in_pause, sizeof (in_pause))) ||
+       GNUNET_BIO_read_int32 (rh, &status)) ||
        (GNUNET_OK !=
-       GNUNET_BIO_read_int32 (rh, &sc->anonymity)) )
+       GNUNET_BIO_read_int32 (rh, &num_pending)) )
     goto cleanup;          
   /* FIXME: adjust start_time.value */
-  sc->options = (enum GNUNET_FS_SearchOptions) options;
-  sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16);
-#endif
+  dc->options = (enum GNUNET_FS_DownloadOptions) options;
+  dc->active = GNUNET_CONTAINER_multihashmap_create (16);
+  dc->has_finished = (int) status;
+  dc->treedepth = GNUNET_FS_compute_depth (GNUNET_FS_uri_chk_get_file_size 
(dc->uri));
+  if (GNUNET_FS_uri_test_loc (dc->uri))
+    GNUNET_assert (GNUNET_OK ==
+                  GNUNET_FS_uri_loc_get_peer_identity (dc->uri,
+                                                       &dc->target));
+  if ( (dc->length > dc->completed) &&
+       (num_pending == 0) )
+    goto cleanup;    
+  while (0 < num_pending--)
+    {
+      dr = GNUNET_malloc (sizeof (struct DownloadRequest));
+      if ( (GNUNET_OK !=
+           GNUNET_BIO_read (rh, "chk", &dr->chk, sizeof (struct 
ContentHashKey))) ||
+          (GNUNET_OK !=
+           GNUNET_BIO_read_int64 (rh, &dr->offset)) ||
+          (GNUNET_OK !=
+           GNUNET_BIO_read_int32 (rh, &dr->depth)) )
+       goto cleanup;      
+      dr->is_pending = GNUNET_YES;
+      dr->next = dc->pending;
+      dc->pending = dr;
+      dr = NULL;
+    }
   GNUNET_snprintf (pbuf,
                   sizeof (pbuf),
                   "%s%s%s",
@@ -1828,54 +1934,47 @@
       GNUNET_DISK_directory_scan (dn, &deserialize_subdownload, dc);
       GNUNET_free (dn);
     }
-#if 0
-  if ('\0' == in_pause)
-    {
-      if (GNUNET_OK !=
-         GNUNET_FS_search_start_searching_ (sc))
-       goto cleanup;
-    }
-#endif
-  if (0)
-    goto cleanup;
   if (parent != NULL)
     GNUNET_CONTAINER_DLL_insert (parent->child_head,
                                 parent->child_tail,
                                 dc);
-  pi.status = GNUNET_FS_STATUS_DOWNLOAD_RESUME;
-#if 0
-  pi.value.search.specifics.resume.message = sc->emsg;
-  pi.value.search.specifics.resume.is_paused = ('\0' == in_pause) ? GNUNET_NO 
: GNUNET_YES;
-#endif
-  GNUNET_FS_download_make_status_ (&pi,
-                                  dc);
-  dcc = dc->child_head;
-  while (NULL != dcc)
-    {
-      /* FIXME: wrong, need recursion! */
-      pi.status = GNUNET_FS_STATUS_DOWNLOAD_RESUME;
-#if 0
-      pi.value.search.specifics.resume.message = scc->emsg;
-      pi.value.search.specifics.resume.is_paused = ('\0' == in_pause) ? 
GNUNET_NO : GNUNET_YES;
-#endif
-      GNUNET_FS_download_make_status_ (&pi,
-                                      dcc);
-      dcc = dcc->next;
-    }
-#if 0
+  signal_download_resume (dc);
   GNUNET_free (uris);
-#endif
   return;
  cleanup:
-#if 0
-  GNUNET_free_non_null (emsg);
-  free_search_context (sc);
-#endif
   GNUNET_free_non_null (uris);
+  GNUNET_free_non_null (dr);
+  free_download_context (dc);
 }
 
 
 /**
+ * Signal resuming of a search to our clients (for the
+ * top level search and all sub-searches).
+ *
+ * @param sc search being resumed
+ */
+static void
+signal_search_resume (struct GNUNET_FS_SearchContext *sc)
+{
+  struct GNUNET_FS_SearchContext *scc;
+  struct GNUNET_FS_ProgressInfo pi;
+
+  pi.status = GNUNET_FS_STATUS_SEARCH_RESUME;
+  pi.value.search.specifics.resume.message = sc->emsg;
+  pi.value.search.specifics.resume.is_paused = (sc->client == NULL) ? 
GNUNET_YES : GNUNET_NO;
+  sc->client_info = GNUNET_FS_search_make_status_ (&pi,
+                                                  sc);
+  scc = sc->child_head;
+  while (NULL != scc)
+    {
+      signal_search_resume (scc);
+      scc = scc->next;
+    }
+}
+
+
+/**
  * Deserialize a search. 
  *
  * @param h overall context
@@ -1893,7 +1992,6 @@
   struct GNUNET_FS_SearchContext *scc;
   struct GNUNET_BIO_ReadHandle *rhc;
   char pbuf[32];
-  struct GNUNET_FS_ProgressInfo pi;
   char *emsg;
   char *uris;
   char *child_ser;
@@ -1938,11 +2036,12 @@
       GNUNET_DISK_directory_scan (dn, &deserialize_search_result, sc);
       GNUNET_free (dn);
     }
-  if ('\0' == in_pause)
+  if ( ('\0' == in_pause) &&
+       (GNUNET_OK !=
+       GNUNET_FS_search_start_searching_ (sc)) )
     {
-      if (GNUNET_OK !=
-         GNUNET_FS_search_start_searching_ (sc))
-       goto cleanup;
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                 _("Could not resume running search, will resume as paused 
search\n"));    
     }
   while (1)
     {
@@ -1976,23 +2075,7 @@
     GNUNET_CONTAINER_DLL_insert (parent->child_head,
                                 parent->child_tail,
                                 sc);
-  pi.status = GNUNET_FS_STATUS_SEARCH_RESUME;
-  pi.value.search.specifics.resume.message = sc->emsg;
-  pi.value.search.specifics.resume.is_paused = ('\0' == in_pause) ? GNUNET_NO 
: GNUNET_YES;
-  sc->client_info = GNUNET_FS_search_make_status_ (&pi,
-                                                  sc);
-  scc = sc->child_head;
-  while (NULL != scc)
-    {
-      /* FIXME: wrong, need recursion! */
-      pi.status = GNUNET_FS_STATUS_SEARCH_RESUME;
-      pi.value.search.specifics.resume.message = scc->emsg;
-      pi.value.search.specifics.resume.is_paused = ('\0' == in_pause) ? 
GNUNET_NO : GNUNET_YES;
-      scc->client_info = GNUNET_FS_search_make_status_ (&pi,
-                                                       scc);
-
-      scc = scc->next;
-    }
+  signal_search_resume (sc);
   GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
                                         &signal_result_resume,
                                         sc);

Modified: gnunet/src/fs/fs.h
===================================================================
--- gnunet/src/fs/fs.h  2010-05-03 16:39:34 UTC (rev 11165)
+++ gnunet/src/fs/fs.h  2010-05-03 19:52:40 UTC (rev 11166)
@@ -823,6 +823,15 @@
 GNUNET_FS_search_start_searching_ (struct GNUNET_FS_SearchContext *sc);
 
 /**
+ * Start the downloading process (by entering the queue).
+ *
+ * @param dc our download context
+ */
+void
+GNUNET_FS_download_start_downloading_ (struct GNUNET_FS_DownloadContext *dc);
+
+
+/**
  * Start download probes for the given search result.
  *
  * @param sr the search result
@@ -1382,7 +1391,7 @@
   /**
    * Set if this request is currently in the linked list of pending
    * requests.  Needed in case we get a response for a request that we
-   * have not yet send (due to FS bug or two blocks with identical
+   * have not yet send (i.e. due to two blocks with identical
    * content); in this case, we would need to remove the block from
    * the pending list (and need a fast way to check if the block is on
    * it).
@@ -1487,12 +1496,6 @@
   struct DownloadRequest *pending;
 
   /**
-   * The file handle, NULL if we don't create
-   * a file.
-   */
-  struct GNUNET_DISK_FileHandle *handle;
-
-  /**
    * Non-NULL if we are currently having a request for
    * transmission pending with the client handle.
    */

Modified: gnunet/src/fs/fs_download.c
===================================================================
--- gnunet/src/fs/fs_download.c 2010-05-03 16:39:34 UTC (rev 11165)
+++ gnunet/src/fs/fs_download.c 2010-05-03 19:52:40 UTC (rev 11166)
@@ -273,6 +273,7 @@
   char block[DBLOCK_SIZE];
   GNUNET_HashCode key;
   struct ProcessResultClosure prc;
+  struct GNUNET_DISK_FileHandle *fh;
 
 #if DEBUG_DOWNLOAD
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -301,15 +302,21 @@
                                     &chk->query,
                                     sm,
                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
-
+  fh = NULL;
   if ( (dc->old_file_size > off) &&
-       (dc->handle != NULL) &&
+       (dc->filename != NULL) )
+    {
+      fh = GNUNET_DISK_file_open (dc->filename,
+                                 GNUNET_DISK_OPEN_READ,
+                                 GNUNET_DISK_PERM_NONE);
+    }
+  if ( (fh != NULL) &&
        (off  == 
-       GNUNET_DISK_file_seek (dc->handle,
+       GNUNET_DISK_file_seek (fh,
                               off,
                               GNUNET_DISK_SEEK_SET) ) &&
        (len == 
-       GNUNET_DISK_file_read (dc->handle,
+       GNUNET_DISK_file_read (fh,
                               block,
                               len)) )
     {
@@ -353,6 +360,8 @@
          return;
        }
     }
+  if (fh != NULL)
+    GNUNET_break (GNUNET_OK == GNUNET_DISK_file_close (fh));
   if (depth < dc->treedepth)
     {
       // FIXME: try if we could
@@ -828,6 +837,7 @@
   struct DownloadRequest *sm = value;
   struct DownloadRequest *ppos;
   struct DownloadRequest *pprev;
+  struct GNUNET_DISK_FileHandle *fh;
   struct GNUNET_FS_DownloadContext *dc = prc->dc;
   struct GNUNET_CRYPTO_AesSessionKey skey;
   struct GNUNET_CRYPTO_AesInitializationVector iv;
@@ -838,13 +848,13 @@
   size_t app;
   int i;
   struct ContentHashKey *chk;
-  char *emsg;
 
+  fh = NULL;
   bs = GNUNET_FS_tree_calculate_block_size (GNUNET_ntohll 
(dc->uri->data.chk.file_length),
                                            dc->treedepth,
                                            sm->offset,
                                            sm->depth);
-    if (prc->size != bs)
+  if (prc->size != bs)
     {
 #if DEBUG_DOWNLOAD
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -853,19 +863,7 @@
                  prc->size);
 #endif
       dc->emsg = GNUNET_strdup ("Internal error or bogus download URI");
-      /* signal error */
-      pi.status = GNUNET_FS_STATUS_DOWNLOAD_ERROR;
-      pi.value.download.specifics.error.message = dc->emsg;
-      GNUNET_FS_download_make_status_ (&pi, dc);
-      /* abort all pending requests */
-      if (NULL != dc->th)
-       {
-         GNUNET_CLIENT_notify_transmit_ready_cancel (dc->th);
-         dc->th = NULL;
-       }
-      GNUNET_CLIENT_disconnect (dc->client, GNUNET_NO);
-      dc->client = NULL;
-      return GNUNET_NO;
+      goto signal_error;
     }
   GNUNET_assert (GNUNET_YES ==
                 GNUNET_CONTAINER_multihashmap_remove (dc->active,
@@ -899,55 +897,68 @@
                             dc->treedepth);
   /* save to disk */
   if ( ( GNUNET_YES == prc->do_store) &&
-       (NULL != dc->handle) &&
+       ( (dc->filename != NULL) ||
+        (is_recursive_download (dc)) ) &&
        ( (sm->depth == dc->treedepth) ||
         (0 == (dc->options & GNUNET_FS_DOWNLOAD_NO_TEMPORARIES)) ) )
     {
-      emsg = NULL;
+      fh = GNUNET_DISK_file_open (dc->filename != NULL 
+                                 ? dc->filename 
+                                 : dc->temp_filename, 
+                                 GNUNET_DISK_OPEN_READWRITE | 
+                                 GNUNET_DISK_OPEN_CREATE,
+                                 GNUNET_DISK_PERM_USER_READ |
+                                 GNUNET_DISK_PERM_USER_WRITE |
+                                 GNUNET_DISK_PERM_GROUP_READ |
+                                 GNUNET_DISK_PERM_OTHER_READ);
+    }
+  if ( (NULL == fh) &&
+       (GNUNET_YES == prc->do_store) &&
+       ( (dc->filename != NULL) ||
+        (is_recursive_download (dc)) ) &&
+       ( (sm->depth == dc->treedepth) ||
+        (0 == (dc->options & GNUNET_FS_DOWNLOAD_NO_TEMPORARIES)) ) )
+    {
+      GNUNET_asprintf (&dc->emsg,
+                      _("Download failed: could not open file `%s': %s\n"),
+                      dc->filename,
+                      STRERROR (errno));
+      goto signal_error;
+    }
+  if (fh != NULL)
+    {
 #if DEBUG_DOWNLOAD
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                  "Saving decrypted block to disk at offset %llu\n",
                  (unsigned long long) off);
 #endif
       if ( (off  != 
-           GNUNET_DISK_file_seek (dc->handle,
+           GNUNET_DISK_file_seek (fh,
                                   off,
                                   GNUNET_DISK_SEEK_SET) ) )
-       GNUNET_asprintf (&emsg,
-                        _("Failed to seek to offset %llu in file `%s': %s\n"),
-                        (unsigned long long) off,
-                        dc->filename,
-                        STRERROR (errno));
-      else if (prc->size !=
-              GNUNET_DISK_file_write (dc->handle,
-                                      pt,
-                                      prc->size))
-       GNUNET_asprintf (&emsg,
-                        _("Failed to write block of %u bytes at offset %llu in 
file `%s': %s\n"),
-                        (unsigned int) prc->size,
-                        (unsigned long long) off,
-                        dc->filename,
-                        STRERROR (errno));
-      if (NULL != emsg)
        {
-         dc->emsg = emsg;
-         // FIXME: make persistent
-
-         /* signal error */
-         pi.status = GNUNET_FS_STATUS_DOWNLOAD_ERROR;
-         pi.value.download.specifics.error.message = emsg;
-         GNUNET_FS_download_make_status_ (&pi, dc);
-         /* abort all pending requests */
-         if (NULL != dc->th)
-           {
-             GNUNET_CLIENT_notify_transmit_ready_cancel (dc->th);
-             dc->th = NULL;
-           }
-         GNUNET_CLIENT_disconnect (dc->client, GNUNET_NO);
-         dc->client = NULL;
-         GNUNET_free (sm);
-         return GNUNET_NO;
+         GNUNET_asprintf (&dc->emsg,
+                          _("Failed to seek to offset %llu in file `%s': 
%s\n"),
+                          (unsigned long long) off,
+                          dc->filename,
+                          STRERROR (errno));
+         goto signal_error;
        }
+      if (prc->size !=
+         GNUNET_DISK_file_write (fh,
+                                 pt,
+                                 prc->size))
+       {
+         GNUNET_asprintf (&dc->emsg,
+                          _("Failed to write block of %u bytes at offset %llu 
in file `%s': %s\n"),
+                          (unsigned int) prc->size,
+                          (unsigned long long) off,
+                          dc->filename,
+                          STRERROR (errno));
+         goto signal_error;
+       }
+      GNUNET_break (GNUNET_OK == GNUNET_DISK_file_close (fh));
+      fh = NULL;
     }
   if (sm->depth == dc->treedepth) 
     {
@@ -994,10 +1005,8 @@
                  (unsigned long long) GNUNET_ntohll 
(dc->uri->data.chk.file_length));
 #endif
       /* truncate file to size (since we store IBlocks at the end) */
-      if (dc->handle != NULL)
+      if (dc->filename != NULL)
        {
-         GNUNET_DISK_file_close (dc->handle);
-         dc->handle = NULL;
          if (0 != truncate (dc->filename,
                             GNUNET_ntohll (dc->uri->data.chk.file_length)))
            GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
@@ -1050,6 +1059,23 @@
     }
   GNUNET_free (sm);
   return GNUNET_YES;
+
+ signal_error:
+  if (fh != NULL)
+    GNUNET_DISK_file_close (fh);
+  pi.status = GNUNET_FS_STATUS_DOWNLOAD_ERROR;
+  pi.value.download.specifics.error.message = dc->emsg;
+  GNUNET_FS_download_make_status_ (&pi, dc);
+  /* abort all pending requests */
+  if (NULL != dc->th)
+    {
+      GNUNET_CLIENT_notify_transmit_ready_cancel (dc->th);
+      dc->th = NULL;
+    }
+  GNUNET_CLIENT_disconnect (dc->client, GNUNET_NO);
+  dc->client = NULL;
+  GNUNET_free (sm);
+  return GNUNET_NO;
 }
 
 
@@ -1435,25 +1461,6 @@
        GNUNET_DISK_file_size (filename,
                               &dc->old_file_size,
                               GNUNET_YES);
-      dc->handle = GNUNET_DISK_file_open (filename, 
-                                         GNUNET_DISK_OPEN_READWRITE | 
-                                         GNUNET_DISK_OPEN_CREATE,
-                                         GNUNET_DISK_PERM_USER_READ |
-                                         GNUNET_DISK_PERM_USER_WRITE |
-                                         GNUNET_DISK_PERM_GROUP_READ |
-                                         GNUNET_DISK_PERM_OTHER_READ);
-      if (dc->handle == NULL)
-       {
-         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                     _("Download failed: could not open file `%s': %s\n"),
-                     dc->filename,
-                     STRERROR (errno));
-         GNUNET_CONTAINER_meta_data_destroy (dc->meta);
-         GNUNET_FS_uri_destroy (dc->uri);
-         GNUNET_free (dc->filename);
-         GNUNET_free (dc);
-         return NULL;
-       }
     }
   // FIXME: set "dc->target" for LOC uris!
   dc->offset = offset;
@@ -1484,12 +1491,24 @@
                           &dc->uri->data.chk.chk,
                           0, 
                           1 /* 0 == CHK, 1 == top */); 
-  dc->job_queue = GNUNET_FS_queue_ (h, 
+  GNUNET_FS_download_start_downloading_ (dc);
+  return dc;
+}
+
+
+/**
+ * Start the downloading process (by entering the queue).
+ *
+ * @param dc our download context
+ */
+void
+GNUNET_FS_download_start_downloading_ (struct GNUNET_FS_DownloadContext *dc)
+{
+  dc->job_queue = GNUNET_FS_queue_ (dc->h, 
                                    &activate_fs_download,
                                    &deactivate_fs_download,
                                    dc,
-                                   (length + DBLOCK_SIZE-1) / DBLOCK_SIZE);
-  return dc;
+                                   (dc->length + DBLOCK_SIZE-1) / DBLOCK_SIZE);
 }
 
 
@@ -1548,8 +1567,6 @@
   GNUNET_CONTAINER_multihashmap_destroy (dc->active);
   if (dc->filename != NULL)
     {
-      if (NULL != dc->handle)
-       GNUNET_DISK_file_close (dc->handle);
       if ( (dc->completed != dc->length) &&
           (GNUNET_YES == do_delete) )
        {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]