author | zautrix <zautrix> | 2005-01-24 21:00:03 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2005-01-24 21:00:03 (UTC) |
commit | 60733d98dff3ff5f8e95c514af258498aa7aa014 (patch) (unidiff) | |
tree | 751d6533a51790da2afa49c870ff2342d6e3b0bf /kmicromail | |
parent | bb33b559609356149ae51cb50c081b3e82aecafb (diff) | |
download | kdepimpi-60733d98dff3ff5f8e95c514af258498aa7aa014.zip kdepimpi-60733d98dff3ff5f8e95c514af258498aa7aa014.tar.gz kdepimpi-60733d98dff3ff5f8e95c514af258498aa7aa014.tar.bz2 |
memory leak fix
-rw-r--r-- | kmicromail/libetpan/mh/mailmh.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/kmicromail/libetpan/mh/mailmh.c b/kmicromail/libetpan/mh/mailmh.c index 1087ce1..2d1f26d 100644 --- a/kmicromail/libetpan/mh/mailmh.c +++ b/kmicromail/libetpan/mh/mailmh.c | |||
@@ -540,451 +540,454 @@ int mailmh_folder_remove_subfolder(struct mailmh_folder * folder) | |||
540 | chashdatum data; | 540 | chashdatum data; |
541 | int r; | 541 | int r; |
542 | 542 | ||
543 | parent = folder->fl_parent; | 543 | parent = folder->fl_parent; |
544 | 544 | ||
545 | key.data = folder->fl_filename; | 545 | key.data = folder->fl_filename; |
546 | key.len = strlen(folder->fl_filename); | 546 | key.len = strlen(folder->fl_filename); |
547 | 547 | ||
548 | r = chash_get(parent->fl_subfolders_hash, &key, &data); | 548 | r = chash_get(parent->fl_subfolders_hash, &key, &data); |
549 | if (r < 0) | 549 | if (r < 0) |
550 | return MAILMH_ERROR_FOLDER; | 550 | return MAILMH_ERROR_FOLDER; |
551 | 551 | ||
552 | chash_delete(parent->fl_subfolders_hash, &key, NULL); | 552 | chash_delete(parent->fl_subfolders_hash, &key, NULL); |
553 | carray_delete_fast(parent->fl_subfolders_tab, folder->fl_array_index); | 553 | carray_delete_fast(parent->fl_subfolders_tab, folder->fl_array_index); |
554 | 554 | ||
555 | mailmh_folder_free(folder); | 555 | mailmh_folder_free(folder); |
556 | 556 | ||
557 | return MAILMH_NO_ERROR; | 557 | return MAILMH_NO_ERROR; |
558 | 558 | ||
559 | } | 559 | } |
560 | 560 | ||
561 | int mailmh_folder_rename_subfolder(struct mailmh_folder * src_folder, | 561 | int mailmh_folder_rename_subfolder(struct mailmh_folder * src_folder, |
562 | struct mailmh_folder * dst_folder, | 562 | struct mailmh_folder * dst_folder, |
563 | const char * new_name) | 563 | const char * new_name) |
564 | { | 564 | { |
565 | int r; | 565 | int r; |
566 | struct mailmh_folder * folder; | 566 | struct mailmh_folder * folder; |
567 | struct mailmh_folder * parent; | 567 | struct mailmh_folder * parent; |
568 | char * new_foldername; | 568 | char * new_foldername; |
569 | 569 | ||
570 | parent = src_folder->fl_parent; | 570 | parent = src_folder->fl_parent; |
571 | if (parent == NULL) | 571 | if (parent == NULL) |
572 | return MAILMH_ERROR_RENAME; | 572 | return MAILMH_ERROR_RENAME; |
573 | 573 | ||
574 | new_foldername = malloc(strlen(dst_folder->fl_filename) + 2 + strlen(new_name)); | 574 | new_foldername = malloc(strlen(dst_folder->fl_filename) + 2 + strlen(new_name)); |
575 | if (new_foldername == NULL) | 575 | if (new_foldername == NULL) |
576 | return MAILMH_ERROR_MEMORY; | 576 | return MAILMH_ERROR_MEMORY; |
577 | 577 | ||
578 | strcpy(new_foldername, dst_folder->fl_filename); | 578 | strcpy(new_foldername, dst_folder->fl_filename); |
579 | strcat(new_foldername, MAIL_DIR_SEPARATOR_S); | 579 | strcat(new_foldername, MAIL_DIR_SEPARATOR_S); |
580 | strcat(new_foldername, new_name); | 580 | strcat(new_foldername, new_name); |
581 | 581 | ||
582 | r = rename(src_folder->fl_filename, new_foldername); | 582 | r = rename(src_folder->fl_filename, new_foldername); |
583 | free(new_foldername); | 583 | free(new_foldername); |
584 | if (r < 0) | 584 | if (r < 0) |
585 | return MAILMH_ERROR_RENAME; | 585 | return MAILMH_ERROR_RENAME; |
586 | 586 | ||
587 | r = mailmh_folder_remove_subfolder(src_folder); | 587 | r = mailmh_folder_remove_subfolder(src_folder); |
588 | if (r != MAILMH_NO_ERROR) | 588 | if (r != MAILMH_NO_ERROR) |
589 | return r; | 589 | return r; |
590 | 590 | ||
591 | folder = mailmh_folder_new(dst_folder, new_name); | 591 | folder = mailmh_folder_new(dst_folder, new_name); |
592 | if (folder == NULL) | 592 | if (folder == NULL) |
593 | return MAILMH_ERROR_MEMORY; | 593 | return MAILMH_ERROR_MEMORY; |
594 | 594 | ||
595 | r = carray_add(parent->fl_subfolders_tab, folder, NULL); | 595 | r = carray_add(parent->fl_subfolders_tab, folder, NULL); |
596 | if (r < 0) { | 596 | if (r < 0) { |
597 | mailmh_folder_free(folder); | 597 | mailmh_folder_free(folder); |
598 | return MAILMH_ERROR_MEMORY; | 598 | return MAILMH_ERROR_MEMORY; |
599 | } | 599 | } |
600 | 600 | ||
601 | return MAILMH_NO_ERROR; | 601 | return MAILMH_NO_ERROR; |
602 | } | 602 | } |
603 | 603 | ||
604 | #define MAX_TRY_ALLOC 32 | 604 | #define MAX_TRY_ALLOC 32 |
605 | 605 | ||
606 | /* initial file MUST be in the same directory */ | 606 | /* initial file MUST be in the same directory */ |
607 | 607 | ||
608 | static int mailmh_folder_alloc_msg(struct mailmh_folder * folder, | 608 | static int mailmh_folder_alloc_msg(struct mailmh_folder * folder, |
609 | char * filename, uint32_t * result) | 609 | char * filename, uint32_t * result) |
610 | { | 610 | { |
611 | uint32_t max; | 611 | uint32_t max; |
612 | uint32_t k; | 612 | uint32_t k; |
613 | char * new_filename; | 613 | char * new_filename; |
614 | size_t len; | 614 | size_t len; |
615 | struct stat f_stat; | 615 | struct stat f_stat; |
616 | 616 | ||
617 | len = strlen(folder->fl_filename) + 20; | 617 | len = strlen(folder->fl_filename) + 20; |
618 | new_filename = malloc(len); | 618 | new_filename = malloc(len); |
619 | if (new_filename == NULL) | 619 | if (new_filename == NULL) |
620 | return MAILMH_ERROR_MEMORY; | 620 | return MAILMH_ERROR_MEMORY; |
621 | 621 | ||
622 | max = folder->fl_max_index + 1; | 622 | max = folder->fl_max_index + 1; |
623 | 623 | ||
624 | //fprintf(stderr,"mailmh_folder_alloc_msg filename: %s \n", filename); | 624 | //fprintf(stderr,"mailmh_folder_alloc_msg filename: %s \n", filename); |
625 | k = 0; | 625 | k = 0; |
626 | while (k < MAX_TRY_ALLOC) { | 626 | while (k < MAX_TRY_ALLOC) { |
627 | snprintf(new_filename, len, "%s%c%lu", folder->fl_filename, | 627 | snprintf(new_filename, len, "%s%c%lu", folder->fl_filename, |
628 | MAIL_DIR_SEPARATOR, (unsigned long) (max + k)); | 628 | MAIL_DIR_SEPARATOR, (unsigned long) (max + k)); |
629 | //fprintf(stderr,"mailmh_folder_alloc_msg new_filename: %s \n", new_filename); | 629 | //fprintf(stderr,"mailmh_folder_alloc_msg new_filename: %s \n", new_filename); |
630 | if ( stat( new_filename, &f_stat ) == -1 ) { | 630 | if ( stat( new_filename, &f_stat ) == -1 ) { |
631 | // if (link(filename, new_filename) == 0) { | 631 | // if (link(filename, new_filename) == 0) { |
632 | int r; | 632 | int r; |
633 | //fprintf(stderr,"filename found \n"); | 633 | //fprintf(stderr,"filename found \n"); |
634 | //unlink(filename); | 634 | //unlink(filename); |
635 | rename (filename,new_filename ); | 635 | rename (filename,new_filename ); |
636 | free(new_filename); | 636 | free(new_filename); |
637 | 637 | ||
638 | if (k > MAX_TRY_ALLOC / 2) { | 638 | if (k > MAX_TRY_ALLOC / 2) { |
639 | r = mailmh_folder_update(folder); | 639 | r = mailmh_folder_update(folder); |
640 | /* ignore errors */ | 640 | /* ignore errors */ |
641 | } | 641 | } |
642 | 642 | ||
643 | * result = max + k; | 643 | * result = max + k; |
644 | 644 | ||
645 | folder->fl_max_index = max + k; | 645 | folder->fl_max_index = max + k; |
646 | 646 | ||
647 | return MAILMH_NO_ERROR; | 647 | return MAILMH_NO_ERROR; |
648 | } | 648 | } |
649 | else if (errno == EXDEV) { | 649 | else if (errno == EXDEV) { |
650 | free(filename); | 650 | free(filename); |
651 | return MAILMH_ERROR_FOLDER; | 651 | return MAILMH_ERROR_FOLDER; |
652 | } | 652 | } |
653 | k ++; | 653 | k ++; |
654 | } | 654 | } |
655 | 655 | ||
656 | free(new_filename); | 656 | free(new_filename); |
657 | 657 | ||
658 | return MAILMH_ERROR_FOLDER; | 658 | return MAILMH_ERROR_FOLDER; |
659 | } | 659 | } |
660 | 660 | ||
661 | int mailmh_folder_get_message_filename(struct mailmh_folder * folder, | 661 | int mailmh_folder_get_message_filename(struct mailmh_folder * folder, |
662 | uint32_t index, char ** result) | 662 | uint32_t index, char ** result) |
663 | { | 663 | { |
664 | char * filename; | 664 | char * filename; |
665 | int len; | 665 | int len; |
666 | 666 | ||
667 | #if 0 | 667 | #if 0 |
668 | r = mailmh_folder_update(folder); | 668 | r = mailmh_folder_update(folder); |
669 | if (r != MAILMH_NO_ERROR) | 669 | if (r != MAILMH_NO_ERROR) |
670 | return r; | 670 | return r; |
671 | #endif | 671 | #endif |
672 | 672 | ||
673 | len = strlen(folder->fl_filename) + 20; | 673 | len = strlen(folder->fl_filename) + 20; |
674 | filename = malloc(len); | 674 | filename = malloc(len); |
675 | if (filename == NULL) | 675 | if (filename == NULL) |
676 | return MAILMH_ERROR_MEMORY; | 676 | return MAILMH_ERROR_MEMORY; |
677 | 677 | ||
678 | snprintf(filename, len, "%s%c%lu", folder->fl_filename, MAIL_DIR_SEPARATOR, | 678 | snprintf(filename, len, "%s%c%lu", folder->fl_filename, MAIL_DIR_SEPARATOR, |
679 | (unsigned long) index); | 679 | (unsigned long) index); |
680 | 680 | ||
681 | * result = filename; | 681 | * result = filename; |
682 | 682 | ||
683 | return MAILMH_NO_ERROR;; | 683 | return MAILMH_NO_ERROR;; |
684 | } | 684 | } |
685 | 685 | ||
686 | 686 | ||
687 | int mailmh_folder_get_message_fd(struct mailmh_folder * folder, | 687 | int mailmh_folder_get_message_fd(struct mailmh_folder * folder, |
688 | uint32_t index, int flags, int * result) | 688 | uint32_t index, int flags, int * result) |
689 | { | 689 | { |
690 | char * filename; | 690 | char * filename; |
691 | int fd; | 691 | int fd; |
692 | int r; | 692 | int r; |
693 | 693 | ||
694 | #if 0 | 694 | #if 0 |
695 | r = mailmh_folder_update(folder); | 695 | r = mailmh_folder_update(folder); |
696 | if (r != MAILMH_NO_ERROR) | 696 | if (r != MAILMH_NO_ERROR) |
697 | return r; | 697 | return r; |
698 | #endif | 698 | #endif |
699 | 699 | ||
700 | r = mailmh_folder_get_message_filename(folder, index, &filename); | 700 | r = mailmh_folder_get_message_filename(folder, index, &filename); |
701 | if (r != MAILMH_NO_ERROR) | 701 | if (r != MAILMH_NO_ERROR) |
702 | return r; | 702 | return r; |
703 | 703 | ||
704 | fd = open(filename, flags); | 704 | fd = open(filename, flags); |
705 | free(filename); | 705 | free(filename); |
706 | if (fd == -1) | 706 | if (fd == -1) |
707 | return MAILMH_ERROR_MSG_NOT_FOUND; | 707 | return MAILMH_ERROR_MSG_NOT_FOUND; |
708 | 708 | ||
709 | * result = fd; | 709 | * result = fd; |
710 | 710 | ||
711 | return MAILMH_NO_ERROR; | 711 | return MAILMH_NO_ERROR; |
712 | } | 712 | } |
713 | 713 | ||
714 | int mailmh_folder_get_message_size(struct mailmh_folder * folder, | 714 | int mailmh_folder_get_message_size(struct mailmh_folder * folder, |
715 | uint32_t index, size_t * result) | 715 | uint32_t index, size_t * result) |
716 | { | 716 | { |
717 | int r; | 717 | int r; |
718 | char * filename; | 718 | char * filename; |
719 | struct stat buf; | 719 | struct stat buf; |
720 | 720 | ||
721 | r = mailmh_folder_get_message_filename(folder, index, &filename); | 721 | r = mailmh_folder_get_message_filename(folder, index, &filename); |
722 | if (r != MAILMH_NO_ERROR) | 722 | if (r != MAILMH_NO_ERROR) |
723 | return r; | 723 | return r; |
724 | 724 | ||
725 | r = stat(filename, &buf); | 725 | r = stat(filename, &buf); |
726 | free(filename); | 726 | free(filename); |
727 | if (r < 0) | 727 | if (r < 0) |
728 | return MAILMH_ERROR_FILE; | 728 | return MAILMH_ERROR_FILE; |
729 | 729 | ||
730 | * result = buf.st_size; | 730 | * result = buf.st_size; |
731 | 731 | ||
732 | return MAILMH_NO_ERROR; | 732 | return MAILMH_NO_ERROR; |
733 | } | 733 | } |
734 | 734 | ||
735 | int mailmh_folder_add_message_uid(struct mailmh_folder * folder, | 735 | int mailmh_folder_add_message_uid(struct mailmh_folder * folder, |
736 | const char * message, size_t size, | 736 | const char * message, size_t size, |
737 | uint32_t * pindex) | 737 | uint32_t * pindex) |
738 | { | 738 | { |
739 | char * tmpname; | 739 | char * tmpname; |
740 | int fd; | 740 | int fd; |
741 | size_t namesize; | 741 | size_t namesize; |
742 | size_t left; | 742 | size_t left; |
743 | ssize_t res; | 743 | ssize_t res; |
744 | struct mailmh_msg_info * msg_info; | 744 | struct mailmh_msg_info * msg_info; |
745 | uint32_t index; | 745 | uint32_t index; |
746 | int error; | 746 | int error; |
747 | int r; | 747 | int r; |
748 | unsigned int array_index; | 748 | unsigned int array_index; |
749 | struct stat buf; | 749 | struct stat buf; |
750 | chashdatum key; | 750 | chashdatum key; |
751 | chashdatum data; | 751 | chashdatum data; |
752 | 752 | ||
753 | #if 0 | 753 | #if 0 |
754 | r = mailmh_folder_update(folder); | 754 | r = mailmh_folder_update(folder); |
755 | if (r != MAILMH_NO_ERROR) { | 755 | if (r != MAILMH_NO_ERROR) { |
756 | error = r; | 756 | error = r; |
757 | goto err; | 757 | goto err; |
758 | } | 758 | } |
759 | #endif | 759 | #endif |
760 | 760 | ||
761 | namesize = strlen(folder->fl_filename) + 20; | 761 | namesize = strlen(folder->fl_filename) + 20; |
762 | tmpname = malloc(namesize); | 762 | tmpname = malloc(namesize); |
763 | snprintf(tmpname, namesize, "%s%ctmpXXXXXX", | 763 | snprintf(tmpname, namesize, "%s%ctmpXXXXXX", |
764 | folder->fl_filename, MAIL_DIR_SEPARATOR); | 764 | folder->fl_filename, MAIL_DIR_SEPARATOR); |
765 | fd = mkstemp(tmpname); | 765 | fd = mkstemp(tmpname); |
766 | if (fd < 0) { | 766 | if (fd < 0) { |
767 | error = MAILMH_ERROR_FILE; | 767 | error = MAILMH_ERROR_FILE; |
768 | goto free; | 768 | goto free; |
769 | } | 769 | } |
770 | 770 | ||
771 | left = size; | 771 | left = size; |
772 | while (left > 0) { | 772 | while (left > 0) { |
773 | res = write(fd, message, left); | 773 | res = write(fd, message, left); |
774 | if (res == -1) { | 774 | if (res == -1) { |
775 | close(fd); | 775 | close(fd); |
776 | error = MAILMH_ERROR_FILE; | 776 | error = MAILMH_ERROR_FILE; |
777 | goto free; | 777 | goto free; |
778 | } | 778 | } |
779 | 779 | ||
780 | left -= res; | 780 | left -= res; |
781 | } | 781 | } |
782 | close(fd); | 782 | close(fd); |
783 | 783 | ||
784 | r = stat(tmpname, &buf); | 784 | r = stat(tmpname, &buf); |
785 | if (r < 0) { | 785 | if (r < 0) { |
786 | error = MAILMH_ERROR_FILE; | 786 | error = MAILMH_ERROR_FILE; |
787 | goto free; | 787 | goto free; |
788 | } | 788 | } |
789 | 789 | ||
790 | r = mailmh_folder_alloc_msg(folder, tmpname, &index); | 790 | r = mailmh_folder_alloc_msg(folder, tmpname, &index); |
791 | if (r != MAILMH_NO_ERROR) { | 791 | if (r != MAILMH_NO_ERROR) { |
792 | unlink(tmpname); | 792 | unlink(tmpname); |
793 | error = MAILMH_ERROR_COULD_NOT_ALLOC_MSG; | 793 | error = MAILMH_ERROR_COULD_NOT_ALLOC_MSG; |
794 | goto free; | 794 | goto free; |
795 | } | 795 | } |
796 | free(tmpname); | 796 | free(tmpname); |
797 | 797 | ||
798 | msg_info = mailmh_msg_info_new(index, size, buf.st_mtime); | 798 | msg_info = mailmh_msg_info_new(index, size, buf.st_mtime); |
799 | if (msg_info == NULL) { | 799 | if (msg_info == NULL) { |
800 | mailmh_folder_remove_message(folder, index); | 800 | mailmh_folder_remove_message(folder, index); |
801 | error = MAILMH_ERROR_MEMORY; | 801 | error = MAILMH_ERROR_MEMORY; |
802 | goto err; | 802 | goto err; |
803 | } | 803 | } |
804 | 804 | ||
805 | r = carray_add(folder->fl_msgs_tab, msg_info, &array_index); | 805 | r = carray_add(folder->fl_msgs_tab, msg_info, &array_index); |
806 | if (r < 0) { | 806 | if (r < 0) { |
807 | mailmh_folder_remove_message(folder, index); | 807 | mailmh_folder_remove_message(folder, index); |
808 | mailmh_msg_info_free(msg_info); | 808 | mailmh_msg_info_free(msg_info); |
809 | error = MAILMH_ERROR_MEMORY; | 809 | error = MAILMH_ERROR_MEMORY; |
810 | goto err; | 810 | goto err; |
811 | } | 811 | } |
812 | msg_info->msg_array_index = array_index; | 812 | msg_info->msg_array_index = array_index; |
813 | 813 | ||
814 | #if 0 | 814 | #if 0 |
815 | r = cinthash_add(folder->fl_msgs_hash, index, msg_info); | 815 | r = cinthash_add(folder->fl_msgs_hash, index, msg_info); |
816 | #endif | 816 | #endif |
817 | key.data = &index; | 817 | key.data = &index; |
818 | key.len = sizeof(index); | 818 | key.len = sizeof(index); |
819 | data.data = msg_info; | 819 | data.data = msg_info; |
820 | data.len = 0; | 820 | data.len = 0; |
821 | 821 | ||
822 | if (pindex != NULL) | 822 | if (pindex != NULL) |
823 | * pindex = index; | 823 | * pindex = index; |
824 | 824 | ||
825 | r = chash_set(folder->fl_msgs_hash, &key, &data, NULL); | 825 | r = chash_set(folder->fl_msgs_hash, &key, &data, NULL); |
826 | if (r < 0) { | 826 | if (r < 0) { |
827 | carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index); | 827 | carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index); |
828 | mailmh_msg_info_free(msg_info); | 828 | mailmh_msg_info_free(msg_info); |
829 | error = MAILMH_ERROR_MEMORY; | 829 | error = MAILMH_ERROR_MEMORY; |
830 | goto err; | 830 | goto err; |
831 | } | 831 | } |
832 | 832 | ||
833 | return MAILMH_NO_ERROR; | 833 | return MAILMH_NO_ERROR; |
834 | 834 | ||
835 | free: | 835 | free: |
836 | free(tmpname); | 836 | free(tmpname); |
837 | err: | 837 | err: |
838 | return error; | 838 | return error; |
839 | } | 839 | } |
840 | 840 | ||
841 | int mailmh_folder_add_message(struct mailmh_folder * folder, | 841 | int mailmh_folder_add_message(struct mailmh_folder * folder, |
842 | const char * message, size_t size) | 842 | const char * message, size_t size) |
843 | { | 843 | { |
844 | return mailmh_folder_add_message_uid(folder, message, size, NULL); | 844 | return mailmh_folder_add_message_uid(folder, message, size, NULL); |
845 | } | 845 | } |
846 | 846 | ||
847 | int mailmh_folder_add_message_file_uid(struct mailmh_folder * folder, | 847 | int mailmh_folder_add_message_file_uid(struct mailmh_folder * folder, |
848 | int fd, uint32_t * pindex) | 848 | int fd, uint32_t * pindex) |
849 | { | 849 | { |
850 | char * message; | 850 | char * message; |
851 | struct stat buf; | 851 | struct stat buf; |
852 | int r; | 852 | int r; |
853 | 853 | ||
854 | #if 0 | 854 | #if 0 |
855 | r = mailmh_folder_update(folder); | 855 | r = mailmh_folder_update(folder); |
856 | if (r != MAILMH_NO_ERROR) | 856 | if (r != MAILMH_NO_ERROR) |
857 | return r; | 857 | return r; |
858 | #endif | 858 | #endif |
859 | 859 | ||
860 | if (fstat(fd, &buf) == -1) | 860 | if (fstat(fd, &buf) == -1) |
861 | return MAILMH_ERROR_FILE; | 861 | return MAILMH_ERROR_FILE; |
862 | 862 | ||
863 | message = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); | 863 | message = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); |
864 | if (message == MAP_FAILED) | 864 | if (message == MAP_FAILED) |
865 | return MAILMH_ERROR_FILE; | 865 | return MAILMH_ERROR_FILE; |
866 | 866 | ||
867 | r = mailmh_folder_add_message_uid(folder, message, buf.st_size, pindex); | 867 | r = mailmh_folder_add_message_uid(folder, message, buf.st_size, pindex); |
868 | 868 | ||
869 | munmap(message, buf.st_size); | 869 | munmap(message, buf.st_size); |
870 | 870 | ||
871 | return r; | 871 | return r; |
872 | } | 872 | } |
873 | 873 | ||
874 | int mailmh_folder_add_message_file(struct mailmh_folder * folder, | 874 | int mailmh_folder_add_message_file(struct mailmh_folder * folder, |
875 | int fd) | 875 | int fd) |
876 | { | 876 | { |
877 | return mailmh_folder_add_message_file_uid(folder, fd, NULL); | 877 | return mailmh_folder_add_message_file_uid(folder, fd, NULL); |
878 | } | 878 | } |
879 | 879 | ||
880 | int mailmh_folder_remove_message(struct mailmh_folder * folder, | 880 | int mailmh_folder_remove_message(struct mailmh_folder * folder, |
881 | uint32_t index) | 881 | uint32_t index) |
882 | { | 882 | { |
883 | char * filename; | 883 | char * filename; |
884 | struct mailmh_msg_info * msg_info; | 884 | struct mailmh_msg_info * msg_info; |
885 | int res; | 885 | int res; |
886 | int r; | 886 | int r; |
887 | chashdatum key; | 887 | chashdatum key; |
888 | chashdatum data; | 888 | chashdatum data; |
889 | 889 | ||
890 | #if 0 | 890 | #if 0 |
891 | r = mailmh_folder_update(folder); | 891 | r = mailmh_folder_update(folder); |
892 | if (r != MAILMH_NO_ERROR) { | 892 | if (r != MAILMH_NO_ERROR) { |
893 | res = r; | 893 | res = r; |
894 | goto err; | 894 | goto err; |
895 | } | 895 | } |
896 | #endif | 896 | #endif |
897 | 897 | ||
898 | r = mailmh_folder_get_message_filename(folder, index, &filename); | 898 | r = mailmh_folder_get_message_filename(folder, index, &filename); |
899 | if (filename == NULL) { | 899 | if (filename == NULL) { |
900 | res = r; | 900 | res = r; |
901 | goto err; | 901 | goto err; |
902 | } | 902 | } |
903 | 903 | ||
904 | if (unlink(filename) == -1) { | 904 | if (unlink(filename) == -1) { |
905 | res = MAILMH_ERROR_FILE; | 905 | res = MAILMH_ERROR_FILE; |
906 | goto free; | 906 | goto free; |
907 | } | 907 | } |
908 | 908 | ||
909 | key.data = &index; | 909 | key.data = &index; |
910 | key.len = sizeof(index); | 910 | key.len = sizeof(index); |
911 | r = chash_get(folder->fl_msgs_hash, &key, &data); | 911 | r = chash_get(folder->fl_msgs_hash, &key, &data); |
912 | #if 0 | 912 | #if 0 |
913 | msg_info = cinthash_find(folder->fl_msgs_hash, index); | 913 | msg_info = cinthash_find(folder->fl_msgs_hash, index); |
914 | #endif | 914 | #endif |
915 | if (r == 0) { | 915 | if (r == 0) { |
916 | msg_info = data.data; | 916 | msg_info = data.data; |
917 | 917 | ||
918 | carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index); | 918 | carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index); |
919 | #if 0 | 919 | #if 0 |
920 | cinthash_remove(folder->fl_msgs_hash, index); | 920 | cinthash_remove(folder->fl_msgs_hash, index); |
921 | #endif | 921 | #endif |
922 | chash_delete(folder->fl_msgs_hash, &key, NULL); | 922 | chash_delete(folder->fl_msgs_hash, &key, NULL); |
923 | } | 923 | } |
924 | // LR | ||
925 | mailmh_msg_info_free( msg_info ); | ||
926 | free(filename); | ||
924 | 927 | ||
925 | return MAILMH_NO_ERROR; | 928 | return MAILMH_NO_ERROR; |
926 | 929 | ||
927 | free: | 930 | free: |
928 | free(filename); | 931 | free(filename); |
929 | err: | 932 | err: |
930 | return res; | 933 | return res; |
931 | } | 934 | } |
932 | 935 | ||
933 | 936 | ||
934 | int mailmh_folder_move_message(struct mailmh_folder * dest_folder, | 937 | int mailmh_folder_move_message(struct mailmh_folder * dest_folder, |
935 | struct mailmh_folder * src_folder, | 938 | struct mailmh_folder * src_folder, |
936 | uint32_t index) | 939 | uint32_t index) |
937 | { | 940 | { |
938 | int fd; | 941 | int fd; |
939 | char * filename; | 942 | char * filename; |
940 | int r; | 943 | int r; |
941 | 944 | ||
942 | #if 0 | 945 | #if 0 |
943 | r = mailmh_folder_update(dest_folder); | 946 | r = mailmh_folder_update(dest_folder); |
944 | if (r != MAILMH_NO_ERROR) | 947 | if (r != MAILMH_NO_ERROR) |
945 | return r; | 948 | return r; |
946 | r = mailmh_folder_update(src_folder); | 949 | r = mailmh_folder_update(src_folder); |
947 | if (r != MAILMH_NO_ERROR) | 950 | if (r != MAILMH_NO_ERROR) |
948 | return r; | 951 | return r; |
949 | #endif | 952 | #endif |
950 | 953 | ||
951 | /* move on the same filesystem */ | 954 | /* move on the same filesystem */ |
952 | r = mailmh_folder_get_message_filename(src_folder, index, &filename); | 955 | r = mailmh_folder_get_message_filename(src_folder, index, &filename); |
953 | if (r != MAILMH_NO_ERROR) | 956 | if (r != MAILMH_NO_ERROR) |
954 | return r; | 957 | return r; |
955 | 958 | ||
956 | r = mailmh_folder_alloc_msg(dest_folder, filename, &index); | 959 | r = mailmh_folder_alloc_msg(dest_folder, filename, &index); |
957 | free(filename); | 960 | free(filename); |
958 | if (r == MAILMH_NO_ERROR) | 961 | if (r == MAILMH_NO_ERROR) |
959 | return MAILMH_NO_ERROR; | 962 | return MAILMH_NO_ERROR; |
960 | 963 | ||
961 | /* move on the different filesystems */ | 964 | /* move on the different filesystems */ |
962 | r = mailmh_folder_get_message_fd(src_folder, index, O_RDONLY, &fd); | 965 | r = mailmh_folder_get_message_fd(src_folder, index, O_RDONLY, &fd); |
963 | if (r != MAILMH_NO_ERROR) | 966 | if (r != MAILMH_NO_ERROR) |
964 | return r; | 967 | return r; |
965 | 968 | ||
966 | r = mailmh_folder_add_message_file(dest_folder, fd); | 969 | r = mailmh_folder_add_message_file(dest_folder, fd); |
967 | if (r != MAILMH_NO_ERROR) { | 970 | if (r != MAILMH_NO_ERROR) { |
968 | close(fd); | 971 | close(fd); |
969 | return r; | 972 | return r; |
970 | } | 973 | } |
971 | 974 | ||
972 | close(fd); | 975 | close(fd); |
973 | 976 | ||
974 | r = mailmh_folder_remove_message(src_folder, index); | 977 | r = mailmh_folder_remove_message(src_folder, index); |
975 | 978 | ||
976 | return MAILMH_NO_ERROR; | 979 | return MAILMH_NO_ERROR; |
977 | } | 980 | } |
978 | 981 | ||
979 | unsigned int mailmh_folder_get_message_number(struct mailmh_folder * folder) | 982 | unsigned int mailmh_folder_get_message_number(struct mailmh_folder * folder) |
980 | { | 983 | { |
981 | unsigned int i; | 984 | unsigned int i; |
982 | unsigned int count; | 985 | unsigned int count; |
983 | 986 | ||
984 | count = 0; | 987 | count = 0; |
985 | for(i = 0 ; i < carray_count(folder->fl_msgs_tab) ; i ++) | 988 | for(i = 0 ; i < carray_count(folder->fl_msgs_tab) ; i ++) |
986 | if (carray_get(folder->fl_msgs_tab, i) != NULL) | 989 | if (carray_get(folder->fl_msgs_tab, i) != NULL) |
987 | count ++; | 990 | count ++; |
988 | 991 | ||
989 | return count; | 992 | return count; |
990 | } | 993 | } |