diff options
Diffstat (limited to 'sys/src/cmd/upas/fs/planb.c')
-rw-r--r-- | sys/src/cmd/upas/fs/planb.c | 144 |
1 files changed, 87 insertions, 57 deletions
diff --git a/sys/src/cmd/upas/fs/planb.c b/sys/src/cmd/upas/fs/planb.c index 58dfe1622..fbe2ac251 100644 --- a/sys/src/cmd/upas/fs/planb.c +++ b/sys/src/cmd/upas/fs/planb.c @@ -15,12 +15,37 @@ #include <libsec.h> #include "dat.h" +static char* +parseunix(Message *m) +{ + char *s, *p, *q; + int l; + Tm tm; + + l = m->header - m->start; + m->unixheader = smprint("%.*s", l, m->start); + s = m->start + 5; + if((p = strchr(s, ' ')) == nil) + return s; + *p = 0; + m->unixfrom = strdup(s); + *p++ = ' '; + if(q = strchr(p, '\n')) + *q = 0; + if(strtotm(p, &tm) < 0) + return p; + if(q) + *q = '\n'; + m->fileid = (uvlong)tm2sec(&tm) << 8; + return 0; +} + static int readmessage(Message *m, char *msg) { - int fd, i, n; + int fd, n; char *buf, *name, *p; - char hdr[128], sdigest[SHA1dlen*2+1]; + char hdr[128]; Dir *d; buf = nil; @@ -29,8 +54,10 @@ readmessage(Message *m, char *msg) if(name == nil) return -1; if(m->filename != nil) - s_free(m->filename); - m->filename = s_copy(name); + free(m->filename); + m->filename = strdup(name); + if(m->filename == nil) + sysfatal("malloc: %r"); fd = open(name, OREAD); if(fd < 0) goto Fail; @@ -75,10 +102,7 @@ readmessage(Message *m, char *msg) m->end--; *m->end = 0; m->bend = m->rbend = m->end; - sha1((uchar*)m->start, m->end - m->start, m->digest, nil); - for(i = 0; i < SHA1dlen; i++) - sprint(sdigest+2*i, "%2.2ux", m->digest[i]); - m->sdigest = s_copy(sdigest); + return 0; Fail: if(fd >= 0) @@ -98,7 +122,7 @@ archive(Message *m) char *dir, *p, *nname; Dir d; - dir = strdup(s_to_c(m->filename)); + dir = strdup(m->filename); nname = nil; if(dir == nil) return; @@ -162,21 +186,20 @@ mustshow(char* name) } static int -readpbmessage(Mailbox *mb, char *msg, int doplumb) +readpbmessage(Mailbox *mb, char *msg, int doplumb, int *nnew) { Message *m, **l; - char *x; + char *x, *p; m = newmessage(mb->root); m->mallocd = 1; m->inmbox = 1; if(readmessage(m, msg) < 0){ - delmessage(mb, m); - mb->root->subname--; + unnewmessage(mb, mb->root, m); return -1; } for(l = &mb->root->part; *l != nil; l = &(*l)->next) - if(strcmp(s_to_c((*l)->filename), s_to_c(m->filename)) == 0 && + if(strcmp((*l)->filename, m->filename) == 0 && *l != m){ if((*l)->deleted < 0) (*l)->deleted = 0; @@ -184,15 +207,19 @@ readpbmessage(Mailbox *mb, char *msg, int doplumb) mb->root->subname--; return -1; } - x = strchr(m->start, '\n'); - if(x == nil) - m->header = m->end; - else + m->header = m->end; + if(x = strchr(m->start, '\n')) m->header = x + 1; + if(p = parseunix(m)) + sysfatal("%s:%s naked From in body? [%s]", mb->path, (*l)->filename, p); m->mheader = m->mhend = m->header; - parseunix(m); - parse(m, 0, mb, 0); - logmsg("new", m); + parse(mb, m, 0, 0); + if(m != *l && m->deleted != Dup){ + logmsg(m, "new"); + newcachehash(mb, m, doplumb); + putcache(mb, m); + nnew[0]++; + } /* chain in */ *l = m; @@ -215,17 +242,18 @@ dcmp(Dir *a, Dir *b) return strcmp(an, bn); } -static void -readpbmbox(Mailbox *mb, int doplumb) +static char* +readpbmbox(Mailbox *mb, int doplumb, int *new) { - int fd, i, j, nd, nmd; char *month, *msg; + int fd, i, j, nd, nmd; Dir *d, *md; + static char err[ERRMAX]; fd = open(mb->path, OREAD); if(fd < 0){ - fprint(2, "%s: %s: %r\n", argv0, mb->path); - return; + errstr(err, sizeof err); + return err; } nd = dirreadall(fd, &d); close(fd); @@ -249,7 +277,7 @@ readpbmbox(Mailbox *mb, int doplumb) for(j = 0; j < nmd; j++) if(mustshow(md[j].name)){ msg = smprint("%s/%s", month, md[j].name); - readpbmessage(mb, msg, doplumb); + readpbmessage(mb, msg, doplumb, new); free(msg); } } @@ -259,45 +287,45 @@ readpbmbox(Mailbox *mb, int doplumb) md = nil; } free(d); + return nil; } -static void -readpbvmbox(Mailbox *mb, int doplumb) +static char* +readpbvmbox(Mailbox *mb, int doplumb, int *new) { + char *data, *ln, *p, *nln, *msg; int fd, nr; long sz; - char *data, *ln, *p, *nln, *msg; Dir *d; + static char err[ERRMAX]; fd = open(mb->path, OREAD); if(fd < 0){ - fprint(2, "%s: %s: %r\n", argv0, mb->path); - return; + errstr(err, sizeof err); + return err; } d = dirfstat(fd); if(d == nil){ - fprint(2, "%s: %s: %r\n", argv0, mb->path); - close(fd); - return; + errstr(err, sizeof err); + return err; } sz = d->length; free(d); if(sz > 2 * 1024 * 1024){ sz = 2 * 1024 * 1024; - fprint(2, "%s: %s: bug: folder too big\n", argv0, mb->path); + fprint(2, "upas/fs: %s: bug: folder too big\n", mb->path); } data = malloc(sz+1); if(data == nil){ - close(fd); - fprint(2, "%s: no memory\n", argv0); - return; + errstr(err, sizeof err); + return err; } nr = readn(fd, data, sz); close(fd); if(nr < 0){ - fprint(2, "%s: %s: %r\n", argv0, mb->path); + errstr(err, sizeof err); free(data); - return; + return err; } data[nr] = 0; @@ -318,22 +346,24 @@ readpbvmbox(Mailbox *mb, int doplumb) *p = 0; msg = smprint("/mail/box/%s/msgs/%s", user, ln); if(msg == nil){ - fprint(2, "%s: no memory\n", argv0); + fprint(2, "upas/fs: malloc: %r\n"); continue; } - readpbmessage(mb, msg, doplumb); + readpbmessage(mb, msg, doplumb, new); free(msg); } free(data); + return nil; } static char* -readmbox(Mailbox *mb, int doplumb, int virt) +readmbox(Mailbox *mb, int doplumb, int virt, int *new) { + char *mberr; int fd; Dir *d; Message *m; - static char err[Errlen]; + static char err[128]; if(debug) fprint(2, "read mbox %s\n", mb->path); @@ -364,45 +394,45 @@ readmbox(Mailbox *mb, int doplumb, int virt) henter(PATH(0, Qtop), mb->name, (Qid){PATH(mb->id, Qmbox), mb->vers, QTDIR}, nil, mb); snprint(err, sizeof err, "reading '%s'", mb->path); - logmsg(err, nil); + logmsg(nil, err, nil); for(m = mb->root->part; m != nil; m = m->next) if(m->deleted == 0) m->deleted = -1; if(virt == 0) - readpbmbox(mb, doplumb); + mberr = readpbmbox(mb, doplumb, new); else - readpbvmbox(mb, doplumb); + mberr = readpbvmbox(mb, doplumb, new); /* * messages removed from the mbox; flag them to go. */ for(m = mb->root->part; m != nil; m = m->next) if(m->deleted < 0 && doplumb){ - m->inmbox = 0; - m->deleted = 1; - mailplumb(mb, m, 1); + delmessage(mb, m); + if(doplumb) + mailplumb(mb, m, 1); } - logmsg("mbox read", nil); - return nil; + logmsg(nil, "mbox read"); + return mberr; } static char* -mbsync(Mailbox *mb, int doplumb) +mbsync(Mailbox *mb, int doplumb, int *new) { char *rv; - rv = readmbox(mb, doplumb, 0); + rv = readmbox(mb, doplumb, 0, new); purgembox(mb, 0); return rv; } static char* -mbvsync(Mailbox *mb, int doplumb) +mbvsync(Mailbox *mb, int doplumb, int *new) { char *rv; - rv = readmbox(mb, doplumb, 1); + rv = readmbox(mb, doplumb, 1, new); purgembox(mb, 1); return rv; } |