Beispiel #1
0
/**
 * Start download probes for the given search result.
 *
 * @param sr the search result
 */
void
GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr)
{
  uint64_t off;
  uint64_t len;

  if (NULL != sr->probe_ctx)
    return;
  if (NULL != sr->download)
    return;
  if (0 == (sr->h->flags & GNUNET_FS_FLAGS_DO_PROBES))
    return;
  if (sr->availability_trials > AVAILABILITY_TRIALS_MAX)
    return;
  if ( (GNUNET_FS_URI_CHK != sr->uri->type) && (GNUNET_FS_URI_LOC != sr->uri->type))
    return;
  len = GNUNET_FS_uri_chk_get_file_size (sr->uri);
  if (0 == len)
    return;
  if ((len <= DBLOCK_SIZE) && (sr->availability_success > 0))
    return;
  off = len / DBLOCK_SIZE;
  if (off > 0)
    off = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, off);
  off *= DBLOCK_SIZE;
  if (len - off < DBLOCK_SIZE)
    len = len - off;
  else
    len = DBLOCK_SIZE;
  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
	      "Starting probe #%u (at offset %llu) for search result %p\n",
	      sr->availability_trials + 1,
	      (unsigned long long) off,
	      sr);
  sr->remaining_probe_time =
      GNUNET_TIME_relative_multiply (sr->h->avg_block_latency,
                                     2 * (1 + sr->availability_trials));
  sr->probe_ctx =
      GNUNET_FS_download_start (sr->h, sr->uri, sr->meta, NULL, NULL, off,
                                len, sr->anonymity,
                                GNUNET_FS_DOWNLOAD_NO_TEMPORARIES |
                                GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL);
  sr->probe_ping_task
    = GNUNET_SCHEDULER_add_now (&probe_ping_task,
				sr);
}
Beispiel #2
0
/**
 * Main function that will be run by the scheduler.
 *
 * @param cls closure
 * @param args remaining command-line arguments
 * @param cfgfile name of the configuration file used (for saving, can be NULL!)
 * @param c configuration
 */
static void
run (void *cls, char *const *args, const char *cfgfile,
     const struct GNUNET_CONFIGURATION_Handle *c)
{
  struct GNUNET_FS_Uri *uri;
  char *emsg;
  enum GNUNET_FS_DownloadOptions options;

  if (NULL == args[0])
  {
    FPRINTF (stderr, "%s",  _("You need to specify a URI argument.\n"));
    return;
  }
  uri = GNUNET_FS_uri_parse (args[0], &emsg);
  if (NULL == uri)
  {
    FPRINTF (stderr, _("Failed to parse URI: %s\n"), emsg);
    GNUNET_free (emsg);
    ret = 1;
    return;
  }
  if ((!GNUNET_FS_uri_test_chk (uri)) && (!GNUNET_FS_uri_test_loc (uri)))
  {
    FPRINTF (stderr, "%s",  _("Only CHK or LOC URIs supported.\n"));
    ret = 1;
    GNUNET_FS_uri_destroy (uri);
    return;
  }
  if (NULL == filename)
  {
    FPRINTF (stderr, "%s",  _("Target filename must be specified.\n"));
    ret = 1;
    GNUNET_FS_uri_destroy (uri);
    return;
  }
  cfg = c;
  ctx =
      GNUNET_FS_start (cfg, "gnunet-download", &progress_cb, NULL,
                       GNUNET_FS_FLAGS_NONE,
                       GNUNET_FS_OPTIONS_DOWNLOAD_PARALLELISM, parallelism,
                       GNUNET_FS_OPTIONS_REQUEST_PARALLELISM,
                       request_parallelism, GNUNET_FS_OPTIONS_END);
  if (NULL == ctx)
  {
    FPRINTF (stderr, _("Could not initialize `%s' subsystem.\n"), "FS");
    GNUNET_FS_uri_destroy (uri);
    ret = 1;
    return;
  }
  options = GNUNET_FS_DOWNLOAD_OPTION_NONE;
  if (do_recursive)
    options |= GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE;
  if (local_only)
    options |= GNUNET_FS_DOWNLOAD_OPTION_LOOPBACK_ONLY;
  dc = GNUNET_FS_download_start (ctx, uri, NULL, filename, NULL, 0,
                                 GNUNET_FS_uri_chk_get_file_size (uri),
                                 anonymity, options, NULL, NULL);
  GNUNET_FS_uri_destroy (uri);
  if (dc == NULL)
  {
    GNUNET_FS_stop (ctx);
    ctx = NULL;
    return;
  }
  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
                                NULL);
}