Mercurial > dovecot > core-2.2
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 |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "lib.h" | |
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 | 7 #include "mbox-index.h" |
8 #include "mbox-lock.h" | |
9 #include "mbox-storage.h" | |
10 | |
11 #include <stdlib.h> | |
12 #include <unistd.h> | |
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 | 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 | 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 | 175 |
176 if (box->readonly) { | |
177 mail_storage_set_error(box->storage, "Mailbox is read-only"); | |
178 return FALSE; | |
179 } | |
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 | 188 |
562 | 189 if (!index_storage_sync_and_lock(ibox, FALSE, MAIL_LOCK_EXCLUSIVE)) |
0 | 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 | 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 | 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 | 220 } |
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 | 227 |
0 | 228 return !failed; |
229 } |