aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-04-02 20:21:58 +0000
committerChristian Grothoff <christian@grothoff.org>2010-04-02 20:21:58 +0000
commit5cb7ca34a4c2c9b473f0b38363172c3694330f52 (patch)
tree1c7e0227810a4730e6e5d171a2818110d8864f6f
parent305c5eb36f73d1665df416fb21467c828139e135 (diff)
downloadgnunet-5cb7ca34a4c2c9b473f0b38363172c3694330f52.tar.gz
gnunet-5cb7ca34a4c2c9b473f0b38363172c3694330f52.zip
misc fixes
-rw-r--r--src/fs/fs.h2
-rw-r--r--src/fs/fs_download.c169
-rw-r--r--src/fs/fs_file_information.c30
-rw-r--r--src/fs/gnunet-publish.c86
4 files changed, 114 insertions, 173 deletions
diff --git a/src/fs/fs.h b/src/fs/fs.h
index 77a73c3d6..0b3b25955 100644
--- a/src/fs/fs.h
+++ b/src/fs/fs.h
@@ -401,7 +401,7 @@ struct GNUNET_FS_FileInformation
401 struct { 401 struct {
402 402
403 /** 403 /**
404 * Name of the directory. FIXME: currently never set! 404 * Name of the directory.
405 */ 405 */
406 char *dirname; 406 char *dirname;
407 407
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 {
diff --git a/src/fs/fs_file_information.c b/src/fs/fs_file_information.c
index 88d0ca386..e0504be71 100644
--- a/src/fs/fs_file_information.c
+++ b/src/fs/fs_file_information.c
@@ -204,6 +204,8 @@ GNUNET_FS_file_information_create_from_file (void *client_info,
204 struct FileInfo *fi; 204 struct FileInfo *fi;
205 struct stat sbuf; 205 struct stat sbuf;
206 struct GNUNET_FS_FileInformation *ret; 206 struct GNUNET_FS_FileInformation *ret;
207 const char *fn;
208 const char *ss;
207 209
208 if (0 != STAT (filename, &sbuf)) 210 if (0 != STAT (filename, &sbuf))
209 { 211 {
@@ -230,6 +232,17 @@ GNUNET_FS_file_information_create_from_file (void *client_info,
230 priority, 232 priority,
231 expirationTime); 233 expirationTime);
232 ret->data.file.filename = GNUNET_strdup (filename); 234 ret->data.file.filename = GNUNET_strdup (filename);
235 fn = filename;
236 while (NULL != (ss = strstr (fn,
237 DIR_SEPARATOR_STR)))
238 fn = ss + 1;
239 GNUNET_CONTAINER_meta_data_insert (ret->meta,
240 "<gnunet>",
241 EXTRACTOR_METATYPE_FILENAME,
242 EXTRACTOR_METAFORMAT_C_STRING,
243 "text/plain",
244 fn,
245 strlen (fn) + 1);
233 return ret; 246 return ret;
234} 247}
235 248
@@ -622,13 +635,12 @@ GNUNET_FS_file_information_create_from_directory (void *client_info,
622 struct EntryProcCls dc; 635 struct EntryProcCls dc;
623 struct GNUNET_FS_Uri *ksk; 636 struct GNUNET_FS_Uri *ksk;
624 struct GNUNET_CONTAINER_MetaData *meta; 637 struct GNUNET_CONTAINER_MetaData *meta;
625 638 const char *fn;
626 639 const char *ss;
627 640
628 dc.entries = NULL; 641 dc.entries = NULL;
629 meta = GNUNET_CONTAINER_meta_data_create (); 642 meta = GNUNET_CONTAINER_meta_data_create ();
630 GNUNET_FS_meta_data_make_directory (meta); 643 GNUNET_FS_meta_data_make_directory (meta);
631
632 scanner (scanner_cls, 644 scanner (scanner_cls,
633 filename, 645 filename,
634 do_index, 646 do_index,
@@ -654,6 +666,18 @@ GNUNET_FS_file_information_create_from_directory (void *client_info,
654 GNUNET_FS_file_information_sync (dc.entries); 666 GNUNET_FS_file_information_sync (dc.entries);
655 dc.entries = dc.entries->next; 667 dc.entries = dc.entries->next;
656 } 668 }
669 fn = filename;
670 while (NULL != (ss = strstr (fn,
671 DIR_SEPARATOR_STR)))
672 fn = ss + 1;
673 GNUNET_CONTAINER_meta_data_insert (ret->meta,
674 "<gnunet>",
675 EXTRACTOR_METATYPE_FILENAME,
676 EXTRACTOR_METAFORMAT_C_STRING,
677 "text/plain",
678 fn,
679 strlen (fn) + 1);
680 ret->data.dir.dirname = GNUNET_strdup (filename);
657 GNUNET_FS_file_information_sync (ret); 681 GNUNET_FS_file_information_sync (ret);
658 return ret; 682 return ret;
659} 683}
diff --git a/src/fs/gnunet-publish.c b/src/fs/gnunet-publish.c
index b8017886e..bcfc8967b 100644
--- a/src/fs/gnunet-publish.c
+++ b/src/fs/gnunet-publish.c
@@ -601,7 +601,6 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
601 ("add an additional keyword for the top-level file or directory" 601 ("add an additional keyword for the top-level file or directory"
602 " (this option can be specified multiple times)"), 602 " (this option can be specified multiple times)"),
603 1, &GNUNET_FS_getopt_set_keywords, &topKeywords}, 603 1, &GNUNET_FS_getopt_set_keywords, &topKeywords},
604 // *: option not yet used... (can handle in a pass over FI)
605 {'m', "meta", "TYPE:VALUE", 604 {'m', "meta", "TYPE:VALUE",
606 gettext_noop ("set the meta-data for the given TYPE to the given VALUE"), 605 gettext_noop ("set the meta-data for the given TYPE to the given VALUE"),
607 1, &GNUNET_FS_getopt_set_metadata, &meta}, 606 1, &GNUNET_FS_getopt_set_metadata, &meta},
@@ -621,7 +620,6 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
621 gettext_noop 620 gettext_noop
622 ("publish the files under the pseudonym NAME (place file into namespace)"), 621 ("publish the files under the pseudonym NAME (place file into namespace)"),
623 1, &GNUNET_GETOPT_set_string, &pseudonym}, 622 1, &GNUNET_GETOPT_set_string, &pseudonym},
624 // *: option not yet used... (need FS API support!)
625 {'s', "simulate-only", NULL, 623 {'s', "simulate-only", NULL,
626 gettext_noop ("only simulate the process but do not do any " 624 gettext_noop ("only simulate the process but do not do any "
627 "actual publishing (useful to compute URIs)"), 625 "actual publishing (useful to compute URIs)"),
@@ -630,7 +628,6 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
630 gettext_noop ("set the ID of this version of the publication" 628 gettext_noop ("set the ID of this version of the publication"
631 " (for namespace insertions only)"), 629 " (for namespace insertions only)"),
632 1, &GNUNET_GETOPT_set_string, &this_id}, 630 1, &GNUNET_GETOPT_set_string, &this_id},
633 // *: option not yet used... (need FS API support!)
634 {'u', "uri", "URI", 631 {'u', "uri", "URI",
635 gettext_noop ("URI to be published (can be used instead of passing a " 632 gettext_noop ("URI to be published (can be used instead of passing a "
636 "file to add keywords to the file with the respective URI)"), 633 "file to add keywords to the file with the respective URI)"),
@@ -662,86 +659,3 @@ main (int argc, char *const *argv)
662} 659}
663 660
664/* end of gnunet-publish.c */ 661/* end of gnunet-publish.c */
665
666////////////////////////////////////////////////////////////////
667
668#if 0
669/**
670 * Print progess message.
671 */
672static void *
673printstatus (void *ctx, const GNUNET_FSUI_Event * event)
674{
675 unsigned long long delta;
676 char *fstring;
677
678 switch (event->type)
679 {
680 case GNUNET_FSUI_upload_progress:
681 if (*verboselevel)
682 {
683 char *ret;
684 GNUNET_CronTime now;
685
686 now = GNUNET_get_time ();
687 delta = event->data.UploadProgress.eta - now;
688 if (event->data.UploadProgress.eta < now)
689 delta = 0;
690 ret = GNUNET_get_time_interval_as_fancy_string (delta);
691 PRINTF (_("%16llu of %16llu bytes inserted "
692 "(estimating %6s to completion) - %s\n"),
693 event->data.UploadProgress.completed,
694 event->data.UploadProgress.total,
695 ret, event->data.UploadProgress.filename);
696 GNUNET_free (ret);
697 }
698 break;
699 case GNUNET_FSUI_upload_completed:
700 if (*verboselevel)
701 {
702 delta = GNUNET_get_time () - start_time;
703 PRINTF (_("Upload of `%s' complete, "
704 "%llu bytes took %llu seconds (%8.3f KiB/s).\n"),
705 event->data.UploadCompleted.filename,
706 event->data.UploadCompleted.total,
707 delta / GNUNET_CRON_SECONDS,
708 (delta == 0)
709 ? (double) (-1.0)
710 : (double) (event->data.UploadCompleted.total
711 / 1024.0 * GNUNET_CRON_SECONDS / delta));
712 }
713 fstring = GNUNET_ECRS_uri_to_string (event->data.UploadCompleted.uri);
714 printf (_("File `%s' has URI: %s\n"),
715 event->data.UploadCompleted.filename, fstring);
716 GNUNET_free (fstring);
717 if (ul == event->data.UploadCompleted.uc.pos)
718 {
719 postProcess (event->data.UploadCompleted.uri);
720 errorCode = 0;
721 GNUNET_shutdown_initiate ();
722 }
723 break;
724 case GNUNET_FSUI_upload_aborted:
725 printf (_("\nUpload aborted.\n"));
726 errorCode = 2;
727 GNUNET_shutdown_initiate ();
728 break;
729 case GNUNET_FSUI_upload_error:
730 printf (_("\nError uploading file: %s"),
731 event->data.UploadError.message);
732 errorCode = 3;
733 GNUNET_shutdown_initiate ();
734 break;
735 case GNUNET_FSUI_upload_started:
736 case GNUNET_FSUI_upload_stopped:
737 break;
738 default:
739 printf (_("\nUnexpected event: %d\n"), event->type);
740 GNUNET_GE_BREAK (ectx, 0);
741 break;
742 }
743 return NULL;
744}
745#endif
746
747/* end of gnunet-publish.c */