Blame


1 5cdb1798 2005-10-29 devnull #include "common.h"
2 5cdb1798 2005-10-29 devnull #include <ctype.h>
3 5cdb1798 2005-10-29 devnull #include <plumb.h>
4 5cdb1798 2005-10-29 devnull #include <libsec.h>
5 5cdb1798 2005-10-29 devnull #include "dat.h"
6 5cdb1798 2005-10-29 devnull
7 5cdb1798 2005-10-29 devnull enum {
8 5cdb1798 2005-10-29 devnull Buffersize = 64*1024,
9 5cdb1798 2005-10-29 devnull };
10 5cdb1798 2005-10-29 devnull
11 5cdb1798 2005-10-29 devnull typedef struct Inbuf Inbuf;
12 5cdb1798 2005-10-29 devnull struct Inbuf
13 5cdb1798 2005-10-29 devnull {
14 5cdb1798 2005-10-29 devnull int fd;
15 5cdb1798 2005-10-29 devnull uchar *lim;
16 5cdb1798 2005-10-29 devnull uchar *rptr;
17 5cdb1798 2005-10-29 devnull uchar *wptr;
18 5cdb1798 2005-10-29 devnull uchar data[Buffersize+7];
19 5cdb1798 2005-10-29 devnull };
20 5cdb1798 2005-10-29 devnull
21 5cdb1798 2005-10-29 devnull static void
22 5cdb1798 2005-10-29 devnull addtomessage(Message *m, uchar *p, int n, int done)
23 5cdb1798 2005-10-29 devnull {
24 5cdb1798 2005-10-29 devnull int i, len;
25 5cdb1798 2005-10-29 devnull
26 5cdb1798 2005-10-29 devnull // add to message (+ 1 in malloc is for a trailing null)
27 5cdb1798 2005-10-29 devnull if(m->lim - m->end < n){
28 5cdb1798 2005-10-29 devnull if(m->start != nil){
29 5cdb1798 2005-10-29 devnull i = m->end-m->start;
30 5cdb1798 2005-10-29 devnull if(done)
31 5cdb1798 2005-10-29 devnull len = i + n;
32 5cdb1798 2005-10-29 devnull else
33 5cdb1798 2005-10-29 devnull len = (4*(i+n))/3;
34 5cdb1798 2005-10-29 devnull m->start = erealloc(m->start, len + 1);
35 5cdb1798 2005-10-29 devnull m->end = m->start + i;
36 5cdb1798 2005-10-29 devnull } else {
37 5cdb1798 2005-10-29 devnull if(done)
38 5cdb1798 2005-10-29 devnull len = n;
39 5cdb1798 2005-10-29 devnull else
40 5cdb1798 2005-10-29 devnull len = 2*n;
41 5cdb1798 2005-10-29 devnull m->start = emalloc(len + 1);
42 5cdb1798 2005-10-29 devnull m->end = m->start;
43 5cdb1798 2005-10-29 devnull }
44 5cdb1798 2005-10-29 devnull m->lim = m->start + len;
45 5cdb1798 2005-10-29 devnull }
46 5cdb1798 2005-10-29 devnull
47 5cdb1798 2005-10-29 devnull memmove(m->end, p, n);
48 5cdb1798 2005-10-29 devnull m->end += n;
49 5cdb1798 2005-10-29 devnull }
50 5cdb1798 2005-10-29 devnull
51 5cdb1798 2005-10-29 devnull //
52 5cdb1798 2005-10-29 devnull // read in a single message
53 5cdb1798 2005-10-29 devnull //
54 5cdb1798 2005-10-29 devnull static int
55 5cdb1798 2005-10-29 devnull readmessage(Message *m, Inbuf *inb)
56 5cdb1798 2005-10-29 devnull {
57 5cdb1798 2005-10-29 devnull int i, n, done;
58 5cdb1798 2005-10-29 devnull uchar *p, *np;
59 5cdb1798 2005-10-29 devnull char sdigest[SHA1dlen*2+1];
60 5cdb1798 2005-10-29 devnull char tmp[64];
61 5cdb1798 2005-10-29 devnull
62 5cdb1798 2005-10-29 devnull for(done = 0; !done;){
63 5cdb1798 2005-10-29 devnull n = inb->wptr - inb->rptr;
64 5cdb1798 2005-10-29 devnull if(n < 6){
65 5cdb1798 2005-10-29 devnull if(n)
66 5cdb1798 2005-10-29 devnull memmove(inb->data, inb->rptr, n);
67 5cdb1798 2005-10-29 devnull inb->rptr = inb->data;
68 5cdb1798 2005-10-29 devnull inb->wptr = inb->rptr + n;
69 5cdb1798 2005-10-29 devnull i = read(inb->fd, inb->wptr, Buffersize);
70 5cdb1798 2005-10-29 devnull if(i < 0){
71 5cdb1798 2005-10-29 devnull /* if(fd2path(inb->fd, tmp, sizeof tmp) < 0)
72 5cdb1798 2005-10-29 devnull strcpy(tmp, "unknown mailbox"); jpc */
73 5cdb1798 2005-10-29 devnull fprint(2, "error reading '%s': %r\n", tmp);
74 5cdb1798 2005-10-29 devnull return -1;
75 5cdb1798 2005-10-29 devnull }
76 5cdb1798 2005-10-29 devnull if(i == 0){
77 5cdb1798 2005-10-29 devnull if(n != 0)
78 5cdb1798 2005-10-29 devnull addtomessage(m, inb->rptr, n, 1);
79 5cdb1798 2005-10-29 devnull if(m->end == m->start)
80 5cdb1798 2005-10-29 devnull return -1;
81 5cdb1798 2005-10-29 devnull break;
82 5cdb1798 2005-10-29 devnull }
83 5cdb1798 2005-10-29 devnull inb->wptr += i;
84 5cdb1798 2005-10-29 devnull }
85 5cdb1798 2005-10-29 devnull
86 5cdb1798 2005-10-29 devnull // look for end of message
87 5cdb1798 2005-10-29 devnull for(p = inb->rptr; p < inb->wptr; p = np+1){
88 5cdb1798 2005-10-29 devnull // first part of search for '\nFrom '
89 5cdb1798 2005-10-29 devnull np = memchr(p, '\n', inb->wptr - p);
90 5cdb1798 2005-10-29 devnull if(np == nil){
91 5cdb1798 2005-10-29 devnull p = inb->wptr;
92 5cdb1798 2005-10-29 devnull break;
93 5cdb1798 2005-10-29 devnull }
94 5cdb1798 2005-10-29 devnull
95 5cdb1798 2005-10-29 devnull /*
96 5cdb1798 2005-10-29 devnull * if we've found a \n but there's
97 5cdb1798 2005-10-29 devnull * not enough room for '\nFrom ', don't do
98 5cdb1798 2005-10-29 devnull * the comparison till we've read in more.
99 5cdb1798 2005-10-29 devnull */
100 5cdb1798 2005-10-29 devnull if(inb->wptr - np < 6){
101 5cdb1798 2005-10-29 devnull p = np;
102 5cdb1798 2005-10-29 devnull break;
103 5cdb1798 2005-10-29 devnull }
104 5cdb1798 2005-10-29 devnull
105 5cdb1798 2005-10-29 devnull if(strncmp((char*)np, "\nFrom ", 6) == 0){
106 5cdb1798 2005-10-29 devnull done = 1;
107 5cdb1798 2005-10-29 devnull p = np+1;
108 5cdb1798 2005-10-29 devnull break;
109 5cdb1798 2005-10-29 devnull }
110 5cdb1798 2005-10-29 devnull }
111 5cdb1798 2005-10-29 devnull
112 5cdb1798 2005-10-29 devnull // add to message (+ 1 in malloc is for a trailing null)
113 5cdb1798 2005-10-29 devnull n = p - inb->rptr;
114 5cdb1798 2005-10-29 devnull addtomessage(m, inb->rptr, n, done);
115 5cdb1798 2005-10-29 devnull inb->rptr += n;
116 5cdb1798 2005-10-29 devnull }
117 5cdb1798 2005-10-29 devnull
118 5cdb1798 2005-10-29 devnull // if it doesn't start with a 'From ', this ain't a mailbox
119 5cdb1798 2005-10-29 devnull if(strncmp(m->start, "From ", 5) != 0)
120 5cdb1798 2005-10-29 devnull return -1;
121 5cdb1798 2005-10-29 devnull
122 5cdb1798 2005-10-29 devnull // dump trailing newline, make sure there's a trailing null
123 5cdb1798 2005-10-29 devnull // (helps in body searches)
124 5cdb1798 2005-10-29 devnull if(*(m->end-1) == '\n')
125 5cdb1798 2005-10-29 devnull m->end--;
126 5cdb1798 2005-10-29 devnull *m->end = 0;
127 5cdb1798 2005-10-29 devnull m->bend = m->rbend = m->end;
128 5cdb1798 2005-10-29 devnull
129 5cdb1798 2005-10-29 devnull // digest message
130 5cdb1798 2005-10-29 devnull sha1((uchar*)m->start, m->end - m->start, m->digest, nil);
131 5cdb1798 2005-10-29 devnull for(i = 0; i < SHA1dlen; i++)
132 5cdb1798 2005-10-29 devnull sprint(sdigest+2*i, "%2.2ux", m->digest[i]);
133 5cdb1798 2005-10-29 devnull m->sdigest = s_copy(sdigest);
134 5cdb1798 2005-10-29 devnull
135 5cdb1798 2005-10-29 devnull return 0;
136 5cdb1798 2005-10-29 devnull }
137 5cdb1798 2005-10-29 devnull
138 5cdb1798 2005-10-29 devnull
139 5cdb1798 2005-10-29 devnull // throw out deleted messages. return number of freshly deleted messages
140 5cdb1798 2005-10-29 devnull int
141 5cdb1798 2005-10-29 devnull purgedeleted(Mailbox *mb)
142 5cdb1798 2005-10-29 devnull {
143 5cdb1798 2005-10-29 devnull Message *m, *next;
144 5cdb1798 2005-10-29 devnull int newdels;
145 5cdb1798 2005-10-29 devnull
146 5cdb1798 2005-10-29 devnull // forget about what's no longer in the mailbox
147 5cdb1798 2005-10-29 devnull newdels = 0;
148 5cdb1798 2005-10-29 devnull for(m = mb->root->part; m != nil; m = next){
149 5cdb1798 2005-10-29 devnull next = m->next;
150 5cdb1798 2005-10-29 devnull if(m->deleted && m->refs == 0){
151 5cdb1798 2005-10-29 devnull if(m->inmbox)
152 5cdb1798 2005-10-29 devnull newdels++;
153 5cdb1798 2005-10-29 devnull delmessage(mb, m);
154 5cdb1798 2005-10-29 devnull }
155 5cdb1798 2005-10-29 devnull }
156 5cdb1798 2005-10-29 devnull return newdels;
157 5cdb1798 2005-10-29 devnull }
158 5cdb1798 2005-10-29 devnull
159 5cdb1798 2005-10-29 devnull //
160 5cdb1798 2005-10-29 devnull // read in the mailbox and parse into messages.
161 5cdb1798 2005-10-29 devnull //
162 5cdb1798 2005-10-29 devnull static char*
163 5cdb1798 2005-10-29 devnull _readmbox(Mailbox *mb, int doplumb, Mlock *lk)
164 5cdb1798 2005-10-29 devnull {
165 5cdb1798 2005-10-29 devnull int fd;
166 5cdb1798 2005-10-29 devnull String *tmp;
167 5cdb1798 2005-10-29 devnull Dir *d;
168 5cdb1798 2005-10-29 devnull static char err[128];
169 5cdb1798 2005-10-29 devnull Message *m, **l;
170 5cdb1798 2005-10-29 devnull Inbuf *inb;
171 5cdb1798 2005-10-29 devnull char *x;
172 5cdb1798 2005-10-29 devnull
173 5cdb1798 2005-10-29 devnull l = &mb->root->part;
174 5cdb1798 2005-10-29 devnull
175 5cdb1798 2005-10-29 devnull /*
176 5cdb1798 2005-10-29 devnull * open the mailbox. If it doesn't exist, try the temporary one.
177 5cdb1798 2005-10-29 devnull */
178 5cdb1798 2005-10-29 devnull retry:
179 5cdb1798 2005-10-29 devnull fd = open(mb->path, OREAD);
180 5cdb1798 2005-10-29 devnull if(fd < 0){
181 5cdb1798 2005-10-29 devnull errstr(err, sizeof(err));
182 5cdb1798 2005-10-29 devnull if(strstr(err, "exist") != 0){
183 5cdb1798 2005-10-29 devnull tmp = s_copy(mb->path);
184 5cdb1798 2005-10-29 devnull s_append(tmp, ".tmp");
185 5cdb1798 2005-10-29 devnull if(sysrename(s_to_c(tmp), mb->path) == 0){
186 5cdb1798 2005-10-29 devnull s_free(tmp);
187 5cdb1798 2005-10-29 devnull goto retry;
188 5cdb1798 2005-10-29 devnull }
189 5cdb1798 2005-10-29 devnull s_free(tmp);
190 5cdb1798 2005-10-29 devnull }
191 5cdb1798 2005-10-29 devnull return err;
192 5cdb1798 2005-10-29 devnull }
193 5cdb1798 2005-10-29 devnull
194 5cdb1798 2005-10-29 devnull /*
195 5cdb1798 2005-10-29 devnull * a new qid.path means reread the mailbox, while
196 5cdb1798 2005-10-29 devnull * a new qid.vers means read any new messages
197 5cdb1798 2005-10-29 devnull */
198 5cdb1798 2005-10-29 devnull d = dirfstat(fd);
199 5cdb1798 2005-10-29 devnull if(d == nil){
200 5cdb1798 2005-10-29 devnull close(fd);
201 5cdb1798 2005-10-29 devnull errstr(err, sizeof(err));
202 5cdb1798 2005-10-29 devnull return err;
203 5cdb1798 2005-10-29 devnull }
204 5cdb1798 2005-10-29 devnull if(mb->d != nil){
205 5cdb1798 2005-10-29 devnull if(d->qid.path == mb->d->qid.path && d->qid.vers == mb->d->qid.vers){
206 5cdb1798 2005-10-29 devnull close(fd);
207 5cdb1798 2005-10-29 devnull free(d);
208 5cdb1798 2005-10-29 devnull return nil;
209 5cdb1798 2005-10-29 devnull }
210 5cdb1798 2005-10-29 devnull if(d->qid.path == mb->d->qid.path){
211 5cdb1798 2005-10-29 devnull while(*l != nil)
212 5cdb1798 2005-10-29 devnull l = &(*l)->next;
213 5cdb1798 2005-10-29 devnull seek(fd, mb->d->length, 0);
214 5cdb1798 2005-10-29 devnull }
215 5cdb1798 2005-10-29 devnull free(mb->d);
216 5cdb1798 2005-10-29 devnull }
217 5cdb1798 2005-10-29 devnull mb->d = d;
218 5cdb1798 2005-10-29 devnull mb->vers++;
219 5cdb1798 2005-10-29 devnull henter(PATH(0, Qtop), mb->name,
220 5cdb1798 2005-10-29 devnull (Qid){PATH(mb->id, Qmbox), mb->vers, QTDIR}, nil, mb);
221 5cdb1798 2005-10-29 devnull
222 5cdb1798 2005-10-29 devnull inb = emalloc(sizeof(Inbuf));
223 5cdb1798 2005-10-29 devnull inb->rptr = inb->wptr = inb->data;
224 5cdb1798 2005-10-29 devnull inb->fd = fd;
225 5cdb1798 2005-10-29 devnull
226 5cdb1798 2005-10-29 devnull // read new messages
227 5cdb1798 2005-10-29 devnull snprint(err, sizeof err, "reading '%s'", mb->path);
228 5cdb1798 2005-10-29 devnull logmsg(err, nil);
229 5cdb1798 2005-10-29 devnull for(;;){
230 5cdb1798 2005-10-29 devnull if(lk != nil)
231 5cdb1798 2005-10-29 devnull syslockrefresh(lk);
232 5cdb1798 2005-10-29 devnull m = newmessage(mb->root);
233 5cdb1798 2005-10-29 devnull m->mallocd = 1;
234 5cdb1798 2005-10-29 devnull m->inmbox = 1;
235 5cdb1798 2005-10-29 devnull if(readmessage(m, inb) < 0){
236 5cdb1798 2005-10-29 devnull delmessage(mb, m);
237 5cdb1798 2005-10-29 devnull mb->root->subname--;
238 5cdb1798 2005-10-29 devnull break;
239 5cdb1798 2005-10-29 devnull }
240 5cdb1798 2005-10-29 devnull
241 5cdb1798 2005-10-29 devnull // merge mailbox versions
242 5cdb1798 2005-10-29 devnull while(*l != nil){
243 5cdb1798 2005-10-29 devnull if(memcmp((*l)->digest, m->digest, SHA1dlen) == 0){
244 5cdb1798 2005-10-29 devnull // matches mail we already read, discard
245 5cdb1798 2005-10-29 devnull logmsg("duplicate", *l);
246 5cdb1798 2005-10-29 devnull delmessage(mb, m);
247 5cdb1798 2005-10-29 devnull mb->root->subname--;
248 5cdb1798 2005-10-29 devnull m = nil;
249 5cdb1798 2005-10-29 devnull l = &(*l)->next;
250 5cdb1798 2005-10-29 devnull break;
251 5cdb1798 2005-10-29 devnull } else {
252 5cdb1798 2005-10-29 devnull // old mail no longer in box, mark deleted
253 5cdb1798 2005-10-29 devnull logmsg("disappeared", *l);
254 5cdb1798 2005-10-29 devnull if(doplumb)
255 5cdb1798 2005-10-29 devnull mailplumb(mb, *l, 1);
256 5cdb1798 2005-10-29 devnull (*l)->inmbox = 0;
257 5cdb1798 2005-10-29 devnull (*l)->deleted = 1;
258 5cdb1798 2005-10-29 devnull l = &(*l)->next;
259 5cdb1798 2005-10-29 devnull }
260 5cdb1798 2005-10-29 devnull }
261 5cdb1798 2005-10-29 devnull if(m == nil)
262 5cdb1798 2005-10-29 devnull continue;
263 5cdb1798 2005-10-29 devnull
264 5cdb1798 2005-10-29 devnull x = strchr(m->start, '\n');
265 5cdb1798 2005-10-29 devnull if(x == nil)
266 5cdb1798 2005-10-29 devnull m->header = m->end;
267 5cdb1798 2005-10-29 devnull else
268 5cdb1798 2005-10-29 devnull m->header = x + 1;
269 5cdb1798 2005-10-29 devnull m->mheader = m->mhend = m->header;
270 5cdb1798 2005-10-29 devnull parseunix(m);
271 5cdb1798 2005-10-29 devnull parse(m, 0, mb, 0);
272 5cdb1798 2005-10-29 devnull logmsg("new", m);
273 5cdb1798 2005-10-29 devnull
274 5cdb1798 2005-10-29 devnull /* chain in */
275 5cdb1798 2005-10-29 devnull *l = m;
276 5cdb1798 2005-10-29 devnull l = &m->next;
277 5cdb1798 2005-10-29 devnull if(doplumb)
278 5cdb1798 2005-10-29 devnull mailplumb(mb, m, 0);
279 5cdb1798 2005-10-29 devnull
280 5cdb1798 2005-10-29 devnull }
281 5cdb1798 2005-10-29 devnull logmsg("mbox read", nil);
282 5cdb1798 2005-10-29 devnull
283 5cdb1798 2005-10-29 devnull // whatever is left has been removed from the mbox, mark deleted
284 5cdb1798 2005-10-29 devnull while(*l != nil){
285 5cdb1798 2005-10-29 devnull if(doplumb)
286 5cdb1798 2005-10-29 devnull mailplumb(mb, *l, 1);
287 5cdb1798 2005-10-29 devnull (*l)->inmbox = 0;
288 5cdb1798 2005-10-29 devnull (*l)->deleted = 1;
289 5cdb1798 2005-10-29 devnull l = &(*l)->next;
290 5cdb1798 2005-10-29 devnull }
291 5cdb1798 2005-10-29 devnull
292 5cdb1798 2005-10-29 devnull close(fd);
293 5cdb1798 2005-10-29 devnull free(inb);
294 5cdb1798 2005-10-29 devnull return nil;
295 5cdb1798 2005-10-29 devnull }
296 5cdb1798 2005-10-29 devnull
297 5cdb1798 2005-10-29 devnull static void
298 5cdb1798 2005-10-29 devnull _writembox(Mailbox *mb, Mlock *lk)
299 5cdb1798 2005-10-29 devnull {
300 5cdb1798 2005-10-29 devnull Dir *d;
301 5cdb1798 2005-10-29 devnull Message *m;
302 5cdb1798 2005-10-29 devnull String *tmp;
303 5cdb1798 2005-10-29 devnull int mode, errs;
304 5cdb1798 2005-10-29 devnull Biobuf *b;
305 5cdb1798 2005-10-29 devnull
306 5cdb1798 2005-10-29 devnull tmp = s_copy(mb->path);
307 5cdb1798 2005-10-29 devnull s_append(tmp, ".tmp");
308 5cdb1798 2005-10-29 devnull
309 5cdb1798 2005-10-29 devnull /*
310 5cdb1798 2005-10-29 devnull * preserve old files permissions, if possible
311 5cdb1798 2005-10-29 devnull */
312 5cdb1798 2005-10-29 devnull d = dirstat(mb->path);
313 5cdb1798 2005-10-29 devnull if(d != nil){
314 5cdb1798 2005-10-29 devnull mode = d->mode&0777;
315 5cdb1798 2005-10-29 devnull free(d);
316 5cdb1798 2005-10-29 devnull } else
317 5cdb1798 2005-10-29 devnull mode = MBOXMODE;
318 5cdb1798 2005-10-29 devnull
319 5cdb1798 2005-10-29 devnull sysremove(s_to_c(tmp));
320 5cdb1798 2005-10-29 devnull b = sysopen(s_to_c(tmp), "alc", mode);
321 5cdb1798 2005-10-29 devnull if(b == 0){
322 5cdb1798 2005-10-29 devnull fprint(2, "can't write temporary mailbox %s: %r\n", s_to_c(tmp));
323 5cdb1798 2005-10-29 devnull return;
324 5cdb1798 2005-10-29 devnull }
325 5cdb1798 2005-10-29 devnull
326 5cdb1798 2005-10-29 devnull logmsg("writing new mbox", nil);
327 5cdb1798 2005-10-29 devnull errs = 0;
328 5cdb1798 2005-10-29 devnull for(m = mb->root->part; m != nil; m = m->next){
329 5cdb1798 2005-10-29 devnull if(lk != nil)
330 5cdb1798 2005-10-29 devnull syslockrefresh(lk);
331 5cdb1798 2005-10-29 devnull if(m->deleted)
332 5cdb1798 2005-10-29 devnull continue;
333 5cdb1798 2005-10-29 devnull logmsg("writing", m);
334 5cdb1798 2005-10-29 devnull if(Bwrite(b, m->start, m->end - m->start) < 0)
335 5cdb1798 2005-10-29 devnull errs = 1;
336 5cdb1798 2005-10-29 devnull if(Bwrite(b, "\n", 1) < 0)
337 5cdb1798 2005-10-29 devnull errs = 1;
338 5cdb1798 2005-10-29 devnull }
339 5cdb1798 2005-10-29 devnull logmsg("wrote new mbox", nil);
340 5cdb1798 2005-10-29 devnull
341 5cdb1798 2005-10-29 devnull if(sysclose(b) < 0)
342 5cdb1798 2005-10-29 devnull errs = 1;
343 5cdb1798 2005-10-29 devnull
344 5cdb1798 2005-10-29 devnull if(errs){
345 5cdb1798 2005-10-29 devnull fprint(2, "error writing temporary mail file\n");
346 5cdb1798 2005-10-29 devnull s_free(tmp);
347 5cdb1798 2005-10-29 devnull return;
348 5cdb1798 2005-10-29 devnull }
349 5cdb1798 2005-10-29 devnull
350 5cdb1798 2005-10-29 devnull sysremove(mb->path);
351 5cdb1798 2005-10-29 devnull if(sysrename(s_to_c(tmp), mb->path) < 0)
352 5cdb1798 2005-10-29 devnull fprint(2, "%s: can't rename %s to %s: %r\n", argv0,
353 5cdb1798 2005-10-29 devnull s_to_c(tmp), mb->path);
354 5cdb1798 2005-10-29 devnull s_free(tmp);
355 5cdb1798 2005-10-29 devnull if(mb->d != nil)
356 5cdb1798 2005-10-29 devnull free(mb->d);
357 5cdb1798 2005-10-29 devnull mb->d = dirstat(mb->path);
358 5cdb1798 2005-10-29 devnull }
359 5cdb1798 2005-10-29 devnull
360 5cdb1798 2005-10-29 devnull char*
361 5cdb1798 2005-10-29 devnull plan9syncmbox(Mailbox *mb, int doplumb)
362 5cdb1798 2005-10-29 devnull {
363 5cdb1798 2005-10-29 devnull Mlock *lk;
364 5cdb1798 2005-10-29 devnull char *rv;
365 5cdb1798 2005-10-29 devnull
366 5cdb1798 2005-10-29 devnull lk = nil;
367 5cdb1798 2005-10-29 devnull if(mb->dolock){
368 5cdb1798 2005-10-29 devnull lk = syslock(mb->path);
369 5cdb1798 2005-10-29 devnull if(lk == nil)
370 5cdb1798 2005-10-29 devnull return "can't lock mailbox";
371 5cdb1798 2005-10-29 devnull }
372 5cdb1798 2005-10-29 devnull
373 5cdb1798 2005-10-29 devnull rv = _readmbox(mb, doplumb, lk); /* interpolate */
374 5cdb1798 2005-10-29 devnull if(purgedeleted(mb) > 0)
375 5cdb1798 2005-10-29 devnull _writembox(mb, lk);
376 5cdb1798 2005-10-29 devnull
377 5cdb1798 2005-10-29 devnull if(lk != nil)
378 5cdb1798 2005-10-29 devnull sysunlock(lk);
379 5cdb1798 2005-10-29 devnull
380 5cdb1798 2005-10-29 devnull return rv;
381 5cdb1798 2005-10-29 devnull }
382 5cdb1798 2005-10-29 devnull
383 5cdb1798 2005-10-29 devnull //
384 5cdb1798 2005-10-29 devnull // look to see if we can open this mail box
385 5cdb1798 2005-10-29 devnull //
386 5cdb1798 2005-10-29 devnull char*
387 5cdb1798 2005-10-29 devnull plan9mbox(Mailbox *mb, char *path)
388 5cdb1798 2005-10-29 devnull {
389 5cdb1798 2005-10-29 devnull static char err[64];
390 5cdb1798 2005-10-29 devnull String *tmp;
391 5cdb1798 2005-10-29 devnull
392 5cdb1798 2005-10-29 devnull if(access(path, AEXIST) < 0){
393 5cdb1798 2005-10-29 devnull errstr(err, sizeof(err));
394 5cdb1798 2005-10-29 devnull tmp = s_copy(path);
395 5cdb1798 2005-10-29 devnull s_append(tmp, ".tmp");
396 5cdb1798 2005-10-29 devnull if(access(s_to_c(tmp), AEXIST) < 0){
397 5cdb1798 2005-10-29 devnull s_free(tmp);
398 5cdb1798 2005-10-29 devnull return err;
399 5cdb1798 2005-10-29 devnull }
400 5cdb1798 2005-10-29 devnull s_free(tmp);
401 5cdb1798 2005-10-29 devnull }
402 5cdb1798 2005-10-29 devnull
403 5cdb1798 2005-10-29 devnull mb->sync = plan9syncmbox;
404 5cdb1798 2005-10-29 devnull return nil;
405 5cdb1798 2005-10-29 devnull }