aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_directory.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2009-08-28 09:05:15 +0000
committerChristian Grothoff <christian@grothoff.org>2009-08-28 09:05:15 +0000
commit3b7b7b388b7968c11556ba92060a17a964c46451 (patch)
treebd37d3a7deb01c3c3a05326f7893f81732afc8f9 /src/fs/fs_directory.c
parent57df0fbf8398720fbd4a9cf34934c212ea00ee54 (diff)
downloadgnunet-3b7b7b388b7968c11556ba92060a17a964c46451.tar.gz
gnunet-3b7b7b388b7968c11556ba92060a17a964c46451.zip
stuff
Diffstat (limited to 'src/fs/fs_directory.c')
-rw-r--r--src/fs/fs_directory.c59
1 files changed, 34 insertions, 25 deletions
diff --git a/src/fs/fs_directory.c b/src/fs/fs_directory.c
index e5a9f963f..489cf8f19 100644
--- a/src/fs/fs_directory.c
+++ b/src/fs/fs_directory.c
@@ -24,7 +24,6 @@
24 * @author Christian Grothoff 24 * @author Christian Grothoff
25 * 25 *
26 * TODO: 26 * TODO:
27 * - add support for embedded file data (use padding room!)
28 * - modify directory builder API to support incremental 27 * - modify directory builder API to support incremental
29 * generation of directories (to allow directories that 28 * generation of directories (to allow directories that
30 * would not fit into memory to be created) 29 * would not fit into memory to be created)
@@ -42,6 +41,13 @@
42#endif 41#endif
43 42
44/** 43/**
44 * String that is used to indicate that a file
45 * is a GNUnet directory.
46 */
47#define GNUNET_DIRECTORY_MAGIC "\211GND\r\n\032\n"
48
49
50/**
45 * Does the meta-data claim that this is a directory? 51 * Does the meta-data claim that this is a directory?
46 * Checks if the mime-type is that of a GNUnet directory. 52 * Checks if the mime-type is that of a GNUnet directory.
47 * 53 *
@@ -118,6 +124,7 @@ GNUNET_FS_directory_list_contents (size_t size,
118 void *dep_cls) 124 void *dep_cls)
119{ 125{
120 const char *cdata = data; 126 const char *cdata = data;
127 char *file_data;
121 char *emsg; 128 char *emsg;
122 uint64_t pos; 129 uint64_t pos;
123 uint64_t align; 130 uint64_t align;
@@ -217,17 +224,18 @@ GNUNET_FS_directory_list_contents (size_t size,
217 return; /* malformed ! */ 224 return; /* malformed ! */
218 } 225 }
219 pos += mdSize; 226 pos += mdSize;
220 // EXTRACTOR_GNUNET_FULL_DATA
221 /* FIXME: add support for embedded data */
222 filename = GNUNET_CONTAINER_meta_data_get_by_type (md, 227 filename = GNUNET_CONTAINER_meta_data_get_by_type (md,
223 EXTRACTOR_FILENAME); 228 EXTRACTOR_FILENAME);
229 file_data = GNUNET_CONTAINER_meta_data_get_by_type (md,
230 EXTRACTOR_GNUNET_FULL_DATA);
224 if (dep != NULL) 231 if (dep != NULL)
225 dep (dep_cls, 232 dep (dep_cls,
226 filename, 233 filename,
227 uri, 234 uri,
228 md, 235 md,
229 0, 236 (file_data != NULL) ? strlen(file_data) : 0,
230 NULL); 237 file_data);
238 GNUNET_free_non_null (file_data);
231 GNUNET_free_non_null (filename); 239 GNUNET_free_non_null (filename);
232 GNUNET_CONTAINER_meta_data_destroy (md); 240 GNUNET_CONTAINER_meta_data_destroy (md);
233 GNUNET_FS_uri_destroy (uri); 241 GNUNET_FS_uri_destroy (uri);
@@ -308,6 +316,7 @@ GNUNET_FS_directory_builder_add (struct GNUNET_FS_DirectoryBuilder *bld,
308 struct BuilderEntry *e; 316 struct BuilderEntry *e;
309 uint64_t fsize; 317 uint64_t fsize;
310 uint32_t big; 318 uint32_t big;
319 ssize_t ret;
311 size_t mds; 320 size_t mds;
312 size_t mdxs; 321 size_t mdxs;
313 char *uris; 322 char *uris;
@@ -316,12 +325,12 @@ GNUNET_FS_directory_builder_add (struct GNUNET_FS_DirectoryBuilder *bld,
316 struct GNUNET_CONTAINER_MetaData *meta; 325 struct GNUNET_CONTAINER_MetaData *meta;
317 const struct GNUNET_CONTAINER_MetaData *meta_use; 326 const struct GNUNET_CONTAINER_MetaData *meta_use;
318 327
319 GNUNET_assert (! GNUNET_FS_uri_ksk_test (uri)); 328 GNUNET_assert (! GNUNET_FS_uri_test_ksk (uri));
320 if (NULL != data) 329 if (NULL != data)
321 if (GNUNET_FS_uri_chk_test (uri)) 330 if (GNUNET_FS_uri_test_chk (uri))
322 fsize = GNUNET_FS_uri_chk_get_size (uri); 331 fsize = GNUNET_FS_uri_chk_get_file_size (uri);
323 else 332 else
324 fsize = GNUNET_FS_uri_chk_get_size (GNUNET_FS_uri_loc_get_uri (uri)); 333 fsize = GNUNET_FS_uri_chk_get_file_size (GNUNET_FS_uri_loc_get_uri (uri));
325 else 334 else
326 fsize = 0; /* not given */ 335 fsize = 0; /* not given */
327 if (fsize > GNUNET_FS_MAX_INLINE_SIZE) 336 if (fsize > GNUNET_FS_MAX_INLINE_SIZE)
@@ -500,8 +509,8 @@ GNUNET_FS_directory_builder_finish (struct GNUNET_FS_DirectoryBuilder *bld,
500 uint32_t big; 509 uint32_t big;
501 510
502 size = 8 + sizeof (uint32_t); 511 size = 8 + sizeof (uint32_t);
503 size += GNUNET_meta_data_get_serialized_size (bld->meta, 512 size += GNUNET_CONTAINER_meta_data_get_serialized_size (bld->meta,
504 GNUNET_SERIALIZE_FULL); 513 GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL);
505 if (bld->count > 0) 514 if (bld->count > 0)
506 { 515 {
507 sizes = GNUNET_malloc (bld->count * sizeof (size_t)); 516 sizes = GNUNET_malloc (bld->count * sizeof (size_t));
@@ -512,7 +521,7 @@ GNUNET_FS_directory_builder_finish (struct GNUNET_FS_DirectoryBuilder *bld,
512 { 521 {
513 perm[i] = i; 522 perm[i] = i;
514 bes[i] = pos; 523 bes[i] = pos;
515 sizes[i] = pos->size; 524 sizes[i] = pos->len;
516 pos = pos->next; 525 pos = pos->next;
517 } 526 }
518 } 527 }
@@ -534,22 +543,22 @@ GNUNET_FS_directory_builder_finish (struct GNUNET_FS_DirectoryBuilder *bld,
534 memcpy (data, GNUNET_DIRECTORY_MAGIC, 8); 543 memcpy (data, GNUNET_DIRECTORY_MAGIC, 8);
535 off = 8; 544 off = 8;
536 545
537 ret = GNUNET_CONTAINER_meta_data_serialize (meta, 546 ret = GNUNET_CONTAINER_meta_data_serialize (bld->meta,
538 &(*data)[off + 547 &data[off +
539 sizeof (uint32_t)], 548 sizeof (uint32_t)],
540 size - pos - sizeof (uint32_t), 549 size - off - sizeof (uint32_t),
541 GNUNET_SERIALIZE_FULL); 550 GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL);
542 GNUNET_assert (ret != -1); 551 GNUNET_assert (ret != -1);
543 big = htonl (ret); 552 big = htonl (ret);
544 memcpy (&(*data)[8], &big, sizeof (uint32_t)); 553 memcpy (&data[8], &big, sizeof (uint32_t));
545 pos += sizeof (uint32_t) + ret; 554 off += sizeof (uint32_t) + ret;
546 for (j = 0; j < count; j++) 555 for (j = 0; j < bld->count; j++)
547 { 556 {
548 i = perm[j]; 557 i = perm[j];
549 psize = pos; 558 psize = off;
550 pos += sizes[i]; 559 off += sizes[i];
551 pos = do_align (psize, pos); 560 off = do_align (psize, off);
552 memcpy (&data[pos - sizes[i]], 561 memcpy (&data[off - sizes[i]],
553 &(bes[i])[1], 562 &(bes[i])[1],
554 sizes[i]); 563 sizes[i]);
555 GNUNET_free (bes[i]); 564 GNUNET_free (bes[i]);
@@ -557,7 +566,7 @@ GNUNET_FS_directory_builder_finish (struct GNUNET_FS_DirectoryBuilder *bld,
557 GNUNET_free (sizes); 566 GNUNET_free (sizes);
558 GNUNET_free (perm); 567 GNUNET_free (perm);
559 GNUNET_free (bes); 568 GNUNET_free (bes);
560 GNUNET_assert (pos == size); 569 GNUNET_assert (off == size);
561 GNUNET_CONTAINER_meta_data_destroy (bld->meta); 570 GNUNET_CONTAINER_meta_data_destroy (bld->meta);
562 GNUNET_free (bld); 571 GNUNET_free (bld);
563} 572}