typedef struct Message Message; struct Message { int id; int refs; int subname; char name[Elemlen]; // pointers into message 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 *lim; char deleted; char inmbox; char mallocd; // message is malloc'd char ballocd; // body is malloc'd char hallocd; // header is malloce'd // mail info String *unixheader; String *unixfrom; String *unixdate; String *from822; String *sender822; String *to822; String *bcc822; String *cc822; String *replyto822; String *date822; String *inreplyto822; String *subject822; String *messageid822; String *addrs; String *mimeversion; String *sdigest; // mime info String *boundary; String *type; int encoding; int disposition; String *charset; String *filename; int converted; int decoded; char lines[10]; // number of lines in rawbody Message *next; // same level Message *part; // down a level Message *whole; // up a level uchar digest[SHA1dlen]; vlong imapuid; // used by imap4 char uidl[80]; // used by pop3 int mesgno; }; enum { // encodings Enone= 0, Ebase64, Equoted, // disposition possibilities Dnone= 0, Dinline, Dfile, Dignore, PAD64= '=', }; typedef struct Mailbox Mailbox; struct Mailbox { QLock; int refs; Mailbox *next; int id; int dolock; // lock when syncing? int std; char name[Elemlen]; char path[Pathlen]; Dir *d; Message *root; int vers; // goes up each time mailbox is read ulong waketime; char *(*sync)(Mailbox*, int); void (*close)(Mailbox*); char *(*fetch)(Mailbox*, Message*); char *(*ctl)(Mailbox*, int, char**); void *aux; // private to Mailbox implementation }; typedef char *Mailboxinit(Mailbox*, char*); extern Message *root; extern Mailboxinit plan9mbox; extern Mailboxinit pop3mbox; extern Mailboxinit imap4mbox; char* syncmbox(Mailbox*, int); char* geterrstr(void); void* emalloc(ulong); void* erealloc(void*, ulong); Message* newmessage(Message*); void delmessage(Mailbox*, Message*); void delmessages(int, char**); int newid(void); void mailplumb(Mailbox*, Message*, int); char* newmbox(char*, char*, int); void freembox(char*); void logmsg(char*, Message*); void msgincref(Message*); void msgdecref(Mailbox*, Message*); void mboxincref(Mailbox*); void mboxdecref(Mailbox*); void convert(Message*); void decode(Message*); int cistrncmp(char*, char*, int); int cistrcmp(char*, char*); int latin1toutf(char*, char*, char*); int windows1257toutf(char*, char*, char*); int decquoted(char*, char*, char*); int xtoutf(char*, char**, char*, char*); void countlines(Message*); int headerlen(Message*); void parse(Message*, int, Mailbox*, int); void parseheaders(Message*, int, Mailbox*, int); void parsebody(Message*, Mailbox*); void parseunix(Message*); String* date822tounix(char*); int fidmboxrefs(Mailbox*); int hashmboxrefs(Mailbox*); void checkmboxrefs(void); extern int debug; extern int fflag; extern int logging; extern char user[Elemlen]; extern char stdmbox[Pathlen]; extern QLock mbllock; extern Mailbox *mbl; extern char *mntpt; extern int biffing; extern int plumbing; extern char* Enotme; enum { /* mail subobjects */ Qbody, Qbcc, Qcc, Qdate, Qdigest, Qdisposition, Qfilename, Qfrom, Qheader, Qinreplyto, Qlines, Qmimeheader, Qmessageid, Qraw, Qrawbody, Qrawheader, Qrawunix, Qreplyto, Qsender, Qsubject, Qto, Qtype, Qunixheader, Qinfo, Qunixdate, Qmax, /* other files */ Qtop, Qmbox, Qdir, Qctl, Qmboxctl, }; #define PATH(id, f) ((((id)&0xfffff)<<10) | (f)) #define FILE(p) ((p) & 0x3ff) char *dirtab[]; // hash table to aid in name lookup, all files have an entry typedef struct Hash Hash; struct Hash { Hash *next; char *name; ulong ppath; Qid qid; Mailbox *mb; Message *m; }; Hash *hlook(ulong, char*); void henter(ulong, char*, Qid, Message*, Mailbox*); void hfree(ulong, char*); ulong msgallocd, msgfreed;