X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ffs%2Fgnunet-publish.c;h=a1b26dbd5845da11eae06fee745c23cdd009a762;hb=1f09f4f7716db5939ec1c9a278b5661616dd72d6;hp=15054a7229d33e65913c92af11abc9fd95aad1fd;hpb=415c958a01ab6dac73b0109becbe8657b525af9c;p=oweals%2Fgnunet.git diff --git a/src/fs/gnunet-publish.c b/src/fs/gnunet-publish.c index 15054a722..a1b26dbd5 100644 --- a/src/fs/gnunet-publish.c +++ b/src/fs/gnunet-publish.c @@ -95,6 +95,29 @@ do_stop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) } +/** + * Stop the directory scanner (we had an error). + * + * @param cls closure + * @param tc scheduler context + */ +static void +stop_scanner_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + kill_task = GNUNET_SCHEDULER_NO_TASK; + GNUNET_FS_directory_scan_abort (ds); + ds = NULL; + if (namespace != NULL) + { + GNUNET_FS_namespace_delete (namespace, GNUNET_NO); + namespace = NULL; + } + GNUNET_FS_stop (ctx); + ctx = NULL; + ret = 1; +} + + /** * Called by FS client to give information about the progress of an * operation. @@ -268,6 +291,12 @@ publish_inspector (void *cls, struct GNUNET_FS_FileInformation *fi, } if (!do_disable_creation_time) GNUNET_CONTAINER_meta_data_add_publication_date (m); + if ( (disable_extractor) && + (NULL != *uri) ) + { + GNUNET_FS_uri_destroy (*uri); + *uri = NULL; + } if (extract_only) { fn = GNUNET_CONTAINER_meta_data_get_by_type (m, @@ -333,7 +362,7 @@ uri_ksk_continuation (void *cls, const struct GNUNET_FS_Uri *ksk_uri, { GNUNET_FS_publish_sks (ctx, ns, this_id, next_id, meta, uri, &bo, GNUNET_FS_PUBLISH_OPTION_NONE, - uri_sks_continuation, NULL); + &uri_sks_continuation, NULL); GNUNET_assert (GNUNET_OK == GNUNET_FS_namespace_delete (ns, GNUNET_NO)); return; } @@ -345,6 +374,9 @@ uri_ksk_continuation (void *cls, const struct GNUNET_FS_Uri *ksk_uri, } +/** + * FIXME: docu + */ static struct GNUNET_FS_FileInformation * get_file_information (struct GNUNET_FS_ShareTreeItem *item) { @@ -352,7 +384,7 @@ get_file_information (struct GNUNET_FS_ShareTreeItem *item) struct GNUNET_FS_FileInformation *fic; struct GNUNET_FS_ShareTreeItem *child; - if (item->is_directory) + if (item->is_directory == GNUNET_YES) { GNUNET_CONTAINER_meta_data_delete (item->meta, EXTRACTOR_METATYPE_MIMETYPE, NULL, 0); @@ -385,6 +417,9 @@ get_file_information (struct GNUNET_FS_ShareTreeItem *item) } +/** + * FIXME: docu + */ static void directory_trim_complete () { @@ -409,6 +444,11 @@ directory_trim_complete () GNUNET_FS_namespace_delete (namespace, GNUNET_NO); GNUNET_FS_file_information_destroy (fi, NULL, NULL); GNUNET_FS_stop (ctx); + if (kill_task != GNUNET_SCHEDULER_NO_TASK) + { + GNUNET_SCHEDULER_cancel (kill_task); + kill_task = GNUNET_SCHEDULER_NO_TASK; + } return; } pc = GNUNET_FS_publish_start (ctx, fi, namespace, this_id, next_id, @@ -425,54 +465,67 @@ directory_trim_complete () } +/** + * Function called by the directory scanner as we build the tree + * that we will need to publish later. + * + * @param cls closure + * @param filename which file we are making progress on + * @param is_directory GNUNET_YES if this is a directory, + * GNUNET_NO if this is a file + * GNUNET_SYSERR if it is neither (or unknown) + * @param reason kind of progress we are making + */ static void -directory_scan_cb (void *cls, struct GNUNET_FS_DirScanner *ds, +directory_scan_cb (void *cls, const char *filename, int is_directory, enum GNUNET_FS_DirScannerProgressUpdateReason reason) { switch (reason) { - case GNUNET_FS_DIRSCANNER_FILE_START: - if (is_directory) + case GNUNET_FS_DIRSCANNER_FILE_START: + if (verbose > 1) + { + if (is_directory == GNUNET_YES) FPRINTF (stdout, _("Scanning directory `%s'.\n"), filename); else FPRINTF (stdout, _("Scanning file `%s'.\n"), filename); - break; - case GNUNET_FS_DIRSCANNER_SUBTREE_COUNTED: - if (is_directory) - FPRINTF (stdout, _("Done scanning directory `%s'.\n"), filename); - break; - case GNUNET_FS_DIRSCANNER_ALL_COUNTED: + } + break; + case GNUNET_FS_DIRSCANNER_FILE_IGNORED: + FPRINTF (stderr, + _("There was trouble processing file `%s', skipping it.\n"), + filename); + break; + case GNUNET_FS_DIRSCANNER_ALL_COUNTED: + if (verbose) FPRINTF (stdout, "%s", _("Preprocessing complete.\n")); - break; - case GNUNET_FS_DIRSCANNER_EXTRACT_FINISHED: + break; + case GNUNET_FS_DIRSCANNER_EXTRACT_FINISHED: + if (verbose > 2) FPRINTF (stdout, _("Extracting meta data from file `%s' complete.\n"), filename); - break; - case GNUNET_FS_DIRSCANNER_DOES_NOT_EXIST: - FPRINTF (stdout, - _("There was trouble processing file `%s', skipping it.\n"), - filename); - break; - case GNUNET_FS_DIRSCANNER_FINISHED: - FPRINTF (stdout, "%s", _("Scanner has finished.\n")); - directory_scan_result = GNUNET_FS_directory_scan_get_result (ds); - ds = NULL; - GNUNET_FS_share_tree_trim (directory_scan_result); - directory_trim_complete (); - break; - case GNUNET_FS_DIRSCANNER_INTERNAL_ERROR: - FPRINTF (stdout, "%s", _("Internal error scanning directory.\n")); - GNUNET_FS_directory_scan_abort (ds); - ds = NULL; - if (namespace != NULL) - GNUNET_FS_namespace_delete (namespace, GNUNET_NO); - GNUNET_FS_stop (ctx); - ret = 1; - break; - default: - GNUNET_assert (0); - break; + break; + case GNUNET_FS_DIRSCANNER_FINISHED: + if (verbose > 1) + FPRINTF (stdout, "%s", _("Meta data extraction has finished.\n")); + directory_scan_result = GNUNET_FS_directory_scan_get_result (ds); + ds = NULL; + GNUNET_FS_share_tree_trim (directory_scan_result); + directory_trim_complete (); + break; + case GNUNET_FS_DIRSCANNER_INTERNAL_ERROR: + FPRINTF (stdout, "%s", _("Internal error scanning directory.\n")); + if (kill_task != GNUNET_SCHEDULER_NO_TASK) + { + GNUNET_SCHEDULER_cancel (kill_task); + kill_task = GNUNET_SCHEDULER_NO_TASK; + } + kill_task = GNUNET_SCHEDULER_add_now (&stop_scanner_task, NULL); + break; + default: + GNUNET_assert (0); + break; } fflush (stdout); } @@ -586,11 +639,24 @@ run (void *cls, char *const *args, const char *cfgfile, if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, "FS", "EXTRACTORS", &ex)) ex = NULL; - + if (0 != ACCESS (args[0], R_OK)) + { + FPRINTF (stderr, + _("Failed to access `%s': %s\n"), + args[0], + STRERROR (errno)); + return; + } ds = GNUNET_FS_directory_scan_start (args[0], disable_extractor, ex, &directory_scan_cb, NULL); + if (NULL == ds) + { + FPRINTF (stderr, + "%s", _("Failed to start meta directory scanner. Is gnunet-helper-publish-fs installed?\n")); + return; + } kill_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &do_stop_task, NULL);