xref: /plan9/sys/src/cmd/ip/imap4d/imap4d.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 /*
2  * mailbox and message representations
3  *
4  * these structures are allocated with emalloc and must be explicitly freed
5  */
6 typedef struct Box	Box;
7 typedef struct Header	Header;
8 typedef struct MAddr	MAddr;
9 typedef struct MbLock	MbLock;
10 typedef struct MimeHdr	MimeHdr;
11 typedef struct Msg	Msg;
12 typedef struct NamedInt	NamedInt;
13 typedef struct Pair	Pair;
14 
15 enum
16 {
17 	StrAlloc	= 32,		/* characters allocated at a time */
18 	BufSize		= 8*1024,	/* size of transfer block */
19 	NDigest		= 40,		/* length of digest string */
20 	NUid		= 10,		/* length of .imp uid string */
21 	NFlags		= 8,		/* length of .imp flag string */
22 	LockSecs	= 5 * 60,	/* seconds to wait for acquiring a locked file */
23 	MboxNameLen	= 256,		/* max. length of upas/fs mbox name */
24 	MsgNameLen	= 32,		/* max. length of a file in a upas/fs mbox */
25 	UserNameLen	= 64,		/* max. length of user's name */
26 
27 	MUtf7Max	= 6,		/* max length for a modified utf7 character: &bbbb- */
28 
29 	/*
30 	 * message flags
31 	 */
32 	MSeen		= 1 << 0,
33 	MAnswered	= 1 << 1,
34 	MFlagged	= 1 << 2,
35 	MDeleted	= 1 << 3,
36 	MDraft		= 1 << 4,
37 	MRecent		= 1 << 5,
38 
39 	/*
40 	 * message bogus flags
41 	 */
42 	NotBogus	= 0,	/* the message is displayable */
43 	BogusHeader	= 1,	/* the header had bad characters */
44 	BogusBody	= 2,	/* the body had bad characters */
45 	BogusTried	= 4,	/* attempted to open the fake message */
46 };
47 
48 struct Box
49 {
50 	char	*name;		/* path name of mailbox */
51 	char	*fs;		/* fs name of mailbox */
52 	char	*fsDir;		/* /mail/fs/box->fs */
53 	char	*imp;		/* path name of .imp file */
54 	uchar	writable;	/* can write back messages? */
55 	uchar	dirtyImp;	/* .imp file needs to be written? */
56 	uchar	sendFlags;	/* need flags update */
57 	Qid	qid;		/* qid of fs mailbox */
58 	Qid	impQid;		/* qid of .imp when last synched */
59 	long	mtime;		/* file mtime when last read */
60 	ulong	max;		/* maximum msgs->seq, same as number of messages */
61 	ulong	toldMax;	/* last value sent to client */
62 	ulong	recent;		/* number of recently received messaged */
63 	ulong	toldRecent;	/* last value sent to client */
64 	ulong	uidnext;	/* next uid value assigned to a message */
65 	ulong	uidvalidity;	/* uid of mailbox */
66 	Msg	*msgs;
67 };
68 
69 /*
70  * fields of Msg->info
71  */
72 enum
73 {
74 	/*
75 	 * read from upasfs
76 	 */
77 	IFrom,
78 	ITo,
79 	ICc,
80 	IReplyTo,
81 	IUnixDate,
82 	ISubject,
83 	IType,
84 	IDisposition,
85 	IFilename,
86 	IDigest,
87 	IBcc,
88 	IInReplyTo,	/* aka internal date */
89 	IDate,
90 	ISender,
91 	IMessageId,
92 	ILines,		/* number of lines of raw body */
93 
94 	IMax
95 };
96 
97 struct Header
98 {
99 	char	*buf;		/* header, including terminating \r\n */
100 	ulong	size;		/* strlen(buf) */
101 	ulong	lines;		/* number of \n characters in buf */
102 
103 	/*
104 	 * pre-parsed mime headers
105 	 */
106 	MimeHdr	*type;		/* content-type */
107 	MimeHdr	*id;		/* content-id */
108 	MimeHdr	*description;	/* content-description */
109 	MimeHdr	*encoding;	/* content-transfer-encoding */
110 	MimeHdr	*md5;		/* content-md5 */
111 	MimeHdr	*disposition;	/* content-disposition */
112 	MimeHdr	*language;	/* content-language */
113 };
114 
115 struct Msg
116 {
117 	Msg	*next;
118 	Msg	*prev;
119 	Msg	*kids;
120 	Msg	*parent;
121 	char	*fsDir;		/* box->fsDir of enclosing message */
122 	Header	head;		/* message header */
123 	Header	mime;		/* mime header from enclosing multipart spec */
124 	int	flags;
125 	uchar	sendFlags;	/* flags value needs to be sent to client */
126 	uchar	expunged;	/* message actually expunged, but not yet reported to client */
127 	uchar	matched;	/* search succeeded? */
128 	uchar	bogus;		/* implies the message is invalid, ie contains nulls; see flags above */
129 	ulong	uid;		/* imap unique identifier */
130 	ulong	seq;		/* position in box; 1 is oldest */
131 	ulong	id;		/* number of message directory in upas/fs */
132 	char	*fs;		/* name of message directory */
133 	char	*efs;		/* pointer after / in fs; enough space for file name */
134 
135 	ulong	size;		/* size of fs/rawbody, in bytes, with \r added before \n */
136 	ulong	lines;		/* number of lines in rawbody */
137 
138 	char	*iBuf;
139 	char	*info[IMax];	/* all info about message */
140 
141 	char	*unixDate;
142 	MAddr	*unixFrom;
143 
144 	MAddr	*to;		/* parsed out address lines */
145 	MAddr	*from;
146 	MAddr	*replyTo;
147 	MAddr	*sender;
148 	MAddr	*cc;
149 	MAddr	*bcc;
150 };
151 
152 /*
153  * pre-parsed header lines
154  */
155 struct MAddr
156 {
157 	char	*personal;
158 	char	*box;
159 	char	*host;
160 	MAddr	*next;
161 };
162 
163 struct MimeHdr
164 {
165 	char	*s;
166 	char	*t;
167 	MimeHdr	*next;
168 };
169 
170 /*
171  * mapping of integer & names
172  */
173 struct NamedInt
174 {
175 	char	*name;
176 	int	v;
177 };
178 
179 /*
180  * lock for all mail file operations
181  */
182 struct MbLock
183 {
184 	int	fd;
185 };
186 
187 /*
188  * parse nodes for imap4rev1 protocol
189  *
190  * important: all of these items are allocated
191  * in one can, so they can be tossed out at the same time.
192  * this allows leakless parse error recovery by simply tossing the can away.
193  * however, it means these structures cannot be mixed with the mailbox structures
194  */
195 
196 typedef struct Fetch	Fetch;
197 typedef struct NList	NList;
198 typedef struct SList	SList;
199 typedef struct MsgSet	MsgSet;
200 typedef struct Store	Store;
201 typedef struct Search	Search;
202 
203 /*
204  * parse tree for fetch command
205  */
206 enum
207 {
208 	FEnvelope,
209 	FFlags,
210 	FInternalDate,
211 	FRfc822,
212 	FRfc822Head,
213 	FRfc822Size,
214 	FRfc822Text,
215 	FBodyStruct,
216 	FUid,
217 	FBody,			/* BODY */
218 	FBodySect,		/* BODY [...] */
219 	FBodyPeek,
220 
221 	FMax
222 };
223 
224 enum
225 {
226 	FPAll,
227 	FPHead,
228 	FPHeadFields,
229 	FPHeadFieldsNot,
230 	FPMime,
231 	FPText,
232 
233 	FPMax
234 };
235 
236 struct Fetch
237 {
238 	uchar	op;		/* F.* operator */
239 	uchar	part;		/* FP.* subpart for body[] & body.peek[]*/
240 	uchar	partial;	/* partial fetch? */
241 	long	start;		/* partial fetch amounts */
242 	long	size;
243 	NList	*sect;
244 	SList	*hdrs;
245 	Fetch	*next;
246 };
247 
248 /*
249  * status items
250  */
251 enum{
252 	SMessages	= 1 << 0,
253 	SRecent		= 1 << 1,
254 	SUidNext	= 1 << 2,
255 	SUidValidity	= 1 << 3,
256 	SUnseen		= 1 << 4,
257 };
258 
259 /*
260  * parse tree for store command
261  */
262 enum
263 {
264 	STFlags,
265 	STFlagsSilent,
266 
267 	STMax
268 };
269 
270 struct Store
271 {
272 	uchar	sign;
273 	uchar	op;
274 	int	flags;
275 };
276 
277 /*
278  * parse tree for search command
279  */
280 enum
281 {
282 	SKNone,
283 
284 	SKCharset,
285 
286 	SKAll,
287 	SKAnswered,
288 	SKBcc,
289 	SKBefore,
290 	SKBody,
291 	SKCc,
292 	SKDeleted,
293 	SKDraft,
294 	SKFlagged,
295 	SKFrom,
296 	SKHeader,
297 	SKKeyword,
298 	SKLarger,
299 	SKNew,
300 	SKNot,
301 	SKOld,
302 	SKOn,
303 	SKOr,
304 	SKRecent,
305 	SKSeen,
306 	SKSentBefore,
307 	SKSentOn,
308 	SKSentSince,
309 	SKSet,
310 	SKSince,
311 	SKSmaller,
312 	SKSubject,
313 	SKText,
314 	SKTo,
315 	SKUid,
316 	SKUnanswered,
317 	SKUndeleted,
318 	SKUndraft,
319 	SKUnflagged,
320 	SKUnkeyword,
321 	SKUnseen,
322 
323 	SKMax
324 };
325 
326 struct Search
327 {
328 	int	key;
329 	char	*s;
330 	char	*hdr;
331 	ulong	num;
332 	int	year;
333 	int	mon;
334 	int	mday;
335 	MsgSet	*set;
336 	Search	*left;
337 	Search	*right;
338 	Search	*next;
339 };
340 
341 struct NList
342 {
343 	ulong	n;
344 	NList	*next;
345 };
346 
347 struct SList
348 {
349 	char	*s;
350 	SList	*next;
351 };
352 
353 struct MsgSet
354 {
355 	ulong	from;
356 	ulong	to;
357 	MsgSet	*next;
358 };
359 
360 struct Pair
361 {
362 	ulong	start;
363 	ulong	stop;
364 };
365 
366 #include "bin.h"
367 
368 extern	Bin	*parseBin;
369 extern	Biobuf	bout;
370 extern	Biobuf	bin;
371 extern	char	username[UserNameLen];
372 extern	char	mboxDir[MboxNameLen];
373 extern	char	*fetchPartNames[FPMax];
374 extern	char	*site;
375 extern	char	*remote;
376 extern	int	debug;
377 
378 #include "fns.h"
379