diff options
author | Christian Grothoff <christian@grothoff.org> | 2009-08-28 09:05:15 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2009-08-28 09:05:15 +0000 |
commit | 3b7b7b388b7968c11556ba92060a17a964c46451 (patch) | |
tree | bd37d3a7deb01c3c3a05326f7893f81732afc8f9 /src/fs/fs_directory.c | |
parent | 57df0fbf8398720fbd4a9cf34934c212ea00ee54 (diff) | |
download | gnunet-3b7b7b388b7968c11556ba92060a17a964c46451.tar.gz gnunet-3b7b7b388b7968c11556ba92060a17a964c46451.zip |
stuff
Diffstat (limited to 'src/fs/fs_directory.c')
-rw-r--r-- | src/fs/fs_directory.c | 59 |
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 | } |