summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/mh/mailmh.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/mh/mailmh.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/mh/mailmh.c28
1 files changed, 22 insertions, 6 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
726int mailmh_folder_add_message(struct mailmh_folder * folder, 726int 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
828int mailmh_folder_add_message_file(struct mailmh_folder * folder, 832int 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
838int 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
865int 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
855int mailmh_folder_remove_message(struct mailmh_folder * folder, 871int 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);