diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-04-02 14:46:41 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-04-02 14:46:41 +0000 |
commit | 0b4c380fb5a0517f71dbc9fdfb9620abfb792c92 (patch) | |
tree | 7caf4e477541c67ffdcdd39fc5f56c543e92b540 /src/fs/fs_directory.c | |
parent | f6e67a5f9de4284c79a4331ac1a00e02e798777f (diff) | |
download | gnunet-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.c | 86 |
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 | */ | ||
102 | struct 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 | */ | ||
134 | static int | ||
135 | find_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); |