annotate src/lib-storage/index/mbox/mbox-save.c @ 988:8028c4dcf38f HEAD

mail-storage.h interface changes, affects pretty much everything. FETCH, SEARCH, SORT and THREAD handling were pretty much moved from lib-storage/ to imap/ so adding non-index storages would be much easier now. Also POP3 server can now be easily implemented with lib-storage. Not too well tested, and at least one major problem: partial fetching is _slow_.
author Timo Sirainen <tss@iki.fi>
date Mon, 20 Jan 2003 16:52:51 +0200
parents fd8888f6f037
children 40a327d356de
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2002 Timo Sirainen */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "hostpid.h"
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
5 #include "ostream.h"
29
e9375147c0cb Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents: 22
diff changeset
6 #include "write-full.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "mbox-index.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mbox-lock.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mbox-storage.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include <stdlib.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <unistd.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <fcntl.h>
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
14 #include <sys/stat.h>
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
15 #include <netdb.h>
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
16
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
17 static char my_hostdomain[256] = "";
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
18
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
19 static int write_error(struct mail_storage *storage, const char *mbox_path)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
20 {
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
21 if (errno == ENOSPC)
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
22 mail_storage_set_error(storage, "Not enough disk space");
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
23 else {
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
24 mail_storage_set_critical(storage,
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
25 "Error writing to mbox file %s: %m", mbox_path);
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
26 }
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
27
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
28 return FALSE;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
29 }
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
30
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
31 static int mbox_seek_to_end(struct mail_storage *storage, int fd,
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
32 const char *mbox_path, off_t *pos)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
33 {
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
34 struct stat st;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
35 char ch;
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
36
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
37 if (fstat(fd, &st) < 0) {
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
38 mail_storage_set_critical(storage,
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
39 "fstat() failed for mbox file %s: %m", mbox_path);
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
40 return FALSE;
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
41 }
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
42
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
43 *pos = st.st_size;
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
44 if (st.st_size == 0)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
45 return TRUE;
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
46
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
47 if (lseek(fd, st.st_size-1, SEEK_SET) < 0) {
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
48 mail_storage_set_critical(storage,
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
49 "lseek() failed for mbox file %s: %m", mbox_path);
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
50 return FALSE;
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
51 }
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
52
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
53 if (read(fd, &ch, 1) != 1) {
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
54 mail_storage_set_critical(storage,
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
55 "read() failed for mbox file %s: %m", mbox_path);
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
56 return FALSE;
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
57 }
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
58
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
59 if (ch != '\n') {
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
60 if (write_full(fd, "\n", 1) < 0)
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
61 return write_error(storage, mbox_path);
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
62 *pos += 1;
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
63 }
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
64
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
65 return TRUE;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
66 }
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
67
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
68 static int mbox_append_lf(struct mail_storage *storage, struct ostream *output,
472
2fa0bfb65268 Added setting mail_save_crlf. Few other settings cleanups.
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
69 const char *mbox_path)
266
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
70 {
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
71 if (o_stream_send(output, "\n", 1) < 0)
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
72 return write_error(storage, mbox_path);
266
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
73
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
74 return TRUE;
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
75 }
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
76
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
77 static int write_from_line(struct mail_storage *storage, struct ostream *output,
472
2fa0bfb65268 Added setting mail_save_crlf. Few other settings cleanups.
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
78 const char *mbox_path, time_t internal_date)
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
79 {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
80 const char *sender, *line, *name;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
81
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
82 if (*my_hostdomain == '\0') {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
83 struct hostent *hent;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
84
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
85 hostpid_init();
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
86 hent = gethostbyname(my_hostname);
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
87
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
88 name = hent != NULL ? hent->h_name : NULL;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
89 if (name == NULL) {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
90 /* failed, use just the hostname */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
91 name = my_hostname;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
92 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
93
809
27554afad17e Limit the mailbox path. A few cleanups.
Timo Sirainen <tss@iki.fi>
parents: 807
diff changeset
94 strocpy(my_hostdomain, name, sizeof(my_hostdomain));
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
95 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
96
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
97 sender = t_strconcat(storage->user, "@", my_hostdomain, NULL);
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
98
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents: 472
diff changeset
99 /* save in local timezone, no matter what it was given with */
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
100 line = mbox_from_create(sender, internal_date);
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
101
807
35abd7a5d381 Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
102 if (o_stream_send_str(output, line) < 0)
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
103 return write_error(storage, mbox_path);
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
104
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
105 return TRUE;
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
106 }
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
107
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
108 static int write_flags(struct mail_storage *storage, struct ostream *output,
472
2fa0bfb65268 Added setting mail_save_crlf. Few other settings cleanups.
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
109 const char *mbox_path,
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
110 const struct mail_full_flags *full_flags)
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
111 {
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
112 enum mail_flags flags = full_flags->flags;
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
113 const char *str;
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
114 unsigned int field;
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
115 unsigned int i;
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
116
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
117 if (flags == 0)
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
118 return TRUE;
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
119
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
120 if (flags & MAIL_SEEN) {
807
35abd7a5d381 Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
121 if (o_stream_send_str(output, "Status: R\n") < 0)
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
122 return write_error(storage, mbox_path);
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
123 }
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
124
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
125 if (flags & (MAIL_ANSWERED|MAIL_DRAFT|MAIL_FLAGGED|MAIL_DELETED)) {
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
126 str = t_strconcat("X-Status: ",
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
127 (flags & MAIL_ANSWERED) ? "A" : "",
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
128 (flags & MAIL_DRAFT) ? "D" : "",
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
129 (flags & MAIL_FLAGGED) ? "F" : "",
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
130 (flags & MAIL_DELETED) ? "T" : "",
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
131 "\n", NULL);
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
132
807
35abd7a5d381 Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
133 if (o_stream_send_str(output, str) < 0)
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
134 return write_error(storage, mbox_path);
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
135 }
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
136
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
137 if (flags & MAIL_CUSTOM_FLAGS_MASK) {
807
35abd7a5d381 Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
138 if (o_stream_send_str(output, "X-Keywords:") < 0)
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
139 return write_error(storage, mbox_path);
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
140
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
141 field = 1 << MAIL_CUSTOM_FLAG_1_BIT;
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
142 for (i = 0; i < full_flags->custom_flags_count; i++) {
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
143 const char *custom_flag = full_flags->custom_flags[i];
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
144
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
145 if ((flags & field) && custom_flag != NULL) {
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
146 if (o_stream_send(output, " ", 1) < 0)
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
147 return write_error(storage, mbox_path);
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
148
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
149 if (o_stream_send_str(output, custom_flag) < 0)
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
150 return write_error(storage, mbox_path);
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
151 }
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
152
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
153 field <<= 1;
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
154 }
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
155
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
156 if (o_stream_send(output, "\n", 1) < 0)
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
157 return write_error(storage, mbox_path);
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
158 }
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
159
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
160 return TRUE;
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
161 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
163 int mbox_storage_save(struct mailbox *box, const struct mail_full_flags *flags,
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
164 time_t internal_date,
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
165 int timezone_offset __attr_unused__,
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
166 struct istream *data, uoff_t data_size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
168 struct index_mailbox *ibox = (struct index_mailbox *) box;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
169 struct mail_index *index;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
170 enum mail_flags real_flags;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
171 const char *mbox_path;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 817
diff changeset
172 struct ostream *output;
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
173 int failed;
315
f07ad72a1c7e custom flags weren't saved properly.
Timo Sirainen <tss@iki.fi>
parents: 314
diff changeset
174 off_t pos;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 if (box->readonly) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 mail_storage_set_error(box->storage, "Mailbox is read-only");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
633
3814fc4f4135 COPYing inside same mailbox works now with mbox. Also fixed SAVE leaving
Timo Sirainen <tss@iki.fi>
parents: 604
diff changeset
181 /* we don't need the real flag positions, easier to keep using our own.
315
f07ad72a1c7e custom flags weren't saved properly.
Timo Sirainen <tss@iki.fi>
parents: 314
diff changeset
182 they need to be checked/added though. */
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
183 real_flags = flags->flags;
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
184 if (!index_mailbox_fix_custom_flags(ibox, &real_flags,
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
185 flags->custom_flags,
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
186 flags->custom_flags_count))
175
73bf05a1d862 Moved custom flags handling into lib-index.
Timo Sirainen <tss@iki.fi>
parents: 30
diff changeset
187 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188
562
ca988d72265b APPEND fixed for mbox
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
189 if (!index_storage_sync_and_lock(ibox, FALSE, MAIL_LOCK_EXCLUSIVE))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 return FALSE;
364
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 315
diff changeset
191
562
ca988d72265b APPEND fixed for mbox
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
192 index = ibox->index;
817
86cf24da85f1 Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents: 809
diff changeset
193 mbox_path = index->mailbox_path;
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
194 if (!mbox_seek_to_end(box->storage, index->mbox_fd, mbox_path, &pos))
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
195 failed = TRUE;
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
196 else {
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
197 failed = FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
472
2fa0bfb65268 Added setting mail_save_crlf. Few other settings cleanups.
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
199 t_push();
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
200 output = o_stream_create_file(index->mbox_fd,
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
201 data_stack_pool, 4096,
532
3b53dd1280c6 I/O buffers now use real blocking instead of setting up a sub-ioloop to
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
202 0, FALSE);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
203 o_stream_set_blocking(output, 60000, NULL, NULL);
30
8509281fda72 Make sure mbox file ends with \n when appending new mail to it
Timo Sirainen <tss@iki.fi>
parents: 29
diff changeset
204
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
205 if (!write_from_line(box->storage, output, mbox_path,
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
206 internal_date) ||
988
8028c4dcf38f mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
207 !write_flags(box->storage, output, mbox_path, flags) ||
472
2fa0bfb65268 Added setting mail_save_crlf. Few other settings cleanups.
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
208 !index_storage_save(box->storage, mbox_path,
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
209 data, output, data_size) ||
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
210 !mbox_append_lf(box->storage, output, mbox_path)) {
633
3814fc4f4135 COPYing inside same mailbox works now with mbox. Also fixed SAVE leaving
Timo Sirainen <tss@iki.fi>
parents: 604
diff changeset
211 /* failed, truncate file back to original size.
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
212 output stream needs to be flushed before truncating
633
3814fc4f4135 COPYing inside same mailbox works now with mbox. Also fixed SAVE leaving
Timo Sirainen <tss@iki.fi>
parents: 604
diff changeset
213 so unref() won't write anything. */
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
214 o_stream_flush(output);
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
215 (void)ftruncate(index->mbox_fd, pos);
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
216 failed = TRUE;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
217 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
218 o_stream_unref(output);
472
2fa0bfb65268 Added setting mail_save_crlf. Few other settings cleanups.
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
219 t_pop();
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
633
3814fc4f4135 COPYing inside same mailbox works now with mbox. Also fixed SAVE leaving
Timo Sirainen <tss@iki.fi>
parents: 604
diff changeset
222 /* kludgy.. for copying inside same mailbox. */
3814fc4f4135 COPYing inside same mailbox works now with mbox. Also fixed SAVE leaving
Timo Sirainen <tss@iki.fi>
parents: 604
diff changeset
223 if (!ibox->delay_save_unlocking) {
674
b7aefd0d7611 Locking changes triggered a bit larger cleanup :) If we have to wait for a
Timo Sirainen <tss@iki.fi>
parents: 633
diff changeset
224 if (!index_storage_lock(ibox, MAIL_LOCK_UNLOCK))
b7aefd0d7611 Locking changes triggered a bit larger cleanup :) If we have to wait for a
Timo Sirainen <tss@iki.fi>
parents: 633
diff changeset
225 return FALSE;
633
3814fc4f4135 COPYing inside same mailbox works now with mbox. Also fixed SAVE leaving
Timo Sirainen <tss@iki.fi>
parents: 604
diff changeset
226 }
562
ca988d72265b APPEND fixed for mbox
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
227
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 return !failed;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 }