aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_download.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/fs_download.c')
-rw-r--r--src/fs/fs_download.c169
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 {