{
return (0 != (dc->options & GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE)) &&
((GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (dc->meta)) ||
{
return (0 != (dc->options & GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE)) &&
((GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (dc->meta)) ||
uint64_t loff; /* where do IBlocks for depth "i" start? */
unsigned int ioff; /* which IBlock corresponds to "off" at depth "i"? */
uint64_t loff; /* where do IBlocks for depth "i" start? */
unsigned int ioff; /* which IBlock corresponds to "off" at depth "i"? */
pi->value.download.dc = dc;
pi->value.download.cctx = dc->client_info;
pi->value.download.pctx =
pi->value.download.dc = dc;
pi->value.download.cctx = dc->client_info;
pi->value.download.pctx =
pi->value.download.uri = dc->uri;
pi->value.download.filename = dc->filename;
pi->value.download.size = dc->length;
pi->value.download.uri = dc->uri;
pi->value.download.filename = dc->filename;
pi->value.download.size = dc->length;
pi->value.download.anonymity = dc->anonymity;
pi->value.download.eta =
GNUNET_TIME_calculate_eta (dc->start_time, dc->completed, dc->length);
pi->value.download.anonymity = dc->anonymity;
pi->value.download.eta =
GNUNET_TIME_calculate_eta (dc->start_time, dc->completed, dc->length);
if (0 == (dc->options & GNUNET_FS_DOWNLOAD_IS_PROBE))
dc->client_info = dc->h->upcb (dc->h->upcb_cls, pi);
else
if (0 == (dc->options & GNUNET_FS_DOWNLOAD_IS_PROBE))
dc->client_info = dc->h->upcb (dc->h->upcb_cls, pi);
else
return; /* oops */
data = GNUNET_DISK_file_map (h, &m, GNUNET_DISK_MAP_TYPE_READ, size);
return; /* oops */
data = GNUNET_DISK_file_map (h, &m, GNUNET_DISK_MAP_TYPE_READ, size);
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Directory too large for system address space\n"));
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Directory too large for system address space\n"));
{
if (0 != UNLINK (dc->temp_filename))
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink",
{
if (0 != UNLINK (dc->temp_filename))
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink",
struct GNUNET_FS_DownloadContext *pos;
/* first, check if we need to download children */
struct GNUNET_FS_DownloadContext *pos;
/* first, check if we need to download children */
full_recursive_download (dc);
/* then, check if children are done already */
full_recursive_download (dc);
/* then, check if children are done already */
{
if ((pos->emsg == NULL) && (pos->completed < pos->length))
return; /* not done yet */
if ((pos->child_head != NULL) && (pos->has_finished != GNUNET_YES))
return; /* not transitively done yet */
{
if ((pos->emsg == NULL) && (pos->completed < pos->length))
return; /* not done yet */
if ((pos->child_head != NULL) && (pos->has_finished != GNUNET_YES))
return; /* not transitively done yet */
}
/* All of our children are done, so mark this download done */
dc->has_finished = GNUNET_YES;
}
/* All of our children are done, so mark this download done */
dc->has_finished = GNUNET_YES;
fh = GNUNET_DISK_file_open (fn,
GNUNET_DISK_OPEN_READWRITE |
GNUNET_DISK_OPEN_CREATE |
fh = GNUNET_DISK_file_open (fn,
GNUNET_DISK_OPEN_READWRITE |
GNUNET_DISK_OPEN_CREATE |
GNUNET_DISK_PERM_USER_WRITE |
GNUNET_DISK_PERM_GROUP_READ |
GNUNET_DISK_PERM_OTHER_READ);
GNUNET_DISK_PERM_USER_WRITE |
GNUNET_DISK_PERM_GROUP_READ |
GNUNET_DISK_PERM_OTHER_READ);
{
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "open", fn);
GNUNET_asprintf (&dc->emsg, _("Failed to open file `%s' for writing"),
{
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "open", fn);
GNUNET_asprintf (&dc->emsg, _("Failed to open file `%s' for writing"),
return 0;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found %u bytes of FD!\n",
(unsigned int) data_len);
return 0;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found %u bytes of FD!\n",
(unsigned int) data_len);
total = GNUNET_FS_uri_chk_get_file_size (dc->uri);
GNUNET_assert (dr->depth < dc->treedepth);
len = GNUNET_FS_tree_calculate_block_size (total, dr->offset, dr->depth);
total = GNUNET_FS_uri_chk_get_file_size (dc->uri);
GNUNET_assert (dr->depth < dc->treedepth);
len = GNUNET_FS_tree_calculate_block_size (total, dr->offset, dr->depth);
GNUNET_assert (drc->offset >= dr->offset);
child_block_size = GNUNET_FS_tree_compute_tree_size (drc->depth);
GNUNET_assert (0 == (drc->offset - dr->offset) % child_block_size);
GNUNET_assert (drc->offset >= dr->offset);
child_block_size = GNUNET_FS_tree_compute_tree_size (drc->depth);
GNUNET_assert (0 == (drc->offset - dr->offset) % child_block_size);
{
drc->state = BRS_CHK_SET;
drc->chk = chks[drc->chk_idx];
try_top_down_reconstruction (dc, drc);
}
{
drc->state = BRS_CHK_SET;
drc->chk = chks[drc->chk_idx];
try_top_down_reconstruction (dc, drc);
}
return; /* already active */
GNUNET_CONTAINER_multihashmap_put (dc->active, &dr->chk.query, dr,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
return; /* already active */
GNUNET_CONTAINER_multihashmap_put (dc->active, &dr->chk.query, dr,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
return; /* download not active */
GNUNET_CONTAINER_DLL_insert (dc->pending_head, dc->pending_tail, dr);
dr->is_pending = GNUNET_YES;
return; /* download not active */
GNUNET_CONTAINER_DLL_insert (dc->pending_head, dc->pending_tail, dr);
dr->is_pending = GNUNET_YES;
strstr (dn + strlen (dn) - strlen (GNUNET_FS_DIRECTORY_EXT),
GNUNET_FS_DIRECTORY_EXT)));
sfn = GNUNET_strdup (filename);
strstr (dn + strlen (dn) - strlen (GNUNET_FS_DIRECTORY_EXT),
GNUNET_FS_DIRECTORY_EXT)));
sfn = GNUNET_strdup (filename);
(GNUNET_OK != GNUNET_DISK_directory_create_for_file (full_name)))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
(GNUNET_OK != GNUNET_DISK_directory_create_for_file (full_name)))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- ("Internal error or bogus download URI (expected %u bytes at depth %u and offset %llu/%llu, got %u bytes)\n"),
+ ("Internal error or bogus download URI (expected %u bytes at depth %u and offset %llu/%llu, got %u bytes)"),
bs, dr->depth, (unsigned long long) dr->offset,
(unsigned long long) GNUNET_ntohll (dc->uri->data.
chk.file_length),
prc->size);
bs, dr->depth, (unsigned long long) dr->offset,
(unsigned long long) GNUNET_ntohll (dc->uri->data.
chk.file_length),
prc->size);
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%s", dc->emsg);
- while (dr->parent != NULL)
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%s\n", dc->emsg);
+ while (NULL != dr->parent)
- fh = GNUNET_DISK_file_open (dc->filename !=
- NULL ? dc->filename : dc->temp_filename,
+ fh = GNUNET_DISK_file_open (NULL != dc->filename
+ ? dc->filename : dc->temp_filename,
if ((off != GNUNET_DISK_file_seek (fh, off, GNUNET_DISK_SEEK_SET)))
{
GNUNET_asprintf (&dc->emsg,
if ((off != GNUNET_DISK_file_seek (fh, off, GNUNET_DISK_SEEK_SET)))
{
GNUNET_asprintf (&dc->emsg,
(unsigned int) prc->size, (unsigned long long) off,
dc->filename, STRERROR (errno));
goto signal_error;
(unsigned int) prc->size, (unsigned long long) off,
dc->filename, STRERROR (errno));
goto signal_error;
pi.value.download.specifics.progress.block_download_duration
= GNUNET_TIME_UNIT_ZERO; /* found locally */
GNUNET_FS_download_make_status_ (&pi, dc);
pi.value.download.specifics.progress.block_download_duration
= GNUNET_TIME_UNIT_ZERO; /* found locally */
GNUNET_FS_download_make_status_ (&pi, dc);
(unsigned long long) GNUNET_ntohll (dc->uri->data.
chk.file_length));
/* truncate file to size (since we store IBlocks at the end) */
(unsigned long long) GNUNET_ntohll (dc->uri->data.
chk.file_length));
/* truncate file to size (since we store IBlocks at the end) */
{
/* bottom of the tree, no child downloads possible, just sync */
GNUNET_FS_download_sync_ (dc);
{
/* bottom of the tree, no child downloads possible, just sync */
GNUNET_FS_download_sync_ (dc);
GNUNET_DISK_file_close (fh);
pi.status = GNUNET_FS_STATUS_DOWNLOAD_ERROR;
pi.value.download.specifics.error.message = dc->emsg;
GNUNET_DISK_file_close (fh);
pi.status = GNUNET_FS_STATUS_DOWNLOAD_ERROR;
pi.value.download.specifics.error.message = dc->emsg;
if ((NULL == msg) || (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_FS_PUT) ||
(sizeof (struct ClientPutMessage) > ntohs (msg->size)))
{
if ((NULL == msg) || (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_FS_PUT) ||
(sizeof (struct ClientPutMessage) > ntohs (msg->size)))
{
process_result (dc, ntohl (cm->type),
GNUNET_TIME_absolute_ntoh (cm->last_transmission), &cm[1],
msize - sizeof (struct ClientPutMessage));
process_result (dc, ntohl (cm->type),
GNUNET_TIME_absolute_ntoh (cm->last_transmission), &cm[1],
msize - sizeof (struct ClientPutMessage));
return; /* fatal error */
/* continue receiving */
GNUNET_CLIENT_receive (dc->client, &receive_results, dc,
return; /* fatal error */
/* continue receiving */
GNUNET_CLIENT_receive (dc->client, &receive_results, dc,
sm->options = htonl (GNUNET_FS_SEARCH_OPTION_LOOPBACK_ONLY);
else
sm->options = htonl (GNUNET_FS_SEARCH_OPTION_NONE);
sm->options = htonl (GNUNET_FS_SEARCH_OPTION_LOOPBACK_ONLY);
else
sm->options = htonl (GNUNET_FS_SEARCH_OPTION_NONE);
GNUNET_CONSTANTS_SERVICE_TIMEOUT,
GNUNET_NO,
&transmit_download_request, dc);
GNUNET_CONSTANTS_SERVICE_TIMEOUT,
GNUNET_NO,
&transmit_download_request, dc);
GNUNET_CONSTANTS_SERVICE_TIMEOUT,
GNUNET_NO,
&transmit_download_request, dc);
GNUNET_CONSTANTS_SERVICE_TIMEOUT,
GNUNET_NO,
&transmit_download_request, dc);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Download activated\n");
GNUNET_assert (NULL != client);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Download activated\n");
GNUNET_assert (NULL != client);
dc->client = client;
pi.status = GNUNET_FS_STATUS_DOWNLOAD_ACTIVE;
GNUNET_FS_download_make_status_ (&pi, dc);
dc->client = client;
pi.status = GNUNET_FS_STATUS_DOWNLOAD_ACTIVE;
GNUNET_FS_download_make_status_ (&pi, dc);
GNUNET_CONTAINER_multihashmap_iterate (dc->active, &retry_entry, dc);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Asking for transmission to FS service\n");
GNUNET_CONTAINER_multihashmap_iterate (dc->active, &retry_entry, dc);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Asking for transmission to FS service\n");
GNUNET_CONSTANTS_SERVICE_TIMEOUT,
GNUNET_NO,
&transmit_download_request, dc);
GNUNET_CONSTANTS_SERVICE_TIMEOUT,
GNUNET_NO,
&transmit_download_request, dc);
(unsigned long long) GNUNET_ntohll (dc->uri->data.
chk.file_length));
/* truncate file to size (since we store IBlocks at the end) */
(unsigned long long) GNUNET_ntohll (dc->uri->data.
chk.file_length));
/* truncate file to size (since we store IBlocks at the end) */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Start task running...\n");
dc->task = GNUNET_SCHEDULER_NO_TASK;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Start task running...\n");
dc->task = GNUNET_SCHEDULER_NO_TASK;
{
fh = GNUNET_DISK_file_open (dc->filename,
GNUNET_DISK_OPEN_READWRITE |
{
fh = GNUNET_DISK_file_open (dc->filename,
GNUNET_DISK_OPEN_READWRITE |
{
dc->top_request =
create_download_request (NULL, 0, dc->treedepth - 1, 0, dc->offset,
{
dc->top_request =
create_download_request (NULL, 0, dc->treedepth - 1, 0, dc->offset,
{
/* first, try top-down */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
{
/* first, try top-down */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
break; /* normal, some blocks already down */
case BRS_DOWNLOAD_UP:
/* already done entirely, party! */
break; /* normal, some blocks already down */
case BRS_DOWNLOAD_UP:
/* already done entirely, party! */
(unsigned int)
GNUNET_CONTAINER_meta_data_get_serialized_size (dc->meta));
GNUNET_CONTAINER_meta_data_iterate (dc->meta, &match_full_data, dc);
(unsigned int)
GNUNET_CONTAINER_meta_data_get_serialized_size (dc->meta));
GNUNET_CONTAINER_meta_data_iterate (dc->meta, &match_full_data, dc);
{
/* finally, actually run bottom-up */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
{
/* finally, actually run bottom-up */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
dc->issue_requests = GNUNET_YES;
schedule_block_download (dc, dc->top_request);
}
dc->issue_requests = GNUNET_YES;
schedule_block_download (dc, dc->top_request);
}
GNUNET_FS_end_top (dc->h, dc->top);
while (NULL != dc->child_head)
GNUNET_FS_download_signal_suspend_ (dc->child_head);
GNUNET_FS_end_top (dc->h, dc->top);
while (NULL != dc->child_head)
GNUNET_FS_download_signal_suspend_ (dc->child_head);
{
GNUNET_SCHEDULER_cancel (dc->task);
dc->task = GNUNET_SCHEDULER_NO_TASK;
}
pi.status = GNUNET_FS_STATUS_DOWNLOAD_SUSPEND;
GNUNET_FS_download_make_status_ (&pi, dc);
{
GNUNET_SCHEDULER_cancel (dc->task);
dc->task = GNUNET_SCHEDULER_NO_TASK;
}
pi.status = GNUNET_FS_STATUS_DOWNLOAD_SUSPEND;
GNUNET_FS_download_make_status_ (&pi, dc);
dc->job_queue =
GNUNET_FS_queue_ (dc->h, &activate_fs_download, &deactivate_fs_download,
dc, (dc->length + DBLOCK_SIZE - 1) / DBLOCK_SIZE,
dc->job_queue =
GNUNET_FS_queue_ (dc->h, &activate_fs_download, &deactivate_fs_download,
dc, (dc->length + DBLOCK_SIZE - 1) / DBLOCK_SIZE,
have_children = (NULL != dc->child_head) ? GNUNET_YES : GNUNET_NO;
while (NULL != dc->child_head)
GNUNET_FS_download_stop (dc->child_head, do_delete);
have_children = (NULL != dc->child_head) ? GNUNET_YES : GNUNET_NO;
while (NULL != dc->child_head)
GNUNET_FS_download_stop (dc->child_head, do_delete);
(! search_was_null)) ? GNUNET_FS_SYNC_PATH_CHILD_DOWNLOAD :
GNUNET_FS_SYNC_PATH_MASTER_DOWNLOAD,
dc->serialization);
(! search_was_null)) ? GNUNET_FS_SYNC_PATH_CHILD_DOWNLOAD :
GNUNET_FS_SYNC_PATH_MASTER_DOWNLOAD,
dc->serialization);
GNUNET_FS_remove_sync_dir_ (dc->h,
(! search_was_null) ? GNUNET_FS_SYNC_PATH_CHILD_DOWNLOAD :
GNUNET_FS_SYNC_PATH_MASTER_DOWNLOAD,
GNUNET_FS_remove_sync_dir_ (dc->h,
(! search_was_null) ? GNUNET_FS_SYNC_PATH_CHILD_DOWNLOAD :
GNUNET_FS_SYNC_PATH_MASTER_DOWNLOAD,
GNUNET_FS_download_make_status_ (&pi, dc);
GNUNET_FS_free_download_request_ (dc->top_request);
dc->top_request = NULL;
GNUNET_FS_download_make_status_ (&pi, dc);
GNUNET_FS_free_download_request_ (dc->top_request);
dc->top_request = NULL;