Diffstat (limited to 'kmicromail/libetpan/mbox/mailmbox.c') (more/less context) (show whitespace changes)
-rw-r--r-- | kmicromail/libetpan/mbox/mailmbox.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/kmicromail/libetpan/mbox/mailmbox.c b/kmicromail/libetpan/mbox/mailmbox.c index 280c313..b3fce02 100644 --- a/kmicromail/libetpan/mbox/mailmbox.c +++ b/kmicromail/libetpan/mbox/mailmbox.c | |||
@@ -188,24 +188,27 @@ void mailmbox_timestamp(struct mailmbox_folder * folder) | |||
188 | folder->mb_mtime = buf.st_mtime; | 188 | folder->mb_mtime = buf.st_mtime; |
189 | } | 189 | } |
190 | 190 | ||
191 | /* | 191 | /* |
192 | open the file | 192 | open the file |
193 | */ | 193 | */ |
194 | 194 | ||
195 | int mailmbox_open(struct mailmbox_folder * folder) | 195 | int mailmbox_open(struct mailmbox_folder * folder) |
196 | { | 196 | { |
197 | int fd; | 197 | int fd; |
198 | int read_only; | 198 | int read_only; |
199 | 199 | ||
200 | fd = -1; | ||
201 | read_only = TRUE; | ||
202 | |||
200 | if (!folder->mb_read_only) { | 203 | if (!folder->mb_read_only) { |
201 | read_only = FALSE; | 204 | read_only = FALSE; |
202 | fd = open(folder->mb_filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); | 205 | fd = open(folder->mb_filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); |
203 | } | 206 | } |
204 | 207 | ||
205 | if (folder->mb_read_only || (fd < 0)) { | 208 | if (folder->mb_read_only || (fd < 0)) { |
206 | read_only = TRUE; | 209 | read_only = TRUE; |
207 | fd = open(folder->mb_filename, O_RDONLY); | 210 | fd = open(folder->mb_filename, O_RDONLY); |
208 | if (fd < 0) | 211 | if (fd < 0) |
209 | return MAILMBOX_ERROR_FILE_NOT_FOUND; | 212 | return MAILMBOX_ERROR_FILE_NOT_FOUND; |
210 | } | 213 | } |
211 | 214 | ||
@@ -608,24 +611,26 @@ mailmbox_append_message_list_no_lock(struct mailmbox_folder * folder, | |||
608 | maxuid = /* */ folder->mb_max_uid; | 611 | maxuid = /* */ folder->mb_max_uid; |
609 | 612 | ||
610 | extra_size = 0; | 613 | extra_size = 0; |
611 | for(i = 0 ; i < carray_count(append_tab) ; i ++) { | 614 | for(i = 0 ; i < carray_count(append_tab) ; i ++) { |
612 | struct mailmbox_append_info * info; | 615 | struct mailmbox_append_info * info; |
613 | 616 | ||
614 | info = carray_get(append_tab, i); | 617 | info = carray_get(append_tab, i); |
615 | extra_size += from_size; | 618 | extra_size += from_size; |
616 | extra_size += get_fixed_message_size(info->ai_message, info->ai_size, | 619 | extra_size += get_fixed_message_size(info->ai_message, info->ai_size, |
617 | folder->mb_max_uid + i + 1, | 620 | folder->mb_max_uid + i + 1, |
618 | folder->mb_no_uid); | 621 | folder->mb_no_uid); |
619 | extra_size += 2; /* CR LF */ | 622 | extra_size += 2; /* CR LF */ |
623 | |||
624 | info->ai_uid = folder->mb_max_uid + i + 1; | ||
620 | } | 625 | } |
621 | 626 | ||
622 | left = folder->mb_mapping_size; | 627 | left = folder->mb_mapping_size; |
623 | crlf_count = 0; | 628 | crlf_count = 0; |
624 | while (left >= 1) { | 629 | while (left >= 1) { |
625 | if (folder->mb_mapping[left - 1] == '\n') { | 630 | if (folder->mb_mapping[left - 1] == '\n') { |
626 | crlf_count ++; | 631 | crlf_count ++; |
627 | left --; | 632 | left --; |
628 | } | 633 | } |
629 | else if (folder->mb_mapping[left - 1] == '\r') { | 634 | else if (folder->mb_mapping[left - 1] == '\r') { |
630 | left --; | 635 | left --; |
631 | } | 636 | } |
@@ -735,26 +740,26 @@ mailmbox_append_message_list(struct mailmbox_folder * folder, | |||
735 | 740 | ||
736 | mailmbox_write_unlock(folder); | 741 | mailmbox_write_unlock(folder); |
737 | 742 | ||
738 | return MAILMBOX_NO_ERROR; | 743 | return MAILMBOX_NO_ERROR; |
739 | 744 | ||
740 | unlock: | 745 | unlock: |
741 | mailmbox_write_unlock(folder); | 746 | mailmbox_write_unlock(folder); |
742 | err: | 747 | err: |
743 | return res; | 748 | return res; |
744 | } | 749 | } |
745 | 750 | ||
746 | int | 751 | int |
747 | mailmbox_append_message(struct mailmbox_folder * folder, | 752 | mailmbox_append_message_uid(struct mailmbox_folder * folder, |
748 | const char * data, size_t len) | 753 | const char * data, size_t len, unsigned int * puid) |
749 | { | 754 | { |
750 | carray * tab; | 755 | carray * tab; |
751 | struct mailmbox_append_info * append_info; | 756 | struct mailmbox_append_info * append_info; |
752 | int res; | 757 | int res; |
753 | int r; | 758 | int r; |
754 | 759 | ||
755 | tab = carray_new(1); | 760 | tab = carray_new(1); |
756 | if (tab == NULL) { | 761 | if (tab == NULL) { |
757 | res = MAILMBOX_ERROR_MEMORY; | 762 | res = MAILMBOX_ERROR_MEMORY; |
758 | goto err; | 763 | goto err; |
759 | } | 764 | } |
760 | 765 | ||
@@ -763,37 +768,47 @@ mailmbox_append_message(struct mailmbox_folder * folder, | |||
763 | res = MAILMBOX_ERROR_MEMORY; | 768 | res = MAILMBOX_ERROR_MEMORY; |
764 | goto free_list; | 769 | goto free_list; |
765 | } | 770 | } |
766 | 771 | ||
767 | r = carray_add(tab, append_info, NULL); | 772 | r = carray_add(tab, append_info, NULL); |
768 | if (r < 0) { | 773 | if (r < 0) { |
769 | res = MAILMBOX_ERROR_MEMORY; | 774 | res = MAILMBOX_ERROR_MEMORY; |
770 | goto free_append_info; | 775 | goto free_append_info; |
771 | } | 776 | } |
772 | 777 | ||
773 | r = mailmbox_append_message_list(folder, tab); | 778 | r = mailmbox_append_message_list(folder, tab); |
774 | 779 | ||
780 | if (puid != NULL) | ||
781 | * puid = append_info->ai_uid; | ||
782 | |||
775 | mailmbox_append_info_free(append_info); | 783 | mailmbox_append_info_free(append_info); |
776 | carray_free(tab); | 784 | carray_free(tab); |
777 | 785 | ||
778 | return r; | 786 | return r; |
779 | 787 | ||
780 | free_append_info: | 788 | free_append_info: |
781 | mailmbox_append_info_free(append_info); | 789 | mailmbox_append_info_free(append_info); |
782 | free_list: | 790 | free_list: |
783 | carray_free(tab); | 791 | carray_free(tab); |
784 | err: | 792 | err: |
785 | return res; | 793 | return res; |
786 | } | 794 | } |
787 | 795 | ||
796 | int | ||
797 | mailmbox_append_message(struct mailmbox_folder * folder, | ||
798 | const char * data, size_t len) | ||
799 | { | ||
800 | return mailmbox_append_message_uid(folder, data, len, NULL); | ||
801 | } | ||
802 | |||
788 | /* ********************************************************************** */ | 803 | /* ********************************************************************** */ |
789 | 804 | ||
790 | int mailmbox_fetch_msg_no_lock(struct mailmbox_folder * folder, | 805 | int mailmbox_fetch_msg_no_lock(struct mailmbox_folder * folder, |
791 | uint32_t num, char ** result, | 806 | uint32_t num, char ** result, |
792 | size_t * result_len) | 807 | size_t * result_len) |
793 | { | 808 | { |
794 | struct mailmbox_msg_info * info; | 809 | struct mailmbox_msg_info * info; |
795 | int res; | 810 | int res; |
796 | chashdatum key; | 811 | chashdatum key; |
797 | chashdatum data; | 812 | chashdatum data; |
798 | int r; | 813 | int r; |
799 | 814 | ||