| 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 ql; /* jpc named 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[]; jpc */ |
| |
| // 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; |
| |