summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/mbox
Unidiff
Diffstat (limited to 'kmicromail/libetpan/mbox') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/mbox/mailmbox.c21
-rw-r--r--kmicromail/libetpan/mbox/mailmbox.h4
-rw-r--r--kmicromail/libetpan/mbox/mailmbox_types.c3
-rw-r--r--kmicromail/libetpan/mbox/mailmbox_types.h1
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
179void mailmbox_timestamp(struct mailmbox_folder * folder) 179void 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
195int mailmbox_open(struct mailmbox_folder * folder) 195int 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
222void mailmbox_close(struct mailmbox_folder * folder) 225void 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
746int 751int
747mailmbox_append_message(struct mailmbox_folder * folder, 752mailmbox_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
796int
797mailmbox_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
790int mailmbox_fetch_msg_no_lock(struct mailmbox_folder * folder, 805int 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 = &num; 815 key.data = &num;
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
41extern "C" { 41extern "C" {
42#endif 42#endif
43 43
44#include <libetpan/mailmbox_types.h> 44#include <libetpan/mailmbox_types.h>
45 45
46int 46int
47mailmbox_append_message_list(struct mailmbox_folder * folder, 47mailmbox_append_message_list(struct mailmbox_folder * folder,
48 carray * append_tab); 48 carray * append_tab);
49 49
50int 50int
51mailmbox_append_message(struct mailmbox_folder * folder, 51mailmbox_append_message(struct mailmbox_folder * folder,
52 const char * data, size_t len); 52 const char * data, size_t len);
53 53
54int
55mailmbox_append_message_uid(struct mailmbox_folder * folder,
56 const char * data, size_t len, unsigned int * puid);
57
54int mailmbox_fetch_msg(struct mailmbox_folder * folder, 58int 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
58int mailmbox_fetch_msg_headers(struct mailmbox_folder * folder, 62int 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
62void mailmbox_fetch_result_free(char * msg); 66void mailmbox_fetch_result_free(char * msg);
63 67
64int mailmbox_copy_msg_list(struct mailmbox_folder * dest_folder, 68int 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
68int mailmbox_copy_msg(struct mailmbox_folder * dest_folder, 72int 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
72int mailmbox_expunge(struct mailmbox_folder * folder); 76int mailmbox_expunge(struct mailmbox_folder * folder);
73 77
74int mailmbox_delete_msg(struct mailmbox_folder * folder, uint32_t uid); 78int mailmbox_delete_msg(struct mailmbox_folder * folder, uint32_t uid);
75 79
76int mailmbox_init(const char * filename, 80int 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
162void mailmbox_msg_info_free(struct mailmbox_msg_info * info) 162void 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
170struct mailmbox_append_info * 170struct mailmbox_append_info *
171mailmbox_append_info_new(const char * ai_message, size_t ai_size) 171mailmbox_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
185void mailmbox_append_info_free(struct mailmbox_append_info * info) 186void mailmbox_append_info_free(struct mailmbox_append_info * info)
186{ 187{
187 free(info); 188 free(info);
188} 189}
189 190
190struct mailmbox_folder * mailmbox_folder_new(const char * mb_filename) 191struct 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
112int mailmbox_msg_info_update(struct mailmbox_folder * folder, 112int 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
119struct mailmbox_msg_info * 119struct mailmbox_msg_info *
120mailmbox_msg_info_new(size_t msg_start, size_t msg_start_len, 120mailmbox_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
126void mailmbox_msg_info_free(struct mailmbox_msg_info * info); 126void mailmbox_msg_info_free(struct mailmbox_msg_info * info);
127 127
128struct mailmbox_append_info { 128struct 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
133struct mailmbox_append_info * 134struct mailmbox_append_info *
134mailmbox_append_info_new(const char * ai_message, size_t ai_size); 135mailmbox_append_info_new(const char * ai_message, size_t ai_size);
135 136
136void mailmbox_append_info_free(struct mailmbox_append_info * info); 137void 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