xref: /plan9/sys/src/cmd/ip/imap4d/nodes.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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