static void file_hasher (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { GNUNET_assert (NULL != GNUNET_CRYPTO_hash_file (GNUNET_SCHEDULER_PRIORITY_DEFAULT, FILENAME, 1024, &finished_task, cls)); }
/** * Unindex a file. * * @param h handle to the file sharing subsystem * @param filename file to unindex * @param cctx initial value for the client context * @return NULL on error, otherwise handle */ struct GNUNET_FS_UnindexContext * GNUNET_FS_unindex_start (struct GNUNET_FS_Handle *h, const char *filename, void *cctx) { struct GNUNET_FS_UnindexContext *uc; struct GNUNET_FS_ProgressInfo pi; uint64_t size; if (GNUNET_OK != GNUNET_DISK_file_size (filename, &size, GNUNET_YES, GNUNET_YES)) return NULL; uc = GNUNET_new (struct GNUNET_FS_UnindexContext); uc->h = h; uc->filename = GNUNET_strdup (filename); uc->start_time = GNUNET_TIME_absolute_get (); uc->file_size = size; uc->client_info = cctx; uc->seen_dh = GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO); GNUNET_FS_unindex_sync_ (uc); pi.status = GNUNET_FS_STATUS_UNINDEX_START; pi.value.unindex.eta = GNUNET_TIME_UNIT_FOREVER_REL; GNUNET_FS_unindex_make_status_ (&pi, uc, 0); uc->fhc = GNUNET_CRYPTO_hash_file (GNUNET_SCHEDULER_PRIORITY_IDLE, filename, HASHING_BLOCKSIZE, &GNUNET_FS_unindex_process_hash_, uc); uc->top = GNUNET_FS_make_top (h, &GNUNET_FS_unindex_signal_suspend_, uc); return uc; }
/** * Handle INDEX_START-message. * * @param cls closure * @param client identification of the client * @param message the actual message */ void GNUNET_FS_handle_index_start (void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { const struct IndexStartMessage *ism; char *fn; uint16_t msize; struct IndexInfo *ii; size_t slen; uint64_t dev; uint64_t ino; uint64_t mydev; uint64_t myino; msize = ntohs (message->size); if ((msize <= sizeof (struct IndexStartMessage)) || (((const char *) message)[msize - 1] != '\0')) { GNUNET_break (0); GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); return; } ism = (const struct IndexStartMessage *) message; if (0 != ism->reserved) { GNUNET_break (0); GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); return; } fn = GNUNET_STRINGS_filename_expand ((const char *) &ism[1]); if (fn == NULL) { GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); return; } dev = GNUNET_ntohll (ism->device); ino = GNUNET_ntohll (ism->inode); ism = (const struct IndexStartMessage *) message; slen = strlen (fn) + 1; ii = GNUNET_malloc (sizeof (struct IndexInfo) + slen); ii->filename = (const char *) &ii[1]; memcpy (&ii[1], fn, slen); ii->file_id = ism->file_id; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message for file `%s'\n", "START_INDEX", ii->filename); ii->tc = GNUNET_SERVER_transmit_context_create (client); mydev = 0; myino = 0; if (((dev != 0) || (ino != 0)) && (GNUNET_OK == GNUNET_DISK_file_get_identifiers (fn, &mydev, &myino)) && ((dev == mydev) && (ino == myino))) { /* fast validation OK! */ signal_index_ok (ii); GNUNET_free (fn); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Mismatch in file identifiers (%llu != %llu or %u != %u), need to hash.\n", (unsigned long long) ino, (unsigned long long) myino, (unsigned int) dev, (unsigned int) mydev); /* slow validation, need to hash full file (again) */ ii->fhc = GNUNET_CRYPTO_hash_file (GNUNET_SCHEDULER_PRIORITY_IDLE, fn, HASHING_BLOCKSIZE, &hash_for_index_val, ii); if (ii->fhc == NULL) hash_for_index_val (ii, NULL); GNUNET_free (fn); }