aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_directory.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-04-02 14:46:41 +0000
committerChristian Grothoff <christian@grothoff.org>2010-04-02 14:46:41 +0000
commit0b4c380fb5a0517f71dbc9fdfb9620abfb792c92 (patch)
tree7caf4e477541c67ffdcdd39fc5f56c543e92b540 /src/fs/fs_directory.c
parentf6e67a5f9de4284c79a4331ac1a00e02e798777f (diff)
downloadgnunet-0b4c380fb5a0517f71dbc9fdfb9620abfb792c92.tar.gz
gnunet-0b4c380fb5a0517f71dbc9fdfb9620abfb792c92.zip
fix full data extraction for binary data
Diffstat (limited to 'src/fs/fs_directory.c')
-rw-r--r--src/fs/fs_directory.c86
1 files changed, 77 insertions, 9 deletions
diff --git a/src/fs/fs_directory.c b/src/fs/fs_directory.c
index 6f9939509..1879b1b74 100644
--- a/src/fs/fs_directory.c
+++ b/src/fs/fs_directory.c
@@ -97,6 +97,68 @@ GNUNET_FS_meta_data_make_directory (struct GNUNET_CONTAINER_MetaData *md)
97 97
98 98
99/** 99/**
100 * Closure for 'find_full_data'.
101 */
102struct GetFullDataClosure
103{
104
105 /**
106 * Extracted binary meta data.
107 */
108 void *data;
109
110 /**
111 * Number of bytes stored in data.
112 */
113 size_t size;
114};
115
116
117/**
118 * Type of a function that libextractor calls for each
119 * meta data item found.
120 *
121 * @param cls closure (user-defined)
122 * @param plugin_name name of the plugin that produced this value;
123 * special values can be used (i.e. '<zlib>' for zlib being
124 * used in the main libextractor library and yielding
125 * meta data).
126 * @param type libextractor-type describing the meta data
127 * @param format basic format information about data
128 * @param data_mime_type mime-type of data (not of the original file);
129 * can be NULL (if mime-type is not known)
130 * @param data actual meta-data found
131 * @param data_len number of bytes in data
132 * @return 0 to continue extracting, 1 to abort
133 */
134static int
135find_full_data (void *cls,
136 const char *plugin_name,
137 enum EXTRACTOR_MetaType type,
138 enum EXTRACTOR_MetaFormat format,
139 const char *data_mime_type,
140 const char *data,
141 size_t data_len)
142{
143 struct GetFullDataClosure *gfdc = cls;
144
145 if (type == EXTRACTOR_METATYPE_GNUNET_FULL_DATA)
146 {
147 gfdc->size = data_len;
148 if (data_len > 0)
149 {
150 gfdc->data = GNUNET_malloc (data_len);
151 memcpy (gfdc->data,
152 data,
153 data_len);
154 }
155 return 1;
156 }
157 return 0;
158}
159
160
161/**
100 * Iterate over all entries in a directory. Note that directories 162 * Iterate over all entries in a directory. Note that directories
101 * are structured such that it is possible to iterate over the 163 * are structured such that it is possible to iterate over the
102 * individual blocks as well as over the entire directory. Thus 164 * individual blocks as well as over the entire directory. Thus
@@ -125,6 +187,7 @@ GNUNET_FS_directory_list_contents (size_t size,
125 GNUNET_FS_DirectoryEntryProcessor dep, 187 GNUNET_FS_DirectoryEntryProcessor dep,
126 void *dep_cls) 188 void *dep_cls)
127{ 189{
190 struct GetFullDataClosure full_data;
128 const char *cdata = data; 191 const char *cdata = data;
129 char *file_data; 192 char *file_data;
130 char *emsg; 193 char *emsg;
@@ -228,16 +291,21 @@ GNUNET_FS_directory_list_contents (size_t size,
228 pos += mdSize; 291 pos += mdSize;
229 filename = GNUNET_CONTAINER_meta_data_get_by_type (md, 292 filename = GNUNET_CONTAINER_meta_data_get_by_type (md,
230 EXTRACTOR_METATYPE_FILENAME); 293 EXTRACTOR_METATYPE_FILENAME);
231 file_data = GNUNET_CONTAINER_meta_data_get_by_type (md, 294 full_data.size = 0;
232 EXTRACTOR_METATYPE_GNUNET_FULL_DATA); 295 full_data.data = NULL;
296 GNUNET_CONTAINER_meta_data_iterate (md,
297 &find_full_data,
298 &full_data);
233 if (dep != NULL) 299 if (dep != NULL)
234 dep (dep_cls, 300 {
235 filename, 301 dep (dep_cls,
236 uri, 302 filename,
237 md, 303 uri,
238 (file_data != NULL) ? strlen(file_data) : 0, 304 md,
239 file_data); 305 full_data.data,
240 GNUNET_free_non_null (file_data); 306 full_data.size);
307 }
308 GNUNET_free_non_null (full_data.file_data);
241 GNUNET_free_non_null (filename); 309 GNUNET_free_non_null (filename);
242 GNUNET_CONTAINER_meta_data_destroy (md); 310 GNUNET_CONTAINER_meta_data_destroy (md);
243 GNUNET_FS_uri_destroy (uri); 311 GNUNET_FS_uri_destroy (uri);