/*
* mailbox and message representations
*
* these structures are allocated with emalloc and must be explicitly freed
*/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <auth.h>
#include <avl.h>
#include <bin.h>
enum
{
Stralloc = 32, /* characters allocated at a time */
Bufsize = 8*1024, /* size of transfer block */
Ndigest = 40, /* length of digest string */
Nuid = 10, /* length of .imp uid string */
Nflags = 8, /* length of .imp flag string */
Locksecs = 5 * 60, /* seconds to wait for acquiring a locked file */
Pathlen = 256, /* max. length of upas/fs mbox name */
Filelen = 32, /* max. length of a file in a upas/fs mbox */
Userlen = 64, /* max. length of user's name */
Mutf7max = 6, /* max bytes for a mutf7 character: &bbbb- */
struct Box
{
char *name; /* path name of mailbox */
char *fs; /* fs name of mailbox */
char *fsdir; /* /mail/fs/box->fs */
char *imp; /* path name of .imp file */
uchar writable; /* can write back messages? */
uchar dirtyimp; /* .imp file needs to be written? */
uchar sendflags; /* need flags update */
Qid qid; /* qid of fs mailbox */
Qid impqid; /* qid of .imp when last synched */
long mtime; /* file mtime when last read */
uint max; /* maximum msgs->seq, same as number of messages */
uint toldmax; /* last value sent to client */
uint recent; /* number of recently received messaged */
uint toldrecent; /* last value sent to client */
uint uidnext; /* next uid value assigned to a message */
uint uidvalidity; /* uid of mailbox */
Msg *msgs; /* msgs in uid order */
Avltree *fstree; /* msgs in upas/fs order */
};
/*
* fields of Msg->info
*/
enum
{
/*
* read from upasfs
*/
Ifrom,
Ito,
Icc,
Ireplyto,
Iunixdate,
Isubject,
Itype,
Idisposition,
Ifilename,
Idigest,
Ibcc,
Iinreplyto,
Idate,
Isender,
Imessageid,
Ilines, /* number of lines of raw body */
Isize,
// Iflags,
// Idatesec
Imax
};
struct Header
{
char *buf; /* header, including terminating \r\n */
uint size; /* strlen(buf) */
uint lines; /* number of \n characters in buf */
struct Msg
{
Msg *next;
Msg *kids;
Msg *parent;
char *fsdir; /* box->fsdir of enclosing message */
Header head; /* message header */
Header mime; /* mime header from enclosing multipart spec */
int flags;
uchar sendflags; /* flags value needs to be sent to client */
uchar expunged; /* message actually expunged, but not yet reported to client */
uchar matched; /* search succeeded? */
uint uid; /* imap unique identifier */
uint seq; /* position in box; 1 is oldest */
uint id; /* number of message directory in upas/fs */
char *fs; /* name of message directory */
char *efs; /* pointer after / in fs; enough space for file name */
uint size; /* size of fs/rawbody, in bytes, with \r added before \n */
uint lines; /* number of lines in rawbody */
char *ibuf;
char *info[Imax]; /* all info about message */
/*
* mapping of integer & names
*/
struct Namedint
{
char *name;
int v;
};
/*
* lock for all mail file operations
*/
struct Mblock
{
int fd;
};
/*
* parse nodes for imap4rev1 protocol
*
* important: all of these items are allocated
* in one can, so they can be tossed out at the same time.
* this allows leakless parse error recovery by simply tossing the can away.
* however, it means these structures cannot be mixed with the mailbox structures
*/