123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- /*
- * mailbox and message representations
- *
- * these structures are allocated with emalloc and must be explicitly freed
- */
- typedef struct Box Box;
- typedef struct Header Header;
- typedef struct MAddr MAddr;
- typedef struct MbLock MbLock;
- typedef struct MimeHdr MimeHdr;
- typedef struct Msg Msg;
- typedef struct NamedInt NamedInt;
- typedef struct Pair Pair;
- 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 */
- MboxNameLen = 256, /* max. length of upas/fs mbox name */
- MsgNameLen = 32, /* max. length of a file in a upas/fs mbox */
- UserNameLen = 64, /* max. length of user's name */
- MUtf7Max = 6, /* max length for a modified utf7 character: &bbbb- */
- /*
- * message flags
- */
- MSeen = 1 << 0,
- MAnswered = 1 << 1,
- MFlagged = 1 << 2,
- MDeleted = 1 << 3,
- MDraft = 1 << 4,
- MRecent = 1 << 5,
- /*
- * message bogus flags
- */
- NotBogus = 0, /* the message is displayable */
- BogusHeader = 1, /* the header had bad characters */
- BogusBody = 2, /* the body had bad characters */
- BogusTried = 4, /* attempted to open the fake message */
- };
- 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 */
- ulong max; /* maximum msgs->seq, same as number of messages */
- ulong toldMax; /* last value sent to client */
- ulong recent; /* number of recently received messaged */
- ulong toldRecent; /* last value sent to client */
- ulong uidnext; /* next uid value assigned to a message */
- ulong uidvalidity; /* uid of mailbox */
- Msg *msgs;
- };
- /*
- * fields of Msg->info
- */
- enum
- {
- /*
- * read from upasfs
- */
- IFrom,
- ITo,
- ICc,
- IReplyTo,
- IUnixDate,
- ISubject,
- IType,
- IDisposition,
- IFilename,
- IDigest,
- IBcc,
- IInReplyTo, /* aka internal date */
- IDate,
- ISender,
- IMessageId,
- ILines, /* number of lines of raw body */
- IMax
- };
- struct Header
- {
- char *buf; /* header, including terminating \r\n */
- ulong size; /* strlen(buf) */
- ulong lines; /* number of \n characters in buf */
- /*
- * pre-parsed mime headers
- */
- MimeHdr *type; /* content-type */
- MimeHdr *id; /* content-id */
- MimeHdr *description; /* content-description */
- MimeHdr *encoding; /* content-transfer-encoding */
- MimeHdr *md5; /* content-md5 */
- MimeHdr *disposition; /* content-disposition */
- MimeHdr *language; /* content-language */
- };
- struct Msg
- {
- Msg *next;
- Msg *prev;
- 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? */
- uchar bogus; /* implies the message is invalid, ie contains nulls; see flags above */
- ulong uid; /* imap unique identifier */
- ulong seq; /* position in box; 1 is oldest */
- ulong 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 */
- ulong size; /* size of fs/rawbody, in bytes, with \r added before \n */
- ulong lines; /* number of lines in rawbody */
- char *iBuf;
- char *info[IMax]; /* all info about message */
- char *unixDate;
- MAddr *unixFrom;
- MAddr *to; /* parsed out address lines */
- MAddr *from;
- MAddr *replyTo;
- MAddr *sender;
- MAddr *cc;
- MAddr *bcc;
- };
- /*
- * pre-parsed header lines
- */
- struct MAddr
- {
- char *personal;
- char *box;
- char *host;
- MAddr *next;
- };
- struct MimeHdr
- {
- char *s;
- char *t;
- MimeHdr *next;
- };
- /*
- * 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
- */
- typedef struct Fetch Fetch;
- typedef struct NList NList;
- typedef struct SList SList;
- typedef struct MsgSet MsgSet;
- typedef struct Store Store;
- typedef struct Search Search;
- /*
- * parse tree for fetch command
- */
- enum
- {
- FEnvelope,
- FFlags,
- FInternalDate,
- FRfc822,
- FRfc822Head,
- FRfc822Size,
- FRfc822Text,
- FBodyStruct,
- FUid,
- FBody, /* BODY */
- FBodySect, /* BODY [...] */
- FBodyPeek,
- FMax
- };
- enum
- {
- FPAll,
- FPHead,
- FPHeadFields,
- FPHeadFieldsNot,
- FPMime,
- FPText,
- FPMax
- };
- struct Fetch
- {
- uchar op; /* F.* operator */
- uchar part; /* FP.* subpart for body[] & body.peek[]*/
- uchar partial; /* partial fetch? */
- long start; /* partial fetch amounts */
- long size;
- NList *sect;
- SList *hdrs;
- Fetch *next;
- };
- /*
- * status items
- */
- enum{
- SMessages = 1 << 0,
- SRecent = 1 << 1,
- SUidNext = 1 << 2,
- SUidValidity = 1 << 3,
- SUnseen = 1 << 4,
- };
- /*
- * parse tree for store command
- */
- enum
- {
- STFlags,
- STFlagsSilent,
- STMax
- };
- struct Store
- {
- uchar sign;
- uchar op;
- int flags;
- };
- /*
- * parse tree for search command
- */
- enum
- {
- SKNone,
- SKCharset,
- SKAll,
- SKAnswered,
- SKBcc,
- SKBefore,
- SKBody,
- SKCc,
- SKDeleted,
- SKDraft,
- SKFlagged,
- SKFrom,
- SKHeader,
- SKKeyword,
- SKLarger,
- SKNew,
- SKNot,
- SKOld,
- SKOn,
- SKOr,
- SKRecent,
- SKSeen,
- SKSentBefore,
- SKSentOn,
- SKSentSince,
- SKSet,
- SKSince,
- SKSmaller,
- SKSubject,
- SKText,
- SKTo,
- SKUid,
- SKUnanswered,
- SKUndeleted,
- SKUndraft,
- SKUnflagged,
- SKUnkeyword,
- SKUnseen,
- SKMax
- };
- struct Search
- {
- int key;
- char *s;
- char *hdr;
- ulong num;
- int year;
- int mon;
- int mday;
- MsgSet *set;
- Search *left;
- Search *right;
- Search *next;
- };
- struct NList
- {
- ulong n;
- NList *next;
- };
- struct SList
- {
- char *s;
- SList *next;
- };
- struct MsgSet
- {
- ulong from;
- ulong to;
- MsgSet *next;
- };
- struct Pair
- {
- ulong start;
- ulong stop;
- };
- #include "bin.h"
- extern Bin *parseBin;
- extern Biobuf bout;
- extern Biobuf bin;
- extern char username[UserNameLen];
- extern char mboxDir[MboxNameLen];
- extern char *fetchPartNames[FPMax];
- extern char *site;
- extern char *remote;
- extern int debug;
- #include "fns.h"
|