diff options
Diffstat (limited to 'src/fs/fs_download.c')
-rw-r--r-- | src/fs/fs_download.c | 169 |
1 files changed, 86 insertions, 83 deletions
diff --git a/src/fs/fs_download.c b/src/fs/fs_download.c index 4b5af3789..b4f16518d 100644 --- a/src/fs/fs_download.c +++ b/src/fs/fs_download.c | |||
@@ -322,14 +322,19 @@ GNUNET_FS_meta_data_suggest_filename (const struct GNUNET_CONTAINER_MetaData *md | |||
322 | {"video/x-msvideo", ".avi"}, | 322 | {"video/x-msvideo", ".avi"}, |
323 | {NULL, NULL}, | 323 | {NULL, NULL}, |
324 | }; | 324 | }; |
325 | 325 | char *ret; | |
326 | unsigned int i; | 326 | unsigned int i; |
327 | char *mime; | 327 | char *mime; |
328 | char *base; | ||
328 | const char *ext; | 329 | const char *ext; |
329 | 330 | ||
330 | ext = ""; | 331 | ret = GNUNET_CONTAINER_meta_data_get_by_type (md, |
331 | mime = NULL; | 332 | EXTRACTOR_METATYPE_FILENAME); |
332 | // FIXME: get mime from meta data | 333 | if (ret != NULL) |
334 | return ret; | ||
335 | ext = NULL; | ||
336 | mime = GNUNET_CONTAINER_meta_data_get_by_type (md, | ||
337 | EXTRACTOR_METATYPE_MIMETYPE); | ||
333 | if (mime != NULL) | 338 | if (mime != NULL) |
334 | { | 339 | { |
335 | i = 0; | 340 | i = 0; |
@@ -343,70 +348,39 @@ GNUNET_FS_meta_data_suggest_filename (const struct GNUNET_CONTAINER_MetaData *md | |||
343 | mime); | 348 | mime); |
344 | else | 349 | else |
345 | ext = mimeMap[i][1]; | 350 | ext = mimeMap[i][1]; |
351 | GNUNET_free (mime); | ||
346 | } | 352 | } |
347 | // FIXME: try to get some base name... | 353 | base = GNUNET_CONTAINER_meta_data_get_first_by_types (md, |
348 | #if 0 | 354 | EXTRACTOR_METATYPE_TITLE, |
349 | const char *key; | 355 | EXTRACTOR_METATYPE_BOOK_TITLE, |
350 | const char *mime; | 356 | EXTRACTOR_METATYPE_ORIGINAL_TITLE, |
351 | char *path; | 357 | EXTRACTOR_METATYPE_PACKAGE_NAME, |
352 | unsigned int j; | 358 | EXTRACTOR_METATYPE_URL, |
353 | char *renameTo; | 359 | EXTRACTOR_METATYPE_URI, |
354 | char *ret; | 360 | EXTRACTOR_METATYPE_DESCRIPTION, |
355 | size_t max; | 361 | EXTRACTOR_METATYPE_ISRC, |
356 | struct stat filestat; | 362 | EXTRACTOR_METATYPE_JOURNAL_NAME, |
357 | 363 | EXTRACTOR_METATYPE_AUTHOR_NAME, | |
358 | key = EXTRACTOR_extractLast (EXTRACTOR_TITLE, list); | 364 | EXTRACTOR_METATYPE_SUBJECT, |
359 | if (key == NULL) | 365 | EXTRACTOR_METATYPE_ALBUM, |
360 | key = EXTRACTOR_extractLast (EXTRACTOR_SOFTWARE, list); | 366 | EXTRACTOR_METATYPE_ARTIST, |
361 | if (key == NULL) | 367 | EXTRACTOR_METATYPE_KEYWORDS, |
362 | key = EXTRACTOR_extractLast (EXTRACTOR_DESCRIPTION, list); | 368 | EXTRACTOR_METATYPE_COMMENT, |
363 | if (key == NULL) | 369 | EXTRACTOR_METATYPE_UNKNOWN, |
364 | key = EXTRACTOR_extractLast (EXTRACTOR_COMMENT, list); | 370 | -1); |
365 | if (key == NULL) | 371 | if ( (base == NULL) && |
366 | key = EXTRACTOR_extractLast (EXTRACTOR_SUBJECT, list); | 372 | (ext == NULL) ) |
367 | if (key == NULL) | 373 | return NULL; |
368 | key = EXTRACTOR_extractLast (EXTRACTOR_ALBUM, list); | 374 | if (base == NULL) |
369 | if (key == NULL) | 375 | return GNUNET_strdup (ext); |
370 | key = EXTRACTOR_extractLast (EXTRACTOR_UNKNOWN, list); | 376 | if (ext == NULL) |
371 | mime = EXTRACTOR_extractLast (EXTRACTOR_MIMETYPE, list); | 377 | return base; |
372 | if (mime != NULL) | 378 | GNUNET_asprintf (&ret, |
373 | { | 379 | "%s%s", |
374 | } | 380 | base, |
375 | if (key == NULL) | 381 | ext); |
376 | { | 382 | GNUNET_free (base); |
377 | key = &filename[strlen (filename) - 1]; | 383 | return ret; |
378 | while ((key != filename) && (key[0] != DIR_SEPARATOR)) | ||
379 | key--; | ||
380 | if (key[0] == DIR_SEPARATOR) | ||
381 | key++; | ||
382 | } | ||
383 | GNUNET_snprintf (renameTo, | ||
384 | max, | ||
385 | "%s%s%.*s%s", | ||
386 | path, | ||
387 | (path[strlen (path) - 1] != | ||
388 | DIR_SEPARATOR) ? DIR_SEPARATOR_STR : "", | ||
389 | GNUNET_MIN (255 - strlen (mime), | ||
390 | PATH_MAX - strlen (path) - 64), key, | ||
391 | (strcasecmp | ||
392 | (renameTo + strlen (renameTo) - strlen (mime), | ||
393 | mime) != 0) ? mime : ""); | ||
394 | |||
395 | |||
396 | } | ||
397 | for (i = strlen (renameTo) - 1; i >= 0; i--) | ||
398 | if (!isprint (renameTo[i])) | ||
399 | renameTo[i] = '_'; | ||
400 | else if (renameTo[i] == '.' && i > 0 && renameTo[i - 1] == '.') | ||
401 | { | ||
402 | /* remove .. to avoid directory traversal */ | ||
403 | renameTo[i - 1] = renameTo[i] = '_'; | ||
404 | i--; | ||
405 | } | ||
406 | #endif | ||
407 | |||
408 | GNUNET_break (0); // FIXME: not implemented | ||
409 | return NULL; | ||
410 | } | 384 | } |
411 | 385 | ||
412 | 386 | ||
@@ -521,6 +495,7 @@ trigger_recursive_download (void *cls, | |||
521 | { | 495 | { |
522 | struct GNUNET_FS_DownloadContext *dc = cls; | 496 | struct GNUNET_FS_DownloadContext *dc = cls; |
523 | struct GNUNET_FS_DownloadContext *cpos; | 497 | struct GNUNET_FS_DownloadContext *cpos; |
498 | struct GNUNET_DISK_FileHandle *fh; | ||
524 | char *fn; | 499 | char *fn; |
525 | char *us; | 500 | char *us; |
526 | char *ext; | 501 | char *ext; |
@@ -573,11 +548,15 @@ trigger_recursive_download (void *cls, | |||
573 | else | 548 | else |
574 | { | 549 | { |
575 | dn = GNUNET_strdup (dc->filename); | 550 | dn = GNUNET_strdup (dc->filename); |
576 | GNUNET_break ( (strlen (dn) < strlen (GNUNET_FS_DIRECTORY_EXT)) || | 551 | GNUNET_break ( (strlen (dn) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && |
577 | (NULL == | 552 | (NULL != |
578 | strstr (dn + strlen(dn) - strlen(GNUNET_FS_DIRECTORY_EXT), | 553 | strstr (dn + strlen(dn) - strlen(GNUNET_FS_DIRECTORY_EXT), |
579 | GNUNET_FS_DIRECTORY_EXT)) ); | 554 | GNUNET_FS_DIRECTORY_EXT)) ); |
580 | dn[strlen(dn) - strlen (GNUNET_FS_DIRECTORY_EXT)] = '\0'; | 555 | if ( (strlen (dn) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && |
556 | (NULL != | ||
557 | strstr (dn + strlen(dn) - strlen(GNUNET_FS_DIRECTORY_EXT), | ||
558 | GNUNET_FS_DIRECTORY_EXT)) ) | ||
559 | dn[strlen(dn) - strlen (GNUNET_FS_DIRECTORY_EXT)] = '\0'; | ||
581 | if ( (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (meta)) && | 560 | if ( (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (meta)) && |
582 | ( (strlen (filename) < strlen (GNUNET_FS_DIRECTORY_EXT)) || | 561 | ( (strlen (filename) < strlen (GNUNET_FS_DIRECTORY_EXT)) || |
583 | (NULL == | 562 | (NULL == |
@@ -617,8 +596,28 @@ trigger_recursive_download (void *cls, | |||
617 | { | 596 | { |
618 | if (full_name != NULL) | 597 | if (full_name != NULL) |
619 | { | 598 | { |
620 | /* determine on-disk filename, write data! */ | 599 | fh = GNUNET_DISK_file_open (full_name, |
621 | GNUNET_break (0); // FIXME: not implemented | 600 | GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_TRUNCATE | GNUNET_DISK_OPEN_CREATE, |
601 | GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); | ||
602 | if (fh == NULL) | ||
603 | { | ||
604 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, | ||
605 | "open", | ||
606 | full_name); | ||
607 | GNUNET_free (full_name); | ||
608 | GNUNET_free_non_null (fn); | ||
609 | return; | ||
610 | } | ||
611 | if (length != | ||
612 | GNUNET_DISK_file_write (fh, | ||
613 | data, | ||
614 | length)) | ||
615 | { | ||
616 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, | ||
617 | "write", | ||
618 | full_name); | ||
619 | } | ||
620 | GNUNET_DISK_file_close (fh); | ||
622 | } | 621 | } |
623 | else | 622 | else |
624 | { | 623 | { |
@@ -866,15 +865,13 @@ process_result_with_request (void *cls, | |||
866 | ( (strlen (dc->filename) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && | 865 | ( (strlen (dc->filename) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && |
867 | (NULL != | 866 | (NULL != |
868 | strstr (dc->filename + strlen(dc->filename) - strlen(GNUNET_FS_DIRECTORY_EXT), | 867 | strstr (dc->filename + strlen(dc->filename) - strlen(GNUNET_FS_DIRECTORY_EXT), |
869 | GNUNET_FS_DIRECTORY_EXT)) ) ) ) ) ) | 868 | GNUNET_FS_DIRECTORY_EXT)) ) ) ) ) ) |
870 | { | 869 | GNUNET_FS_directory_list_contents (prc->size, |
871 | GNUNET_FS_directory_list_contents (prc->size, | 870 | pt, |
872 | pt, | 871 | off, |
873 | off, | 872 | &trigger_recursive_download, |
874 | &trigger_recursive_download, | 873 | dc); |
875 | dc); | 874 | |
876 | } | ||
877 | |||
878 | } | 875 | } |
879 | 876 | ||
880 | pi.status = GNUNET_FS_STATUS_DOWNLOAD_PROGRESS; | 877 | pi.status = GNUNET_FS_STATUS_DOWNLOAD_PROGRESS; |
@@ -906,7 +903,13 @@ process_result_with_request (void *cls, | |||
906 | } | 903 | } |
907 | 904 | ||
908 | if ( (0 != (dc->options & GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE)) && | 905 | if ( (0 != (dc->options & GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE)) && |
909 | (GNUNET_NO != GNUNET_FS_meta_data_test_for_directory (dc->meta)) ) | 906 | ( (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (dc->meta)) || |
907 | ( (dc->meta == NULL) && | ||
908 | ( (NULL == dc->filename) || | ||
909 | ( (strlen (dc->filename) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && | ||
910 | (NULL != | ||
911 | strstr (dc->filename + strlen(dc->filename) - strlen(GNUNET_FS_DIRECTORY_EXT), | ||
912 | GNUNET_FS_DIRECTORY_EXT)) ) ) ) ) ) | ||
910 | full_recursive_download (dc); | 913 | full_recursive_download (dc); |
911 | if (dc->child_head == NULL) | 914 | if (dc->child_head == NULL) |
912 | { | 915 | { |