From 5826f9d6280175acde486a1b02c93197a49396bd Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 11 Jan 2012 21:11:51 +0000 Subject: [PATCH] fixing bug to ensure that we properly descend into deep directories for the various publish start/stop/suspend/resume event callbacks --- src/fs/fs_api.c | 19 +++++++++++++++---- src/fs/fs_api.h | 7 +++++++ src/fs/fs_publish.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/fs/fs_api.c b/src/fs/fs_api.c index 2b1e51031..3c0d5bc72 100644 --- a/src/fs/fs_api.c +++ b/src/fs/fs_api.c @@ -1243,13 +1243,24 @@ fip_signal_resume (void *cls, struct GNUNET_FS_FileInformation *fi, struct GNUNET_FS_BlockOptions *bo, int *do_index, void **client_info) { - struct GNUNET_FS_PublishContext *sc = cls; + struct GNUNET_FS_PublishContext *pc = cls; struct GNUNET_FS_ProgressInfo pi; + if (GNUNET_YES == pc->skip_next_fi_callback) + { + pc->skip_next_fi_callback = GNUNET_NO; + return GNUNET_OK; + } pi.status = GNUNET_FS_STATUS_PUBLISH_RESUME; - pi.value.publish.specifics.resume.message = sc->fi->emsg; - pi.value.publish.specifics.resume.chk_uri = sc->fi->chk_uri; - *client_info = GNUNET_FS_publish_make_status_ (&pi, sc, fi, 0); + pi.value.publish.specifics.resume.message = pc->fi->emsg; + pi.value.publish.specifics.resume.chk_uri = pc->fi->chk_uri; + *client_info = GNUNET_FS_publish_make_status_ (&pi, pc, fi, 0); + if (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (meta)) + { + /* process entries in directory */ + pc->skip_next_fi_callback = GNUNET_YES; + GNUNET_FS_file_information_inspect (fi, &fip_signal_resume, pc); + } return GNUNET_OK; } diff --git a/src/fs/fs_api.h b/src/fs/fs_api.h index 4f3781d01..42daa7bc2 100644 --- a/src/fs/fs_api.h +++ b/src/fs/fs_api.h @@ -1203,6 +1203,13 @@ struct GNUNET_FS_PublishContext * Set to GNUNET_YES if all processing has completed. */ int all_done; + + /** + * Flag set to GNUNET_YES if the next callback from + * GNUNET_FS_file_information_inspect should be skipped because it + * is for the directory which was already processed with the parent. + */ + int skip_next_fi_callback; }; diff --git a/src/fs/fs_publish.c b/src/fs/fs_publish.c index 05f667451..4ae3264a2 100644 --- a/src/fs/fs_publish.c +++ b/src/fs/fs_publish.c @@ -954,6 +954,11 @@ fip_signal_start (void *cls, struct GNUNET_FS_FileInformation *fi, unsigned int kc; uint64_t left; + if (GNUNET_YES == pc->skip_next_fi_callback) + { + pc->skip_next_fi_callback = GNUNET_NO; + return GNUNET_OK; + } #if DEBUG_PUBLISH GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting publish operation\n"); #endif @@ -991,6 +996,12 @@ fip_signal_start (void *cls, struct GNUNET_FS_FileInformation *fi, pi.status = GNUNET_FS_STATUS_PUBLISH_START; *client_info = GNUNET_FS_publish_make_status_ (&pi, pc, fi, 0); GNUNET_FS_file_information_sync_ (fi); + if (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (meta)) + { + /* process entries in directory */ + pc->skip_next_fi_callback = GNUNET_YES; + GNUNET_FS_file_information_inspect (fi, &fip_signal_start, pc); + } return GNUNET_OK; } @@ -1020,6 +1031,17 @@ fip_signal_suspend (void *cls, struct GNUNET_FS_FileInformation *fi, struct GNUNET_FS_ProgressInfo pi; uint64_t off; + if (GNUNET_YES == pc->skip_next_fi_callback) + { + pc->skip_next_fi_callback = GNUNET_NO; + return GNUNET_OK; + } + if (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (meta)) + { + /* process entries in directory */ + pc->skip_next_fi_callback = GNUNET_YES; + GNUNET_FS_file_information_inspect (fi, &fip_signal_suspend, pc); + } #if DEBUG_PUBLISH GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Suspending publish operation\n"); #endif @@ -1204,6 +1226,17 @@ fip_signal_stop (void *cls, struct GNUNET_FS_FileInformation *fi, struct GNUNET_FS_ProgressInfo pi; uint64_t off; + if (GNUNET_YES == pc->skip_next_fi_callback) + { + pc->skip_next_fi_callback = GNUNET_NO; + return GNUNET_OK; + } + if (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (meta)) + { + /* process entries in directory first */ + pc->skip_next_fi_callback = GNUNET_YES; + GNUNET_FS_file_information_inspect (fi, &fip_signal_stop, pc); + } if (fi->serialization != NULL) { GNUNET_FS_remove_sync_file_ (pc->h, GNUNET_FS_SYNC_PATH_FILE_INFO, -- 2.25.1