From b28ebda18f5efe2b59c0a3f318b672821e00c481 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 27 Jun 2010 11:50:00 +0000 Subject: return if directory is well-formed --- TODO | 7 ++++--- src/fs/fs_directory.c | 22 +++++++++++++--------- src/include/gnunet_fs_service.h | 5 ++++- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index 3d97e60e3..bafbcbb00 100644 --- a/TODO +++ b/TODO @@ -8,13 +8,14 @@ [On W32, we need to select after calling socket before doing connect etc.] * GNUNET-GTK: [CG] - from-URI only tab: - + display from open directory (needs 'from-URI only' tab!) - + handle download lost-parent (move to 'from-URI only' tab!) + + display from open directory - recursive downloads: + download start: recursive/directory (!) - * display directory content from download as part of search + * display directory content as part of 'open directory' + * display directory content from download as part of search * honor recursion option (may already be done, check!) - TEST download-start from-URI only in event handler + - TEST download lost-parent * BUGS: Jun 27 11:51:54 core-7670 ERROR Assertion failed at gnunet-service-core.c:3616. diff --git a/src/fs/fs_directory.c b/src/fs/fs_directory.c index de100c339..03065958e 100644 --- a/src/fs/fs_directory.c +++ b/src/fs/fs_directory.c @@ -179,8 +179,11 @@ find_full_data (void *cls, * @param offset offset of data in the directory * @param dep function to call on each entry * @param dep_cls closure for dep + * @return GNUNET_OK if this could be a block in a directory, + * GNUNET_NO if this could be part of a directory (but not 100% OK) + * GNUNET_SYSERR if 'data' does not represent a directory */ -void +int GNUNET_FS_directory_list_contents (size_t size, const void *data, uint64_t offset, @@ -209,16 +212,16 @@ GNUNET_FS_directory_list_contents (size_t size, { /* invalid size */ GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - _("Not a GNUnet directory.\n")); - return; + _("MAGIC mismatch. This is not a GNUnet directory.\n")); + return GNUNET_SYSERR; } md = GNUNET_CONTAINER_meta_data_deserialize (&cdata[8 + sizeof (uint32_t)], mdSize); if (md == NULL) { - GNUNET_break (0); - return; /* malformed ! */ + GNUNET_break (0); + return GNUNET_SYSERR; /* malformed ! */ } dep (dep_cls, NULL, @@ -254,7 +257,7 @@ GNUNET_FS_directory_list_contents (size_t size, while ((epos < size) && (cdata[epos] != '\0')) epos++; if (epos >= size) - return; /* malformed - or partial download */ + return GNUNET_NO; /* malformed - or partial download */ uri = GNUNET_FS_uri_parse (&cdata[pos], &emsg); pos = epos + 1; @@ -268,7 +271,7 @@ GNUNET_FS_directory_list_contents (size_t size, { GNUNET_FS_uri_destroy (uri); GNUNET_break (0); - return; /* illegal in directory! */ + return GNUNET_NO; /* illegal in directory! */ } memcpy (&mdSize, &cdata[pos], sizeof (uint32_t)); @@ -277,7 +280,7 @@ GNUNET_FS_directory_list_contents (size_t size, if (pos + mdSize > size) { GNUNET_FS_uri_destroy (uri); - return; /* malformed - or partial download */ + return GNUNET_NO; /* malformed - or partial download */ } md = GNUNET_CONTAINER_meta_data_deserialize (&cdata[pos], mdSize); @@ -285,7 +288,7 @@ GNUNET_FS_directory_list_contents (size_t size, { GNUNET_FS_uri_destroy (uri); GNUNET_break (0); - return; /* malformed ! */ + return GNUNET_NO; /* malformed ! */ } pos += mdSize; filename = GNUNET_CONTAINER_meta_data_get_by_type (md, @@ -309,6 +312,7 @@ GNUNET_FS_directory_list_contents (size_t size, GNUNET_CONTAINER_meta_data_destroy (md); GNUNET_FS_uri_destroy (uri); } + return GNUNET_OK; } /** diff --git a/src/include/gnunet_fs_service.h b/src/include/gnunet_fs_service.h index 09ae3682a..9495731ea 100644 --- a/src/include/gnunet_fs_service.h +++ b/src/include/gnunet_fs_service.h @@ -2602,8 +2602,11 @@ typedef void (*GNUNET_FS_DirectoryEntryProcessor)(void *cls, * @param offset offset of data in the directory * @param dep function to call on each entry * @param dep_cls closure for dep + * @return GNUNET_OK if this could be a block in a directory, + * GNUNET_NO if this could be part of a directory (but not 100% OK) + * GNUNET_SYSERR if 'data' does not represent a directory */ -void +int GNUNET_FS_directory_list_contents (size_t size, const void *data, uint64_t offset, -- cgit v1.2.3