Diffstat (limited to 'kmicromail/libetpan/mh/mailmh.c') (more/less context) (show whitespace changes)
-rw-r--r-- | kmicromail/libetpan/mh/mailmh.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/kmicromail/libetpan/mh/mailmh.c b/kmicromail/libetpan/mh/mailmh.c index d6ff950..119f217 100644 --- a/kmicromail/libetpan/mh/mailmh.c +++ b/kmicromail/libetpan/mh/mailmh.c | |||
@@ -714,26 +714,27 @@ int mailmh_folder_get_message_size(struct mailmh_folder * folder, | |||
714 | return r; | 714 | return r; |
715 | 715 | ||
716 | r = stat(filename, &buf); | 716 | r = stat(filename, &buf); |
717 | free(filename); | 717 | free(filename); |
718 | if (r < 0) | 718 | if (r < 0) |
719 | return MAILMH_ERROR_FILE; | 719 | return MAILMH_ERROR_FILE; |
720 | 720 | ||
721 | * result = buf.st_size; | 721 | * result = buf.st_size; |
722 | 722 | ||
723 | return MAILMH_NO_ERROR; | 723 | return MAILMH_NO_ERROR; |
724 | } | 724 | } |
725 | 725 | ||
726 | int mailmh_folder_add_message(struct mailmh_folder * folder, | 726 | int mailmh_folder_add_message_uid(struct mailmh_folder * folder, |
727 | const char * message, size_t size) | 727 | const char * message, size_t size, |
728 | uint32_t * pindex) | ||
728 | { | 729 | { |
729 | char * tmpname; | 730 | char * tmpname; |
730 | int fd; | 731 | int fd; |
731 | size_t namesize; | 732 | size_t namesize; |
732 | size_t left; | 733 | size_t left; |
733 | ssize_t res; | 734 | ssize_t res; |
734 | struct mailmh_msg_info * msg_info; | 735 | struct mailmh_msg_info * msg_info; |
735 | uint32_t index; | 736 | uint32_t index; |
736 | int error; | 737 | int error; |
737 | int r; | 738 | int r; |
738 | unsigned int array_index; | 739 | unsigned int array_index; |
739 | struct stat buf; | 740 | struct stat buf; |
@@ -800,67 +801,82 @@ int mailmh_folder_add_message(struct mailmh_folder * folder, | |||
800 | goto err; | 801 | goto err; |
801 | } | 802 | } |
802 | msg_info->msg_array_index = array_index; | 803 | msg_info->msg_array_index = array_index; |
803 | 804 | ||
804 | #if 0 | 805 | #if 0 |
805 | r = cinthash_add(folder->fl_msgs_hash, index, msg_info); | 806 | r = cinthash_add(folder->fl_msgs_hash, index, msg_info); |
806 | #endif | 807 | #endif |
807 | key.data = &index; | 808 | key.data = &index; |
808 | key.len = sizeof(index); | 809 | key.len = sizeof(index); |
809 | data.data = msg_info; | 810 | data.data = msg_info; |
810 | data.len = 0; | 811 | data.len = 0; |
811 | 812 | ||
813 | if (pindex != NULL) | ||
814 | * pindex = index; | ||
815 | |||
812 | r = chash_set(folder->fl_msgs_hash, &key, &data, NULL); | 816 | r = chash_set(folder->fl_msgs_hash, &key, &data, NULL); |
813 | if (r < 0) { | 817 | if (r < 0) { |
814 | carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index); | 818 | carray_delete_fast(folder->fl_msgs_tab, msg_info->msg_array_index); |
815 | mailmh_msg_info_free(msg_info); | 819 | mailmh_msg_info_free(msg_info); |
816 | error = MAILMH_ERROR_MEMORY; | 820 | error = MAILMH_ERROR_MEMORY; |
817 | goto err; | 821 | goto err; |
818 | } | 822 | } |
819 | 823 | ||
820 | return MAILMH_NO_ERROR; | 824 | return MAILMH_NO_ERROR; |
821 | 825 | ||
822 | free: | 826 | free: |
823 | free(tmpname); | 827 | free(tmpname); |
824 | err: | 828 | err: |
825 | return error; | 829 | return error; |
826 | } | 830 | } |
827 | 831 | ||
828 | int mailmh_folder_add_message_file(struct mailmh_folder * folder, | 832 | int mailmh_folder_add_message(struct mailmh_folder * folder, |
829 | int fd) | 833 | const char * message, size_t size) |
834 | { | ||
835 | return mailmh_folder_add_message_uid(folder, message, size, NULL); | ||
836 | } | ||
837 | |||
838 | int mailmh_folder_add_message_file_uid(struct mailmh_folder * folder, | ||
839 | int fd, uint32_t * pindex) | ||
830 | { | 840 | { |
831 | char * message; | 841 | char * message; |
832 | struct stat buf; | 842 | struct stat buf; |
833 | int r; | 843 | int r; |
834 | 844 | ||
835 | #if 0 | 845 | #if 0 |
836 | r = mailmh_folder_update(folder); | 846 | r = mailmh_folder_update(folder); |
837 | if (r != MAILMH_NO_ERROR) | 847 | if (r != MAILMH_NO_ERROR) |
838 | return r; | 848 | return r; |
839 | #endif | 849 | #endif |
840 | 850 | ||
841 | if (fstat(fd, &buf) == -1) | 851 | if (fstat(fd, &buf) == -1) |
842 | return MAILMH_ERROR_FILE; | 852 | return MAILMH_ERROR_FILE; |
843 | 853 | ||
844 | message = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); | 854 | message = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); |
845 | if (message == MAP_FAILED) | 855 | if (message == MAP_FAILED) |
846 | return MAILMH_ERROR_FILE; | 856 | return MAILMH_ERROR_FILE; |
847 | 857 | ||
848 | r = mailmh_folder_add_message(folder, message, buf.st_size); | 858 | r = mailmh_folder_add_message_uid(folder, message, buf.st_size, pindex); |
849 | 859 | ||
850 | munmap(message, buf.st_size); | 860 | munmap(message, buf.st_size); |
851 | 861 | ||
852 | return r; | 862 | return r; |
853 | } | 863 | } |
854 | 864 | ||
865 | int mailmh_folder_add_message_file(struct mailmh_folder * folder, | ||
866 | int fd) | ||
867 | { | ||
868 | return mailmh_folder_add_message_file_uid(folder, fd, NULL); | ||
869 | } | ||
870 | |||
855 | int mailmh_folder_remove_message(struct mailmh_folder * folder, | 871 | int mailmh_folder_remove_message(struct mailmh_folder * folder, |
856 | uint32_t index) | 872 | uint32_t index) |
857 | { | 873 | { |
858 | char * filename; | 874 | char * filename; |
859 | struct mailmh_msg_info * msg_info; | 875 | struct mailmh_msg_info * msg_info; |
860 | int res; | 876 | int res; |
861 | int r; | 877 | int r; |
862 | chashdatum key; | 878 | chashdatum key; |
863 | chashdatum data; | 879 | chashdatum data; |
864 | 880 | ||
865 | #if 0 | 881 | #if 0 |
866 | r = mailmh_folder_update(folder); | 882 | r = mailmh_folder_update(folder); |