17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
4*9a747e4fSDavid du Colombier #include <auth.h>
57dd7cddfSDavid du Colombier #include "imap4d.h"
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier /*
87dd7cddfSDavid du Colombier * iterated over all of the items in the message set.
97dd7cddfSDavid du Colombier * errors are accumulated, but processing continues.
107dd7cddfSDavid du Colombier * if uids, then ignore non-existent messages.
117dd7cddfSDavid du Colombier * otherwise, that's an error
127dd7cddfSDavid du Colombier */
137dd7cddfSDavid du Colombier int
forMsgs(Box * box,MsgSet * ms,ulong max,int uids,int (* f)(Box *,Msg *,int,void *),void * rock)147dd7cddfSDavid du Colombier forMsgs(Box *box, MsgSet *ms, ulong max, int uids, int (*f)(Box*, Msg*, int, void*), void *rock)
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier Msg *m;
177dd7cddfSDavid du Colombier ulong id;
187dd7cddfSDavid du Colombier int ok, rok;
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier ok = 1;
217dd7cddfSDavid du Colombier for(; ms != nil; ms = ms->next){
227dd7cddfSDavid du Colombier id = ms->from;
237dd7cddfSDavid du Colombier rok = 0;
247dd7cddfSDavid du Colombier for(m = box->msgs; m != nil && m->seq <= max; m = m->next){
257dd7cddfSDavid du Colombier if(!uids && m->seq > id
267dd7cddfSDavid du Colombier || uids && m->uid > ms->to)
277dd7cddfSDavid du Colombier break;
287dd7cddfSDavid du Colombier if(!uids && m->seq == id
297dd7cddfSDavid du Colombier || uids && m->uid >= id){
307dd7cddfSDavid du Colombier if(!(*f)(box, m, uids, rock))
317dd7cddfSDavid du Colombier ok = 0;
327dd7cddfSDavid du Colombier if(uids)
337dd7cddfSDavid du Colombier id = m->uid;
347dd7cddfSDavid du Colombier if(id >= ms->to){
357dd7cddfSDavid du Colombier rok = 1;
367dd7cddfSDavid du Colombier break;
377dd7cddfSDavid du Colombier }
387dd7cddfSDavid du Colombier if(ms->to == ~0UL)
397dd7cddfSDavid du Colombier rok = 1;
407dd7cddfSDavid du Colombier id++;
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier }
437dd7cddfSDavid du Colombier if(!uids && !rok)
447dd7cddfSDavid du Colombier ok = 0;
457dd7cddfSDavid du Colombier }
467dd7cddfSDavid du Colombier return ok;
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier
497dd7cddfSDavid du Colombier Store *
mkStore(int sign,int op,int flags)507dd7cddfSDavid du Colombier mkStore(int sign, int op, int flags)
517dd7cddfSDavid du Colombier {
527dd7cddfSDavid du Colombier Store *st;
537dd7cddfSDavid du Colombier
5480ee5cbfSDavid du Colombier st = binalloc(&parseBin, sizeof(Store), 1);
557dd7cddfSDavid du Colombier if(st == nil)
567dd7cddfSDavid du Colombier parseErr("out of memory");
577dd7cddfSDavid du Colombier st->sign = sign;
587dd7cddfSDavid du Colombier st->op = op;
597dd7cddfSDavid du Colombier st->flags = flags;
607dd7cddfSDavid du Colombier return st;
617dd7cddfSDavid du Colombier }
627dd7cddfSDavid du Colombier
637dd7cddfSDavid du Colombier Fetch *
mkFetch(int op,Fetch * next)647dd7cddfSDavid du Colombier mkFetch(int op, Fetch *next)
657dd7cddfSDavid du Colombier {
667dd7cddfSDavid du Colombier Fetch *f;
677dd7cddfSDavid du Colombier
6880ee5cbfSDavid du Colombier f = binalloc(&parseBin, sizeof(Fetch), 1);
697dd7cddfSDavid du Colombier if(f == nil)
707dd7cddfSDavid du Colombier parseErr("out of memory");
717dd7cddfSDavid du Colombier f->op = op;
727dd7cddfSDavid du Colombier f->next = next;
737dd7cddfSDavid du Colombier return f;
747dd7cddfSDavid du Colombier }
757dd7cddfSDavid du Colombier
767dd7cddfSDavid du Colombier Fetch*
revFetch(Fetch * f)777dd7cddfSDavid du Colombier revFetch(Fetch *f)
787dd7cddfSDavid du Colombier {
797dd7cddfSDavid du Colombier Fetch *last, *next;
807dd7cddfSDavid du Colombier
817dd7cddfSDavid du Colombier last = nil;
827dd7cddfSDavid du Colombier for(; f != nil; f = next){
837dd7cddfSDavid du Colombier next = f->next;
847dd7cddfSDavid du Colombier f->next = last;
857dd7cddfSDavid du Colombier last = f;
867dd7cddfSDavid du Colombier }
877dd7cddfSDavid du Colombier return last;
887dd7cddfSDavid du Colombier }
897dd7cddfSDavid du Colombier
907dd7cddfSDavid du Colombier NList*
mkNList(ulong n,NList * next)917dd7cddfSDavid du Colombier mkNList(ulong n, NList *next)
927dd7cddfSDavid du Colombier {
937dd7cddfSDavid du Colombier NList *nl;
947dd7cddfSDavid du Colombier
9580ee5cbfSDavid du Colombier nl = binalloc(&parseBin, sizeof(NList), 0);
967dd7cddfSDavid du Colombier if(nl == nil)
977dd7cddfSDavid du Colombier parseErr("out of memory");
987dd7cddfSDavid du Colombier nl->n = n;
997dd7cddfSDavid du Colombier nl->next = next;
1007dd7cddfSDavid du Colombier return nl;
1017dd7cddfSDavid du Colombier }
1027dd7cddfSDavid du Colombier
1037dd7cddfSDavid du Colombier NList*
revNList(NList * nl)1047dd7cddfSDavid du Colombier revNList(NList *nl)
1057dd7cddfSDavid du Colombier {
1067dd7cddfSDavid du Colombier NList *last, *next;
1077dd7cddfSDavid du Colombier
1087dd7cddfSDavid du Colombier last = nil;
1097dd7cddfSDavid du Colombier for(; nl != nil; nl = next){
1107dd7cddfSDavid du Colombier next = nl->next;
1117dd7cddfSDavid du Colombier nl->next = last;
1127dd7cddfSDavid du Colombier last = nl;
1137dd7cddfSDavid du Colombier }
1147dd7cddfSDavid du Colombier return last;
1157dd7cddfSDavid du Colombier }
1167dd7cddfSDavid du Colombier
1177dd7cddfSDavid du Colombier SList*
mkSList(char * s,SList * next)1187dd7cddfSDavid du Colombier mkSList(char *s, SList *next)
1197dd7cddfSDavid du Colombier {
1207dd7cddfSDavid du Colombier SList *sl;
1217dd7cddfSDavid du Colombier
12280ee5cbfSDavid du Colombier sl = binalloc(&parseBin, sizeof(SList), 0);
1237dd7cddfSDavid du Colombier if(sl == nil)
1247dd7cddfSDavid du Colombier parseErr("out of memory");
1257dd7cddfSDavid du Colombier sl->s = s;
1267dd7cddfSDavid du Colombier sl->next = next;
1277dd7cddfSDavid du Colombier return sl;
1287dd7cddfSDavid du Colombier }
1297dd7cddfSDavid du Colombier
1307dd7cddfSDavid du Colombier SList*
revSList(SList * sl)1317dd7cddfSDavid du Colombier revSList(SList *sl)
1327dd7cddfSDavid du Colombier {
1337dd7cddfSDavid du Colombier SList *last, *next;
1347dd7cddfSDavid du Colombier
1357dd7cddfSDavid du Colombier last = nil;
1367dd7cddfSDavid du Colombier for(; sl != nil; sl = next){
1377dd7cddfSDavid du Colombier next = sl->next;
1387dd7cddfSDavid du Colombier sl->next = last;
1397dd7cddfSDavid du Colombier last = sl;
1407dd7cddfSDavid du Colombier }
1417dd7cddfSDavid du Colombier return last;
1427dd7cddfSDavid du Colombier }
1437dd7cddfSDavid du Colombier
1447dd7cddfSDavid du Colombier int
BNList(Biobuf * b,NList * nl,char * sep)1457dd7cddfSDavid du Colombier BNList(Biobuf *b, NList *nl, char *sep)
1467dd7cddfSDavid du Colombier {
1477dd7cddfSDavid du Colombier char *s;
1487dd7cddfSDavid du Colombier int n;
1497dd7cddfSDavid du Colombier
1507dd7cddfSDavid du Colombier s = "";
1517dd7cddfSDavid du Colombier n = 0;
1527dd7cddfSDavid du Colombier for(; nl != nil; nl = nl->next){
1537dd7cddfSDavid du Colombier n += Bprint(b, "%s%lud", s, nl->n);
1547dd7cddfSDavid du Colombier s = sep;
1557dd7cddfSDavid du Colombier }
1567dd7cddfSDavid du Colombier return n;
1577dd7cddfSDavid du Colombier }
1587dd7cddfSDavid du Colombier
1597dd7cddfSDavid du Colombier int
BSList(Biobuf * b,SList * sl,char * sep)1607dd7cddfSDavid du Colombier BSList(Biobuf *b, SList *sl, char *sep)
1617dd7cddfSDavid du Colombier {
1627dd7cddfSDavid du Colombier char *s;
1637dd7cddfSDavid du Colombier int n;
1647dd7cddfSDavid du Colombier
1657dd7cddfSDavid du Colombier s = "";
1667dd7cddfSDavid du Colombier n = 0;
1677dd7cddfSDavid du Colombier for(; sl != nil; sl = sl->next){
1687dd7cddfSDavid du Colombier n += Bprint(b, "%s", s);
1697dd7cddfSDavid du Colombier n += Bimapstr(b, sl->s);
1707dd7cddfSDavid du Colombier s = sep;
1717dd7cddfSDavid du Colombier }
1727dd7cddfSDavid du Colombier return n;
1737dd7cddfSDavid du Colombier }
1747dd7cddfSDavid du Colombier
1757dd7cddfSDavid du Colombier int
Bimapdate(Biobuf * b,Tm * tm)1767dd7cddfSDavid du Colombier Bimapdate(Biobuf *b, Tm *tm)
1777dd7cddfSDavid du Colombier {
1787dd7cddfSDavid du Colombier char buf[64];
1797dd7cddfSDavid du Colombier
1807dd7cddfSDavid du Colombier if(tm == nil)
1817dd7cddfSDavid du Colombier tm = localtime(time(nil));
1827dd7cddfSDavid du Colombier imap4date(buf, sizeof(buf), tm);
1837dd7cddfSDavid du Colombier return Bimapstr(b, buf);
1847dd7cddfSDavid du Colombier }
1857dd7cddfSDavid du Colombier
1867dd7cddfSDavid du Colombier int
Brfc822date(Biobuf * b,Tm * tm)1877dd7cddfSDavid du Colombier Brfc822date(Biobuf *b, Tm *tm)
1887dd7cddfSDavid du Colombier {
1897dd7cddfSDavid du Colombier char buf[64];
1907dd7cddfSDavid du Colombier
1917dd7cddfSDavid du Colombier if(tm == nil)
1927dd7cddfSDavid du Colombier tm = localtime(time(nil));
1937dd7cddfSDavid du Colombier rfc822date(buf, sizeof(buf), tm);
1947dd7cddfSDavid du Colombier return Bimapstr(b, buf);
1957dd7cddfSDavid du Colombier }
1967dd7cddfSDavid du Colombier
1977dd7cddfSDavid du Colombier int
Bimapstr(Biobuf * b,char * s)1987dd7cddfSDavid du Colombier Bimapstr(Biobuf *b, char *s)
1997dd7cddfSDavid du Colombier {
2007dd7cddfSDavid du Colombier char *t;
2017dd7cddfSDavid du Colombier int c;
2027dd7cddfSDavid du Colombier
2037dd7cddfSDavid du Colombier if(s == nil)
2047dd7cddfSDavid du Colombier return Bprint(b, "NIL");
2057dd7cddfSDavid du Colombier for(t = s; ; t++){
2067dd7cddfSDavid du Colombier c = *t;
2077dd7cddfSDavid du Colombier if(c == '\0')
2087dd7cddfSDavid du Colombier return Bprint(b, "\"%s\"", s);
2097dd7cddfSDavid du Colombier if(t - s > 64 || c >= 0x7f || strchr("\"\\\r\n", c) != nil)
2107dd7cddfSDavid du Colombier break;
2117dd7cddfSDavid du Colombier }
2127dd7cddfSDavid du Colombier return Bprint(b, "{%lud}\r\n%s", strlen(s), s);
2137dd7cddfSDavid du Colombier }
214