xref: /plan9/sys/src/cmd/upas/fs/dat.h (revision 43aadf5e5598b9159a98f64e309c3ae860328a56)
1 typedef struct Message Message;
2 struct Message
3 {
4 	int	id;
5 	int	refs;
6 	int	subname;
7 	char	name[Elemlen];
8 
9 	// pointers into message
10 	char	*start;		// start of message
11 	char	*end;		// end of message
12 	char	*header;	// start of header
13 	char	*hend;		// end of header
14 	int	hlen;		// length of header minus ignored fields
15 	char	*mheader;	// start of mime header
16 	char	*mhend;		// end of mime header
17 	char	*body;		// start of body
18 	char	*bend;		// end of body
19 	char	*rbody;		// raw (unprocessed) body
20 	char	*rbend;		// end of raw (unprocessed) body
21 	char	*lim;
22 	char	deleted;
23 	char	inmbox;
24 	char	mallocd;	// message is malloc'd
25 	char	ballocd;	// body is malloc'd
26 	char	hallocd;	// header is malloce'd
27 
28 	// mail info
29 	String	*unixheader;
30 	String	*unixfrom;
31 	String	*unixdate;
32 	String	*from822;
33 	String	*sender822;
34 	String	*to822;
35 	String	*bcc822;
36 	String	*cc822;
37 	String	*replyto822;
38 	String	*date822;
39 	String	*inreplyto822;
40 	String	*subject822;
41 	String	*messageid822;
42 	String	*addrs;
43 	String	*mimeversion;
44 	String	*sdigest;
45 
46 	// mime info
47 	String	*boundary;
48 	String	*type;
49 	int	encoding;
50 	int	disposition;
51 	String	*charset;
52 	String	*filename;
53 	int	converted;
54 	int	decoded;
55 	char	lines[10];	// number of lines in rawbody
56 
57 	Message	*next;		// same level
58 	Message	*part;		// down a level
59 	Message	*whole;		// up a level
60 
61 	uchar	digest[SHA1dlen];
62 
63 	vlong	imapuid;	// used by imap4
64 
65 	char		uidl[80];	// used by pop3
66 	int		mesgno;
67 };
68 
69 enum
70 {
71 	// encodings
72 	Enone=	0,
73 	Ebase64,
74 	Equoted,
75 
76 	// disposition possibilities
77 	Dnone=	0,
78 	Dinline,
79 	Dfile,
80 	Dignore,
81 
82 	PAD64=	'=',
83 };
84 
85 typedef struct Mailbox Mailbox;
86 struct Mailbox
87 {
88 	QLock;
89 	int	refs;
90 	Mailbox	*next;
91 	int	id;
92 	int	dolock;		// lock when syncing?
93 	int	std;
94 	char	name[Elemlen];
95 	char	path[Pathlen];
96 	Dir	*d;
97 	Message	*root;
98 	int	vers;		// goes up each time mailbox is read
99 
100 	ulong waketime;
101 	char	*(*sync)(Mailbox*, int);
102 	void	(*close)(Mailbox*);
103 	char	*(*fetch)(Mailbox*, Message*);
104 	char	*(*ctl)(Mailbox*, int, char**);
105 	void	*aux;		// private to Mailbox implementation
106 };
107 
108 typedef char *Mailboxinit(Mailbox*, char*);
109 
110 extern Message	*root;
111 extern Mailboxinit	plan9mbox;
112 extern Mailboxinit	pop3mbox;
113 extern Mailboxinit	imap4mbox;
114 extern Mailboxinit	planbmbox;
115 extern Mailboxinit	planbvmbox;
116 
117 char*		syncmbox(Mailbox*, int);
118 char*		geterrstr(void);
119 void*		emalloc(ulong);
120 void*		erealloc(void*, ulong);
121 Message*	newmessage(Message*);
122 void		delmessage(Mailbox*, Message*);
123 void		delmessages(int, char**);
124 int		newid(void);
125 void		mailplumb(Mailbox*, Message*, int);
126 char*		newmbox(char*, char*, int);
127 void		freembox(char*);
128 void		logmsg(char*, Message*);
129 void		msgincref(Message*);
130 void		msgdecref(Mailbox*, Message*);
131 void		mboxincref(Mailbox*);
132 void		mboxdecref(Mailbox*);
133 void		convert(Message*);
134 void		decode(Message*);
135 int		cistrncmp(char*, char*, int);
136 int		cistrcmp(char*, char*);
137 int		decquoted(char*, char*, char*, int);
138 int		xtoutf(char*, char**, char*, char*);
139 void		countlines(Message*);
140 int		headerlen(Message*);
141 void		parse(Message*, int, Mailbox*, int);
142 void		parseheaders(Message*, int, Mailbox*, int);
143 void		parsebody(Message*, Mailbox*);
144 void		parseunix(Message*);
145 String*	date822tounix(char*);
146 int		fidmboxrefs(Mailbox*);
147 int		hashmboxrefs(Mailbox*);
148 void		checkmboxrefs(void);
149 
150 extern int	debug;
151 extern int	fflag;
152 extern int	logging;
153 extern char	user[Elemlen];
154 extern char	stdmbox[Pathlen];
155 extern QLock	mbllock;
156 extern Mailbox	*mbl;
157 extern char	*mntpt;
158 extern int	biffing;
159 extern int	plumbing;
160 extern char*	Enotme;
161 
162 enum
163 {
164 	/* mail subobjects */
165 	Qbody,
166 	Qbcc,
167 	Qcc,
168 	Qdate,
169 	Qdigest,
170 	Qdisposition,
171 	Qfilename,
172 	Qfrom,
173 	Qheader,
174 	Qinreplyto,
175 	Qlines,
176 	Qmimeheader,
177 	Qmessageid,
178 	Qraw,
179 	Qrawbody,
180 	Qrawheader,
181 	Qrawunix,
182 	Qreplyto,
183 	Qsender,
184 	Qsubject,
185 	Qto,
186 	Qtype,
187 	Qunixheader,
188 	Qinfo,
189 	Qunixdate,
190 	Qmax,
191 
192 	/* other files */
193 	Qtop,
194 	Qmbox,
195 	Qdir,
196 	Qctl,
197 	Qmboxctl,
198 };
199 
200 #define PATH(id, f)	((((id)&0xfffff)<<10) | (f))
201 #define FILE(p)		((p) & 0x3ff)
202 
203 char *dirtab[];
204 
205 // hash table to aid in name lookup, all files have an entry
206 typedef struct Hash Hash;
207 struct Hash {
208 	Hash	*next;
209 	char	*name;
210 	ulong	ppath;
211 	Qid	qid;
212 	Mailbox	*mb;
213 	Message	*m;
214 };
215 
216 Hash	*hlook(ulong, char*);
217 void	henter(ulong, char*, Qid, Message*, Mailbox*);
218 void	hfree(ulong, char*);
219 
220 ulong msgallocd, msgfreed;
221 
222