+do_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ fprintf (stderr, "Operation timed out\n");
+ kill_task = GNUNET_SCHEDULER_NO_TASK;
+ abort_sks_search_task (NULL, tc);
+ abort_ksk_search_task (NULL, tc);
+}
+
+
+
+static void *
+progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *event)
+{
+ switch (event->status)
+ {
+ case GNUNET_FS_STATUS_SEARCH_RESULT:
+ if (sks_search == event->value.search.sc)
+ {
+ if (!GNUNET_FS_uri_test_equal
+ (sks_expect_uri, event->value.search.specifics.result.uri))
+ {
+ fprintf (stderr, "Wrong result for sks search!\n");
+ err = 1;
+ }
+ /* give system 1ms to initiate update search! */
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MILLISECONDS,
+ &abort_sks_search_task, NULL);
+ }
+ else if (ksk_search == event->value.search.sc)
+ {
+ if (!GNUNET_FS_uri_test_equal
+ (ksk_expect_uri, event->value.search.specifics.result.uri))
+ {
+ fprintf (stderr, "Wrong result for ksk search!\n");
+ err = 1;
+ }
+ GNUNET_SCHEDULER_add_continuation (&abort_ksk_search_task, NULL,
+ GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+ }
+ else
+ {
+ fprintf (stderr, "Unexpected search result received!\n");
+ GNUNET_break (0);
+ }
+ break;
+ case GNUNET_FS_STATUS_SEARCH_ERROR:
+ fprintf (stderr, "Error searching file: %s\n",
+ event->value.search.specifics.error.message);
+ if (sks_search == event->value.search.sc)
+ GNUNET_SCHEDULER_add_continuation (&abort_sks_search_task, NULL,
+ GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+ else if (ksk_search == event->value.search.sc)
+ GNUNET_SCHEDULER_add_continuation (&abort_ksk_search_task, NULL,
+ GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+ else
+ GNUNET_break (0);
+ break;
+ case GNUNET_FS_STATUS_SEARCH_START:
+ GNUNET_assert ((NULL == event->value.search.cctx) ||
+ (0 == strcmp ("sks_search", event->value.search.cctx)) ||
+ (0 == strcmp ("ksk_search", event->value.search.cctx)));
+ if (NULL == event->value.search.cctx)
+ {
+ GNUNET_assert (0 == strcmp ("sks_search", event->value.search.pctx));
+ update_started = GNUNET_YES;
+ }
+ GNUNET_assert (1 == event->value.search.anonymity);
+ break;
+ case GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED:
+ return NULL;
+ case GNUNET_FS_STATUS_SEARCH_STOPPED:
+ return NULL;
+ default:
+ fprintf (stderr, "Unexpected event: %d\n", event->status);
+ break;
+ }
+ return event->value.search.cctx;
+}
+
+
+static void
+publish_cont (void *cls, const struct GNUNET_FS_Uri *ksk_uri, const char *emsg)
+{
+ char *msg;
+ struct GNUNET_FS_Uri *sks_uri;
+ char sbuf[1024];
+ struct GNUNET_CRYPTO_HashAsciiEncoded enc;
+
+ if (NULL != emsg)
+ {
+ fprintf (stderr, "Error publishing: %s\n", emsg);
+ err = 1;
+ GNUNET_FS_stop (fs);
+ return;
+ }
+ GNUNET_CRYPTO_hash_to_enc (&nsid, &enc);
+ GNUNET_snprintf (sbuf, sizeof (sbuf), "gnunet://fs/sks/%s/this", &enc);
+ sks_uri = GNUNET_FS_uri_parse (sbuf, &msg);
+ if (msg != NULL)
+ {
+ fprintf (stderr, "failed to parse URI `%s': %s\n", sbuf, msg);
+ err = 1;
+ GNUNET_FS_stop (fs);
+ GNUNET_free (msg);
+ return;
+ }
+ ksk_search =
+ GNUNET_FS_search_start (fs, ksk_uri, 1, GNUNET_FS_SEARCH_OPTION_NONE,
+ "ksk_search");
+ sks_search =
+ GNUNET_FS_search_start (fs, sks_uri, 1, GNUNET_FS_SEARCH_OPTION_NONE,
+ "sks_search");
+ GNUNET_FS_uri_destroy (sks_uri);
+}
+
+
+static void
+sks_cont (void *cls, const struct GNUNET_FS_Uri *uri, const char *emsg)