shithub: fork

Download patch

ref: bbfa84125431077c425db3328468ed2e31181c1b
parent: 4b336717fadaf1043c7cf1bc2b496c79cac79a7b
author: qwx <[email protected]>
date: Sat Oct 14 23:59:26 EDT 2023

REALLY sync upas, wtf

--- /dev/null
+++ b/sys/src/cmd/upas/fs/dat.h
@@ -1,0 +1,360 @@
+#include <avl.h>
+
+enum {
+	/* cache states */
+	Cidx		= 1<<0,
+	Cidxstale	= 1<<1,
+	Cheader 	= 1<<2,
+	Cbody		= 1<<3,
+	Cnew		= 1<<4,
+	Cmod		= 1<<5,
+
+	/* encodings */
+	Enone=	0,
+	Ebase64,
+	Equoted,
+
+	/* dispositions */
+	Dnone=	0,
+	Dinline,
+	Dfile,
+	Dignore,
+
+	/* mb create flags */
+	DMcreate	=  0x02000000,
+
+	/* rm flags */
+	Rrecur		= 1<<0,
+	Rtrunc		= 1<<1,
+
+	/* m->deleted flags */
+	Deleted		= 1<<0,
+	Dup		= 1<<1,
+	Dead		= 1<<2,
+	Disappear	= 1<<3,
+	Dmark		= 1<<4,	/* temporary mark for idx scan */
+
+	Maxmsg		= 75*1024*1024,	/* maxmessage size; debugging */
+	Maxcache	= 512*1024,	/* target cache size; set low for debugging */
+	Nctab		= 15,		/* max # of cached messages >10 */
+	Nref		= 10,
+};
+
+typedef struct {
+	Avl;
+	uchar	*digest;
+} Mtree;
+
+typedef struct Idx Idx;
+struct Idx {
+	Mtree;
+
+	char	*str;			/* as read from idx file */
+	uchar	flags;
+	uvlong	fileid;
+	ulong	lines;
+	ulong	size;
+	ulong	rawbsize;			/* nasty imap4d */
+	ulong	ibadchars;
+
+	char	*ffrom;
+	char	*from;
+	char	*to;
+	char	*cc;
+	char	*bcc;
+	char	*replyto;
+	char	*messageid;
+	char	*subject;
+	char	*sender;
+	char	*inreplyto;
+	char	*date822;
+	char	*idxaux;		/* mailbox specific */
+
+	char	*type;			/* mime info */
+	char	*filename;
+	char	disposition;
+
+	int	nparts;
+};
+
+typedef struct Message Message;
+struct Message {
+	ulong	id;
+	int	refs;
+	int	subname;
+	char	name[12];
+
+	/* top-level indexed information */
+	Idx;
+
+	/* caching help */
+	uchar	cstate;
+	ulong	infolen;
+	ulong	csize;
+
+	/*
+	 * a plethoria of pointers into message
+	 * and some status.  not valid unless cached
+	 */
+	char	*start;		/* start of message */
+	char	*end;		/* end of message */
+	char	*header;		/* start of header */
+	char	*hend;		/* end of header */
+	int	hlen;		/* length of header minus ignored fields */
+	char	*mheader;	/* start of mime header */
+	char	*mhend;		/* end of mime header */
+	char	*body;		/* start of body */
+	char	*bend;		/* end of body */
+	char	*rbody;		/* raw (unprocessed) body */
+	char	*rbend;		/* end of raw (unprocessed) body */
+	char	mallocd;		/* message is malloc'd */
+	char	ballocd;		/* body is malloc'd */
+	char	hallocd;		/* header is malloc'd */
+	int	badchars;	/* running count of bad chars. */
+
+	char	deleted;
+	char	inmbox;
+
+	/* mail info */
+	char	*unixheader;
+	char	*unixfrom;
+	char	*unixdate;
+	char	*references[Nref]; /* nil terminated unless full */
+
+	/* mime info */
+	char	*charset;		
+	char	*boundary;
+	char	converted;
+	char	encoding;
+	char	decoded;
+
+	Message	*next;
+	Message	*part;
+	Message	*whole;
+	Message	*lru;		/* least recently use chain */
+
+	union{
+		char	*lim;	/* used by plan9; not compatable with cache */
+		vlong	imapuid;	/* used by imap4 */
+		void	*aux;
+	};
+};
+
+typedef struct Mcache Mcache;
+struct Mcache {
+	uvlong	cached;
+	int	nlru;
+	Message	*lru;
+};
+
+typedef struct Mailbox Mailbox;
+struct Mailbox {
+	int	refs;
+	Mailbox	*next;
+	ulong	id;
+	int	flags;
+	char	rmflags;
+	char	dolock;		/* lock when syncing? */
+	char	addfrom;
+	char	name[Elemlen];
+	char	path[Pathlen];
+	Dir	*d;
+	Message	*root;
+	Avltree	*mtree;
+	ulong	vers;		/* goes up each time mailbox is changed */
+
+	/* cache tracking */
+	Mcache;
+
+	/* index tracking */
+	Qid	qid;
+
+	ulong	waketime;
+	void	(*close)(Mailbox*);
+	void	(*decache)(Mailbox*, Message*);
+	char	*(*move)(Mailbox*, Message*, char*);
+	int	(*fetch)(Mailbox*, Message*, uvlong, ulong);
+	void	(*delete)(Mailbox*, Message*);
+	char	*(*ctl)(Mailbox*, int, char**);
+	char	*(*remove)(Mailbox *, int);
+	char	*(*rename)(Mailbox*, char*, int);
+	char	*(*sync)(Mailbox*);
+	void	(*modflags)(Mailbox*, Message*, int);
+	void	(*idxwrite)(Biobuf*, Mailbox*);
+	int	(*idxread)(char*, Mailbox*);
+	void	(*idxinvalid)(Mailbox*);
+	void	*aux;		/* private to Mailbox implementation */
+
+	int	syncing;	/* currently syncing? */
+};
+
+typedef char *Mailboxinit(Mailbox*, char*);
+
+Mailboxinit	plan9mbox;
+Mailboxinit	pop3mbox;
+Mailboxinit	imap4mbox;
+Mailboxinit	mdirmbox;
+
+void		genericidxwrite(Biobuf*, Mailbox*);
+int		genericidxread(char*, Mailbox*);
+void		genericidxinvalid(Mailbox*);
+
+void		cachehash(Mailbox*, Message*);
+int		cacheheaders(Mailbox*, Message*);		/* "getcache" */
+int		cachebody(Mailbox*, Message*);
+int		cacheidx(Mailbox*, Message*);
+int		ensurecache(Mailbox*, Message*);
+
+/**/
+void		putcache(Mailbox*, Message*);		/* asymmetricial */
+void		cachefree(Mailbox*, Message*);
+
+char*		syncmbox(Mailbox*, int);
+void*		emalloc(ulong);
+void*		erealloc(void*, ulong);
+Message*	newmessage(Message*);
+void		unnewmessage(Mailbox*, Message*, Message*);
+char*		delmessages(int, char**);
+char		*flagmessages(int, char**);
+char*		movemessages(int, char**);
+void		digestmessage(Mailbox*, Message*);
+
+int		wraptls(int, char*);
+
+void		eprint(char*, ...);
+void		iprint(char *, ...);
+char*		newmbox(char*, char*, int, Mailbox**);
+void		freembox(char*);
+char*		removembox(char*, int);
+void		syncallmboxes(void);
+void		logmsg(Message*, char*, ...);
+void		msgincref(Mailbox*, Message*);
+void		msgdecref(Mailbox*, Message*);
+void		mboxincref(Mailbox*);
+void		mboxdecref(Mailbox*);
+char		*mboxrename(char*, char*, int);
+void		convert(Message*);
+void		decode(Message*);
+int		decquoted(char*, char*, char*, int);
+int		xtoutf(char*, char**, char*, char*);
+ulong		countlines(Message*);
+void		parse(Mailbox*, Message*, int, int);
+void		parseheaders(Mailbox*, Message*, int, int);
+void		parsebody(Message*, Mailbox*);
+int		strtotm(char*, Tm*);
+char*		lowercase(char*);
+
+char*		sputc(char*, char*, int);
+char*		seappend(char*, char*, char*, int);
+
+int		hdrlen(char*, char*);
+char*		rfc2047(char*, char*, char*, int, int);
+
+char*		localremove(Mailbox*, int);
+char*		localrename(Mailbox*, char*, int);
+void		rmidx(char*, int);
+int		vremove(char*);
+int		rename(char *, char*, int);
+
+void		mtreeinit(Mailbox *);
+void		mtreefree(Mailbox *);
+Message*	mtreefind(Mailbox*, uchar*);
+Message*	mtreeadd(Mailbox*, Message*);
+void		mtreedelete(Mailbox*, Message*);
+
+enum {
+	/* mail sub-objects; must be sorted */
+	Qbcc,
+	Qbody,
+	Qcc,
+	Qdate,
+	Qdigest,
+	Qdisposition,
+	Qffrom,
+	Qfileid,
+	Qfilename,
+	Qflags,
+	Qfrom,
+	Qheader,
+	Qinfo,
+	Qinreplyto,
+	Qlines,
+	Qmessageid,
+	Qmimeheader,
+	Qraw,
+	Qrawbody,
+	Qrawheader,
+	Qrawunix,
+	Qreferences,
+	Qreplyto,
+	Qsender,
+	Qsize,
+	Qsubject,
+	Qto,
+	Qtype,
+	Qunixdate,
+	Qunixheader,
+	Qmax,
+
+	/* other files */
+	Qtop,
+	Qmbox,
+	Qdir,
+	Qctl,
+	Qmboxctl,
+};
+
+#define PATH(id, f)	(((uvlong)(id)<<10) | (f))
+#define FILE(p)		((int) (p) & 0x3ff)
+
+/* hash table to aid in name lookup, all files have an entry */
+typedef struct Hash Hash;
+struct Hash {
+	Hash	*next;
+	char	*name;
+	uvlong	ppath;
+	Qid	qid;
+	Mailbox	*mb;
+	Message	*m;
+};
+
+ulong	hash(char*);
+Hash	*hlook(uvlong, char*);
+void	henter(uvlong, char*, Qid, Message*, Mailbox*);
+void	hfree(uvlong, char*);
+
+char	*intern(char*);
+void	idxfree(Idx*);
+int	rdidxfile(Mailbox*);
+int	wridxfile(Mailbox*);
+
+char	*modflags(Mailbox*, Message*, char*);
+int	getmtokens(char *, char**, int, int);
+
+extern char	Enotme[];
+extern char	*mntpt;
+extern char	user[Elemlen];
+extern char 	*dirtab[];
+extern int	Sflag;
+extern int	iflag;
+extern int	biffing;
+extern ulong	cachetarg;
+extern int	debug;
+extern int	lflag;
+extern int	plumbing;
+extern ulong	msgallocd;
+extern ulong	msgfreed;
+extern int	nocertcheck;
+extern Mailbox	*mbl;
+extern Message	*root;
+extern char	*logf;
+
+#define	dprint(...)	if(debug) fprint(2, __VA_ARGS__); else {}
+#define	Topmsg(mb, m)	(m->whole == mb->root)
+#pragma	varargck	type	"A"	uchar*
+#pragma	varargck	type	"D"	uvlong
+#pragma	varargck	type	"Δ"	uvlong
+#pragma	varargck	argpos	eprint	1
+#pragma	varargck	argpos	iprint	1
+#pragma	varargck	argpos	logmsg	2
+