-rw-r--r-- | kmicromail/libetpan/mbox/mailmbox.c | 21 | ||||
-rw-r--r-- | kmicromail/libetpan/mbox/mailmbox.h | 4 | ||||
-rw-r--r-- | kmicromail/libetpan/mbox/mailmbox_types.c | 3 | ||||
-rw-r--r-- | kmicromail/libetpan/mbox/mailmbox_types.h | 1 |
4 files changed, 25 insertions, 4 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 | |||
@@ -176,48 +176,51 @@ void mailmbox_sync(struct mailmbox_folder * folder) | |||
176 | msync(folder->mb_mapping, folder->mb_mapping_size, MS_SYNC); | 176 | msync(folder->mb_mapping, folder->mb_mapping_size, MS_SYNC); |
177 | } | 177 | } |
178 | 178 | ||
179 | void mailmbox_timestamp(struct mailmbox_folder * folder) | 179 | void mailmbox_timestamp(struct mailmbox_folder * folder) |
180 | { | 180 | { |
181 | int r; | 181 | int r; |
182 | struct stat buf; | 182 | struct stat buf; |
183 | 183 | ||
184 | r = stat(folder->mb_filename, &buf); | 184 | r = stat(folder->mb_filename, &buf); |
185 | if (r < 0) | 185 | if (r < 0) |
186 | folder->mb_mtime = (time_t) -1; | 186 | folder->mb_mtime = (time_t) -1; |
187 | else | 187 | else |
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 | ||
212 | folder->mb_fd = fd; | 215 | folder->mb_fd = fd; |
213 | folder->mb_read_only = read_only; | 216 | folder->mb_read_only = read_only; |
214 | 217 | ||
215 | return MAILMBOX_NO_ERROR; | 218 | return MAILMBOX_NO_ERROR; |
216 | } | 219 | } |
217 | 220 | ||
218 | /* | 221 | /* |
219 | close the file | 222 | close the file |
220 | */ | 223 | */ |
221 | 224 | ||
222 | void mailmbox_close(struct mailmbox_folder * folder) | 225 | void mailmbox_close(struct mailmbox_folder * folder) |
223 | { | 226 | { |
@@ -596,48 +599,50 @@ mailmbox_append_message_list_no_lock(struct mailmbox_folder * folder, | |||
596 | size_t crlf_count; | 599 | size_t crlf_count; |
597 | 600 | ||
598 | if (folder->mb_read_only) { | 601 | if (folder->mb_read_only) { |
599 | res = MAILMBOX_ERROR_READONLY; | 602 | res = MAILMBOX_ERROR_READONLY; |
600 | goto err; | 603 | goto err; |
601 | } | 604 | } |
602 | 605 | ||
603 | date = time(NULL); | 606 | date = time(NULL); |
604 | from_size = strlen(DEFAULT_FROM_LINE); | 607 | from_size = strlen(DEFAULT_FROM_LINE); |
605 | if (localtime_r(&date, &time_info) != NULL) | 608 | if (localtime_r(&date, &time_info) != NULL) |
606 | from_size = strftime(from_line, MAX_FROM_LINE_SIZE, "From - %c\n", &time_info); | 609 | from_size = strftime(from_line, MAX_FROM_LINE_SIZE, "From - %c\n", &time_info); |
607 | 610 | ||
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 | } |
632 | else | 637 | else |
633 | break; | 638 | break; |
634 | 639 | ||
635 | if (crlf_count == 2) | 640 | if (crlf_count == 2) |
636 | break; | 641 | break; |
637 | } | 642 | } |
638 | 643 | ||
639 | old_size = folder->mb_mapping_size; | 644 | old_size = folder->mb_mapping_size; |
640 | mailmbox_unmap(folder); | 645 | mailmbox_unmap(folder); |
641 | 646 | ||
642 | if (old_size != 0) { | 647 | if (old_size != 0) { |
643 | if (crlf_count != 2) | 648 | if (crlf_count != 2) |
@@ -723,89 +728,99 @@ mailmbox_append_message_list(struct mailmbox_folder * folder, | |||
723 | goto unlock; | 728 | goto unlock; |
724 | } | 729 | } |
725 | 730 | ||
726 | mailmbox_sync(folder); | 731 | mailmbox_sync(folder); |
727 | 732 | ||
728 | r = mailmbox_parse_additionnal(folder, &cur_token); | 733 | r = mailmbox_parse_additionnal(folder, &cur_token); |
729 | if (r != MAILMBOX_NO_ERROR) { | 734 | if (r != MAILMBOX_NO_ERROR) { |
730 | res = r; | 735 | res = r; |
731 | goto unlock; | 736 | goto unlock; |
732 | } | 737 | } |
733 | 738 | ||
734 | mailmbox_timestamp(folder); | 739 | mailmbox_timestamp(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 | ||
761 | append_info = mailmbox_append_info_new(data, len); | 766 | append_info = mailmbox_append_info_new(data, len); |
762 | if (append_info == NULL) { | 767 | if (append_info == NULL) { |
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 | ||
800 | key.data = # | 815 | key.data = # |
801 | key.len = sizeof(num); | 816 | key.len = sizeof(num); |
802 | 817 | ||
803 | r = chash_get(folder->mb_hash, &key, &data); | 818 | r = chash_get(folder->mb_hash, &key, &data); |
804 | if (r < 0) { | 819 | if (r < 0) { |
805 | res = MAILMBOX_ERROR_MSG_NOT_FOUND; | 820 | res = MAILMBOX_ERROR_MSG_NOT_FOUND; |
806 | goto err; | 821 | goto err; |
807 | } | 822 | } |
808 | 823 | ||
809 | info = data.data; | 824 | info = data.data; |
810 | 825 | ||
811 | if (info->msg_deleted) { | 826 | if (info->msg_deleted) { |
diff --git a/kmicromail/libetpan/mbox/mailmbox.h b/kmicromail/libetpan/mbox/mailmbox.h index 8be086c..0427f1f 100644 --- a/kmicromail/libetpan/mbox/mailmbox.h +++ b/kmicromail/libetpan/mbox/mailmbox.h | |||
@@ -30,48 +30,52 @@ | |||
30 | */ | 30 | */ |
31 | 31 | ||
32 | /* | 32 | /* |
33 | * $Id$ | 33 | * $Id$ |
34 | */ | 34 | */ |
35 | 35 | ||
36 | #ifndef MAILMBOX_H | 36 | #ifndef MAILMBOX_H |
37 | 37 | ||
38 | #define MAILMBOX_H | 38 | #define MAILMBOX_H |
39 | 39 | ||
40 | #ifdef __cplusplus | 40 | #ifdef __cplusplus |
41 | extern "C" { | 41 | extern "C" { |
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | #include <libetpan/mailmbox_types.h> | 44 | #include <libetpan/mailmbox_types.h> |
45 | 45 | ||
46 | int | 46 | int |
47 | mailmbox_append_message_list(struct mailmbox_folder * folder, | 47 | mailmbox_append_message_list(struct mailmbox_folder * folder, |
48 | carray * append_tab); | 48 | carray * append_tab); |
49 | 49 | ||
50 | int | 50 | int |
51 | mailmbox_append_message(struct mailmbox_folder * folder, | 51 | mailmbox_append_message(struct mailmbox_folder * folder, |
52 | const char * data, size_t len); | 52 | const char * data, size_t len); |
53 | 53 | ||
54 | int | ||
55 | mailmbox_append_message_uid(struct mailmbox_folder * folder, | ||
56 | const char * data, size_t len, unsigned int * puid); | ||
57 | |||
54 | int mailmbox_fetch_msg(struct mailmbox_folder * folder, | 58 | int mailmbox_fetch_msg(struct mailmbox_folder * folder, |
55 | uint32_t num, char ** result, | 59 | uint32_t num, char ** result, |
56 | size_t * result_len); | 60 | size_t * result_len); |
57 | 61 | ||
58 | int mailmbox_fetch_msg_headers(struct mailmbox_folder * folder, | 62 | int mailmbox_fetch_msg_headers(struct mailmbox_folder * folder, |
59 | uint32_t num, char ** result, | 63 | uint32_t num, char ** result, |
60 | size_t * result_len); | 64 | size_t * result_len); |
61 | 65 | ||
62 | void mailmbox_fetch_result_free(char * msg); | 66 | void mailmbox_fetch_result_free(char * msg); |
63 | 67 | ||
64 | int mailmbox_copy_msg_list(struct mailmbox_folder * dest_folder, | 68 | int mailmbox_copy_msg_list(struct mailmbox_folder * dest_folder, |
65 | struct mailmbox_folder * src_folder, | 69 | struct mailmbox_folder * src_folder, |
66 | carray * tab); | 70 | carray * tab); |
67 | 71 | ||
68 | int mailmbox_copy_msg(struct mailmbox_folder * dest_folder, | 72 | int mailmbox_copy_msg(struct mailmbox_folder * dest_folder, |
69 | struct mailmbox_folder * src_folder, | 73 | struct mailmbox_folder * src_folder, |
70 | uint32_t uid); | 74 | uint32_t uid); |
71 | 75 | ||
72 | int mailmbox_expunge(struct mailmbox_folder * folder); | 76 | int mailmbox_expunge(struct mailmbox_folder * folder); |
73 | 77 | ||
74 | int mailmbox_delete_msg(struct mailmbox_folder * folder, uint32_t uid); | 78 | int mailmbox_delete_msg(struct mailmbox_folder * folder, uint32_t uid); |
75 | 79 | ||
76 | int mailmbox_init(const char * filename, | 80 | int mailmbox_init(const char * filename, |
77 | int force_readonly, | 81 | int force_readonly, |
diff --git a/kmicromail/libetpan/mbox/mailmbox_types.c b/kmicromail/libetpan/mbox/mailmbox_types.c index 1986182..4e3e521 100644 --- a/kmicromail/libetpan/mbox/mailmbox_types.c +++ b/kmicromail/libetpan/mbox/mailmbox_types.c | |||
@@ -157,49 +157,50 @@ mailmbox_msg_info_new(size_t msg_start, size_t msg_start_len, | |||
157 | info->msg_padding = msg_padding; | 157 | info->msg_padding = msg_padding; |
158 | 158 | ||
159 | return info; | 159 | return info; |
160 | } | 160 | } |
161 | 161 | ||
162 | void mailmbox_msg_info_free(struct mailmbox_msg_info * info) | 162 | void mailmbox_msg_info_free(struct mailmbox_msg_info * info) |
163 | { | 163 | { |
164 | free(info); | 164 | free(info); |
165 | } | 165 | } |
166 | 166 | ||
167 | 167 | ||
168 | /* append info */ | 168 | /* append info */ |
169 | 169 | ||
170 | struct mailmbox_append_info * | 170 | struct mailmbox_append_info * |
171 | mailmbox_append_info_new(const char * ai_message, size_t ai_size) | 171 | mailmbox_append_info_new(const char * ai_message, size_t ai_size) |
172 | { | 172 | { |
173 | struct mailmbox_append_info * info; | 173 | struct mailmbox_append_info * info; |
174 | 174 | ||
175 | info = malloc(sizeof(* info)); | 175 | info = malloc(sizeof(* info)); |
176 | if (info == NULL) | 176 | if (info == NULL) |
177 | return NULL; | 177 | return NULL; |
178 | 178 | ||
179 | info->ai_message = ai_message; | 179 | info->ai_message = ai_message; |
180 | info->ai_size = ai_size; | 180 | info->ai_size = ai_size; |
181 | 181 | info->ai_uid = 0; | |
182 | |||
182 | return info; | 183 | return info; |
183 | } | 184 | } |
184 | 185 | ||
185 | void mailmbox_append_info_free(struct mailmbox_append_info * info) | 186 | void mailmbox_append_info_free(struct mailmbox_append_info * info) |
186 | { | 187 | { |
187 | free(info); | 188 | free(info); |
188 | } | 189 | } |
189 | 190 | ||
190 | struct mailmbox_folder * mailmbox_folder_new(const char * mb_filename) | 191 | struct mailmbox_folder * mailmbox_folder_new(const char * mb_filename) |
191 | { | 192 | { |
192 | struct mailmbox_folder * folder; | 193 | struct mailmbox_folder * folder; |
193 | 194 | ||
194 | folder = malloc(sizeof(* folder)); | 195 | folder = malloc(sizeof(* folder)); |
195 | if (folder == NULL) | 196 | if (folder == NULL) |
196 | goto err; | 197 | goto err; |
197 | 198 | ||
198 | strncpy(folder->mb_filename, mb_filename, PATH_MAX); | 199 | strncpy(folder->mb_filename, mb_filename, PATH_MAX); |
199 | 200 | ||
200 | folder->mb_mtime = (time_t) -1; | 201 | folder->mb_mtime = (time_t) -1; |
201 | 202 | ||
202 | folder->mb_fd = -1; | 203 | folder->mb_fd = -1; |
203 | folder->mb_read_only = TRUE; | 204 | folder->mb_read_only = TRUE; |
204 | folder->mb_no_uid = TRUE; | 205 | folder->mb_no_uid = TRUE; |
205 | 206 | ||
diff --git a/kmicromail/libetpan/mbox/mailmbox_types.h b/kmicromail/libetpan/mbox/mailmbox_types.h index dd6758c..bd6ee30 100644 --- a/kmicromail/libetpan/mbox/mailmbox_types.h +++ b/kmicromail/libetpan/mbox/mailmbox_types.h | |||
@@ -107,36 +107,37 @@ struct mailmbox_msg_info { | |||
107 | 107 | ||
108 | size_t msg_padding; | 108 | size_t msg_padding; |
109 | }; | 109 | }; |
110 | 110 | ||
111 | 111 | ||
112 | int mailmbox_msg_info_update(struct mailmbox_folder * folder, | 112 | int mailmbox_msg_info_update(struct mailmbox_folder * folder, |
113 | size_t msg_start, size_t msg_start_len, | 113 | size_t msg_start, size_t msg_start_len, |
114 | size_t msg_headers, size_t msg_headers_len, | 114 | size_t msg_headers, size_t msg_headers_len, |
115 | size_t msg_body, size_t msg_body_len, | 115 | size_t msg_body, size_t msg_body_len, |
116 | size_t msg_size, size_t msg_padding, | 116 | size_t msg_size, size_t msg_padding, |
117 | uint32_t msg_uid); | 117 | uint32_t msg_uid); |
118 | 118 | ||
119 | struct mailmbox_msg_info * | 119 | struct mailmbox_msg_info * |
120 | mailmbox_msg_info_new(size_t msg_start, size_t msg_start_len, | 120 | mailmbox_msg_info_new(size_t msg_start, size_t msg_start_len, |
121 | size_t msg_headers, size_t msg_headers_len, | 121 | size_t msg_headers, size_t msg_headers_len, |
122 | size_t msg_body, size_t msg_body_len, | 122 | size_t msg_body, size_t msg_body_len, |
123 | size_t msg_size, size_t msg_padding, | 123 | size_t msg_size, size_t msg_padding, |
124 | uint32_t msg_uid); | 124 | uint32_t msg_uid); |
125 | 125 | ||
126 | void mailmbox_msg_info_free(struct mailmbox_msg_info * info); | 126 | void mailmbox_msg_info_free(struct mailmbox_msg_info * info); |
127 | 127 | ||
128 | struct mailmbox_append_info { | 128 | struct mailmbox_append_info { |
129 | const char * ai_message; | 129 | const char * ai_message; |
130 | size_t ai_size; | 130 | size_t ai_size; |
131 | unsigned int ai_uid; | ||
131 | }; | 132 | }; |
132 | 133 | ||
133 | struct mailmbox_append_info * | 134 | struct mailmbox_append_info * |
134 | mailmbox_append_info_new(const char * ai_message, size_t ai_size); | 135 | mailmbox_append_info_new(const char * ai_message, size_t ai_size); |
135 | 136 | ||
136 | void mailmbox_append_info_free(struct mailmbox_append_info * info); | 137 | void mailmbox_append_info_free(struct mailmbox_append_info * info); |
137 | 138 | ||
138 | #ifdef __cplusplus | 139 | #ifdef __cplusplus |
139 | } | 140 | } |
140 | #endif | 141 | #endif |
141 | 142 | ||
142 | #endif | 143 | #endif |