This commit is contained in:
cinap_lenrek 2017-06-22 20:48:14 +02:00
commit e2ca58cb3e
5 changed files with 32 additions and 23 deletions

View file

@ -375,7 +375,8 @@ static char *itab[] = {
"idx", "idx",
"stale", "stale",
"header", "header",
"body" "body",
"new",
}; };
char* char*

View file

@ -6,6 +6,7 @@ enum {
Cidxstale = 1<<1, Cidxstale = 1<<1,
Cheader = 1<<2, Cheader = 1<<2,
Cbody = 1<<3, Cbody = 1<<3,
Cnew = 1<<4,
/* encodings */ /* encodings */
Enone= 0, Enone= 0,
@ -65,8 +66,8 @@ struct Idx {
char *idxaux; /* mailbox specific */ char *idxaux; /* mailbox specific */
char *type; /* mime info */ char *type; /* mime info */
char disposition;
char *filename; char *filename;
char disposition;
int nparts; int nparts;
}; };
@ -117,9 +118,9 @@ struct Message {
/* mime info */ /* mime info */
char *charset; char *charset;
char encoding;
char *boundary; char *boundary;
char converted; char converted;
char encoding;
char decoded; char decoded;
char mimeflag; char mimeflag;
@ -208,7 +209,7 @@ void putcache(Mailbox*, Message*); /* asymmetricial */
long cachefree(Mailbox*, Message*, int); long cachefree(Mailbox*, Message*, int);
Message* gettopmsg(Mailbox*, Message*); Message* gettopmsg(Mailbox*, Message*);
char* syncmbox(Mailbox*); char* syncmbox(Mailbox*, int);
void* emalloc(ulong); void* emalloc(ulong);
void* erealloc(void*, ulong); void* erealloc(void*, ulong);
Message* newmessage(Message*); Message* newmessage(Message*);

View file

@ -1008,7 +1008,7 @@ readmboxdir(Fid *f, uchar *buf, long off, int cnt, int blen)
Message *msg; Message *msg;
if(off == 0) if(off == 0)
syncmbox(f->mb); syncmbox(f->mb, 1);
n = 0; n = 0;
if(f->mb->ctl){ if(f->mb->ctl){
@ -1343,7 +1343,7 @@ rstat(Fid *f)
Dir d; Dir d;
if(FILE(f->qid.path) == Qmbox) if(FILE(f->qid.path) == Qmbox)
syncmbox(f->mb); syncmbox(f->mb, 1);
mkstat(&d, f->mb, f->m, FILE(f->qid.path)); mkstat(&d, f->mb, f->m, FILE(f->qid.path));
rhdr.nstat = convD2M(&d, mbuf, messagesize - IOHDRSZ); rhdr.nstat = convD2M(&d, mbuf, messagesize - IOHDRSZ);
rhdr.stat = mbuf; rhdr.stat = mbuf;
@ -1465,7 +1465,7 @@ reader(void)
} }
} }
if(mb != nil) { if(mb != nil) {
syncmbox(mb); syncmbox(mb, 1);
qunlock(&synclock); qunlock(&synclock);
} else { } else {
qunlock(&synclock); qunlock(&synclock);

View file

@ -383,7 +383,6 @@ dead:
m->cstate |= Cidx; m->cstate |= Cidx;
idprint("→%.2ux\n", m->cstate); idprint("→%.2ux\n", m->cstate);
free(s); free(s);
// s = 0;
continue; continue;
} }
m = newmessage(parent); m = newmessage(parent);
@ -412,7 +411,7 @@ dead:
m->nparts = strtoul(f[21], 0, 0); m->nparts = strtoul(f[21], 0, 0);
m->cstate &= ~Cidxstale; m->cstate &= ~Cidxstale;
m->cstate |= Cidx; m->cstate |= Cidx|Cnew;
m->str = s; m->str = s;
s = 0; s = 0;

View file

@ -62,7 +62,7 @@ static void mailplumb(Mailbox*, Message*);
* do we want to plumb flag changes? * do we want to plumb flag changes?
*/ */
char* char*
syncmbox(Mailbox *mb) syncmbox(Mailbox *mb, int doplumb)
{ {
char *s; char *s;
int n, d, y, a; int n, d, y, a;
@ -83,13 +83,20 @@ syncmbox(Mailbox *mb)
y = 0; y = 0;
for(m = mb->root->part; m; m = next){ for(m = mb->root->part; m; m = next){
next = m->next; next = m->next;
if((m->cstate & Cidx) == 0 && m->deleted == 0){ if(m->deleted == 0){
cachehash(mb, m); if((m->cstate & Cidx) == 0){
if(insurecache(mb, m) == 0){ cachehash(mb, m);
mailplumb(mb, m); m->cstate |= Cnew;
msgdecref(mb, m); n++;
} else if(!doplumb)
m->cstate &= ~Cnew;
if(m->cstate & Cnew){
if(insurecache(mb, m) == 0){
mailplumb(mb, m);
msgdecref(mb, m);
}
m->cstate &= ~Cnew;
} }
n++;
} }
if(m->cstate & Cidxstale) if(m->cstate & Cidxstale)
y++; y++;
@ -98,7 +105,8 @@ syncmbox(Mailbox *mb)
if(mb->delete && m->inmbox && m->deleted & Deleted) if(mb->delete && m->inmbox && m->deleted & Deleted)
mb->delete(mb, m); mb->delete(mb, m);
if(!m->inmbox){ if(!m->inmbox){
mailplumb(mb, m); if(doplumb)
mailplumb(mb, m);
delmessage(mb, m); delmessage(mb, m);
d++; d++;
} }
@ -253,7 +261,7 @@ newmbox(char *path, char *name, int flags, Mailbox **r)
if(r) if(r)
*r = mb; *r = mb;
return syncmbox(mb); return syncmbox(mb, 0);
} }
/* close the named mailbox */ /* close the named mailbox */
@ -279,7 +287,7 @@ syncallmboxes(void)
Mailbox *m; Mailbox *m;
for(m = mbl; m != nil; m = m->next) for(m = mbl; m != nil; m = m->next)
if(err = syncmbox(m)) if(err = syncmbox(m, 0))
eprint("syncmbox: %s\n", err); eprint("syncmbox: %s\n", err);
} }
@ -1070,7 +1078,7 @@ delmessages(int ac, char **av)
break; break;
} }
if(needwrite) if(needwrite)
syncmbox(mb); syncmbox(mb, 1);
return 0; return 0;
} }
@ -1100,7 +1108,7 @@ flagmessages(int argc, char **argv)
needwrite = 1; needwrite = 1;
} }
if(needwrite) if(needwrite)
syncmbox(mb); syncmbox(mb, 1);
return rerr; return rerr;
} }
@ -1117,7 +1125,7 @@ msgdecref(Mailbox *mb, Message *m)
m->refs--; m->refs--;
if(m->refs == 0){ if(m->refs == 0){
if(m->deleted) if(m->deleted)
syncmbox(mb); syncmbox(mb, 1);
else else
putcache(mb, m); putcache(mb, m);
} }
@ -1149,7 +1157,7 @@ mboxdecref(Mailbox *mb)
assert(mb->refs > 0); assert(mb->refs > 0);
mb->refs--; mb->refs--;
if(mb->refs == 0){ if(mb->refs == 0){
syncmbox(mb); syncmbox(mb, 1);
delmessage(mb, mb->root); delmessage(mb, mb->root);
if(mb->ctl) if(mb->ctl)
hfree(PATH(mb->id, Qmbox), "ctl"); hfree(PATH(mb->id, Qmbox), "ctl");