17dd7cddfSDavid du Colombier typedef struct Message Message; 27dd7cddfSDavid du Colombier struct Message 37dd7cddfSDavid du Colombier { 47dd7cddfSDavid du Colombier int id; 57dd7cddfSDavid du Colombier int refs; 67dd7cddfSDavid du Colombier int subname; 79a747e4fSDavid du Colombier char name[Elemlen]; 87dd7cddfSDavid du Colombier 97dd7cddfSDavid du Colombier // pointers into message 107dd7cddfSDavid du Colombier char *start; // start of message 117dd7cddfSDavid du Colombier char *end; // end of message 127dd7cddfSDavid du Colombier char *header; // start of header 137dd7cddfSDavid du Colombier char *hend; // end of header 147dd7cddfSDavid du Colombier int hlen; // length of header minus ignored fields 157dd7cddfSDavid du Colombier char *mheader; // start of mime header 167dd7cddfSDavid du Colombier char *mhend; // end of mime header 177dd7cddfSDavid du Colombier char *body; // start of body 187dd7cddfSDavid du Colombier char *bend; // end of body 197dd7cddfSDavid du Colombier char *rbody; // raw (unprocessed) body 207dd7cddfSDavid du Colombier char *rbend; // end of raw (unprocessed) body 217dd7cddfSDavid du Colombier char *lim; 227dd7cddfSDavid du Colombier char deleted; 237dd7cddfSDavid du Colombier char inmbox; 247dd7cddfSDavid du Colombier char mallocd; // message is malloc'd 257dd7cddfSDavid du Colombier char ballocd; // body is malloc'd 267dd7cddfSDavid du Colombier char hallocd; // header is malloce'd 277dd7cddfSDavid du Colombier 287dd7cddfSDavid du Colombier // mail info 2980ee5cbfSDavid du Colombier String *unixheader; 307dd7cddfSDavid du Colombier String *unixfrom; 317dd7cddfSDavid du Colombier String *unixdate; 327dd7cddfSDavid du Colombier String *from822; 337dd7cddfSDavid du Colombier String *sender822; 347dd7cddfSDavid du Colombier String *to822; 357dd7cddfSDavid du Colombier String *bcc822; 367dd7cddfSDavid du Colombier String *cc822; 377dd7cddfSDavid du Colombier String *replyto822; 387dd7cddfSDavid du Colombier String *date822; 397dd7cddfSDavid du Colombier String *inreplyto822; 407dd7cddfSDavid du Colombier String *subject822; 417dd7cddfSDavid du Colombier String *messageid822; 427dd7cddfSDavid du Colombier String *addrs; 437dd7cddfSDavid du Colombier String *mimeversion; 447dd7cddfSDavid du Colombier String *sdigest; 457dd7cddfSDavid du Colombier 467dd7cddfSDavid du Colombier // mime info 477dd7cddfSDavid du Colombier String *boundary; 487dd7cddfSDavid du Colombier String *type; 497dd7cddfSDavid du Colombier int encoding; 507dd7cddfSDavid du Colombier int disposition; 517dd7cddfSDavid du Colombier String *charset; 527dd7cddfSDavid du Colombier String *filename; 537dd7cddfSDavid du Colombier int converted; 547dd7cddfSDavid du Colombier int decoded; 557dd7cddfSDavid du Colombier char lines[10]; // number of lines in rawbody 567dd7cddfSDavid du Colombier 577dd7cddfSDavid du Colombier Message *next; // same level 587dd7cddfSDavid du Colombier Message *part; // down a level 597dd7cddfSDavid du Colombier Message *whole; // up a level 607dd7cddfSDavid du Colombier 617dd7cddfSDavid du Colombier uchar digest[SHA1dlen]; 6280ee5cbfSDavid du Colombier 6380ee5cbfSDavid du Colombier vlong imapuid; // used by imap4 6480ee5cbfSDavid du Colombier 6580ee5cbfSDavid du Colombier char uidl[80]; // used by pop3 6680ee5cbfSDavid du Colombier int mesgno; 677dd7cddfSDavid du Colombier }; 687dd7cddfSDavid du Colombier 697dd7cddfSDavid du Colombier enum 707dd7cddfSDavid du Colombier { 717dd7cddfSDavid du Colombier // encodings 727dd7cddfSDavid du Colombier Enone= 0, 737dd7cddfSDavid du Colombier Ebase64, 747dd7cddfSDavid du Colombier Equoted, 757dd7cddfSDavid du Colombier 767dd7cddfSDavid du Colombier // disposition possibilities 777dd7cddfSDavid du Colombier Dnone= 0, 787dd7cddfSDavid du Colombier Dinline, 797dd7cddfSDavid du Colombier Dfile, 807dd7cddfSDavid du Colombier Dignore, 817dd7cddfSDavid du Colombier 827dd7cddfSDavid du Colombier PAD64= '=', 837dd7cddfSDavid du Colombier }; 847dd7cddfSDavid du Colombier 857dd7cddfSDavid du Colombier typedef struct Mailbox Mailbox; 867dd7cddfSDavid du Colombier struct Mailbox 877dd7cddfSDavid du Colombier { 887dd7cddfSDavid du Colombier QLock; 897dd7cddfSDavid du Colombier int refs; 907dd7cddfSDavid du Colombier Mailbox *next; 917dd7cddfSDavid du Colombier int id; 9259cc4ca5SDavid du Colombier int dolock; // lock when syncing? 937dd7cddfSDavid du Colombier int std; 949a747e4fSDavid du Colombier char name[Elemlen]; 959a747e4fSDavid du Colombier char path[Pathlen]; 969a747e4fSDavid du Colombier Dir *d; 977dd7cddfSDavid du Colombier Message *root; 987dd7cddfSDavid du Colombier int vers; // goes up each time mailbox is read 9980ee5cbfSDavid du Colombier 10080ee5cbfSDavid du Colombier ulong waketime; 10180ee5cbfSDavid du Colombier char *(*sync)(Mailbox*, int); 10280ee5cbfSDavid du Colombier void (*close)(Mailbox*); 10380ee5cbfSDavid du Colombier char *(*fetch)(Mailbox*, Message*); 10480ee5cbfSDavid du Colombier char *(*ctl)(Mailbox*, int, char**); 10580ee5cbfSDavid du Colombier void *aux; // private to Mailbox implementation 1067dd7cddfSDavid du Colombier }; 1077dd7cddfSDavid du Colombier 10880ee5cbfSDavid du Colombier typedef char *Mailboxinit(Mailbox*, char*); 10980ee5cbfSDavid du Colombier 1107dd7cddfSDavid du Colombier extern Message *root; 11180ee5cbfSDavid du Colombier extern Mailboxinit plan9mbox; 11280ee5cbfSDavid du Colombier extern Mailboxinit pop3mbox; 11380ee5cbfSDavid du Colombier extern Mailboxinit imap4mbox; 114*43aadf5eSDavid du Colombier extern Mailboxinit planbmbox; 115*43aadf5eSDavid du Colombier extern Mailboxinit planbvmbox; 1167dd7cddfSDavid du Colombier 1177dd7cddfSDavid du Colombier char* syncmbox(Mailbox*, int); 11880ee5cbfSDavid du Colombier char* geterrstr(void); 1197dd7cddfSDavid du Colombier void* emalloc(ulong); 1207dd7cddfSDavid du Colombier void* erealloc(void*, ulong); 1217dd7cddfSDavid du Colombier Message* newmessage(Message*); 1227dd7cddfSDavid du Colombier void delmessage(Mailbox*, Message*); 1237dd7cddfSDavid du Colombier void delmessages(int, char**); 1247dd7cddfSDavid du Colombier int newid(void); 1257dd7cddfSDavid du Colombier void mailplumb(Mailbox*, Message*, int); 1267dd7cddfSDavid du Colombier char* newmbox(char*, char*, int); 1277dd7cddfSDavid du Colombier void freembox(char*); 12859cc4ca5SDavid du Colombier void logmsg(char*, Message*); 1297dd7cddfSDavid du Colombier void msgincref(Message*); 1307dd7cddfSDavid du Colombier void msgdecref(Mailbox*, Message*); 1317dd7cddfSDavid du Colombier void mboxincref(Mailbox*); 1327dd7cddfSDavid du Colombier void mboxdecref(Mailbox*); 1337dd7cddfSDavid du Colombier void convert(Message*); 1347dd7cddfSDavid du Colombier void decode(Message*); 1357dd7cddfSDavid du Colombier int cistrncmp(char*, char*, int); 1367dd7cddfSDavid du Colombier int cistrcmp(char*, char*); 13717dd33a2SDavid du Colombier int decquoted(char*, char*, char*, int); 1387dd7cddfSDavid du Colombier int xtoutf(char*, char**, char*, char*); 1397dd7cddfSDavid du Colombier void countlines(Message*); 1407dd7cddfSDavid du Colombier int headerlen(Message*); 1417a02f3c0SDavid du Colombier void parse(Message*, int, Mailbox*, int); 1427a02f3c0SDavid du Colombier void parseheaders(Message*, int, Mailbox*, int); 14380ee5cbfSDavid du Colombier void parsebody(Message*, Mailbox*); 14480ee5cbfSDavid du Colombier void parseunix(Message*); 14580ee5cbfSDavid du Colombier String* date822tounix(char*); 1467dd7cddfSDavid du Colombier int fidmboxrefs(Mailbox*); 1477dd7cddfSDavid du Colombier int hashmboxrefs(Mailbox*); 1485d459b5aSDavid du Colombier void checkmboxrefs(void); 1497dd7cddfSDavid du Colombier 1507dd7cddfSDavid du Colombier extern int debug; 1517dd7cddfSDavid du Colombier extern int fflag; 15259cc4ca5SDavid du Colombier extern int logging; 1539a747e4fSDavid du Colombier extern char user[Elemlen]; 154*43aadf5eSDavid du Colombier extern char stdmbox[Pathlen]; 1557dd7cddfSDavid du Colombier extern QLock mbllock; 1567dd7cddfSDavid du Colombier extern Mailbox *mbl; 1577dd7cddfSDavid du Colombier extern char *mntpt; 1587dd7cddfSDavid du Colombier extern int biffing; 1597dd7cddfSDavid du Colombier extern int plumbing; 16080ee5cbfSDavid du Colombier extern char* Enotme; 1617dd7cddfSDavid du Colombier 1627dd7cddfSDavid du Colombier enum 1637dd7cddfSDavid du Colombier { 1649a747e4fSDavid du Colombier /* mail subobjects */ 1657dd7cddfSDavid du Colombier Qbody, 1667dd7cddfSDavid du Colombier Qbcc, 1677dd7cddfSDavid du Colombier Qcc, 1687dd7cddfSDavid du Colombier Qdate, 1697dd7cddfSDavid du Colombier Qdigest, 1707dd7cddfSDavid du Colombier Qdisposition, 1717dd7cddfSDavid du Colombier Qfilename, 1727dd7cddfSDavid du Colombier Qfrom, 1737dd7cddfSDavid du Colombier Qheader, 1747dd7cddfSDavid du Colombier Qinreplyto, 1757dd7cddfSDavid du Colombier Qlines, 1767dd7cddfSDavid du Colombier Qmimeheader, 1777dd7cddfSDavid du Colombier Qmessageid, 1787dd7cddfSDavid du Colombier Qraw, 1797dd7cddfSDavid du Colombier Qrawbody, 1807dd7cddfSDavid du Colombier Qrawheader, 1816b6b9ac8SDavid du Colombier Qrawunix, 1827dd7cddfSDavid du Colombier Qreplyto, 1837dd7cddfSDavid du Colombier Qsender, 1847dd7cddfSDavid du Colombier Qsubject, 1857dd7cddfSDavid du Colombier Qto, 1867dd7cddfSDavid du Colombier Qtype, 1877dd7cddfSDavid du Colombier Qunixheader, 1887dd7cddfSDavid du Colombier Qinfo, 1897dd7cddfSDavid du Colombier Qunixdate, 1909a747e4fSDavid du Colombier Qmax, 1919a747e4fSDavid du Colombier 1929a747e4fSDavid du Colombier /* other files */ 1937dd7cddfSDavid du Colombier Qtop, 1947dd7cddfSDavid du Colombier Qmbox, 1957dd7cddfSDavid du Colombier Qdir, 1967dd7cddfSDavid du Colombier Qctl, 19780ee5cbfSDavid du Colombier Qmboxctl, 1987dd7cddfSDavid du Colombier }; 1997dd7cddfSDavid du Colombier 2007dd7cddfSDavid du Colombier #define PATH(id, f) ((((id)&0xfffff)<<10) | (f)) 2017dd7cddfSDavid du Colombier #define FILE(p) ((p) & 0x3ff) 2027dd7cddfSDavid du Colombier 2037dd7cddfSDavid du Colombier char *dirtab[]; 2047dd7cddfSDavid du Colombier 2057dd7cddfSDavid du Colombier // hash table to aid in name lookup, all files have an entry 2067dd7cddfSDavid du Colombier typedef struct Hash Hash; 2077dd7cddfSDavid du Colombier struct Hash { 2087dd7cddfSDavid du Colombier Hash *next; 2097dd7cddfSDavid du Colombier char *name; 2107dd7cddfSDavid du Colombier ulong ppath; 2117dd7cddfSDavid du Colombier Qid qid; 2127dd7cddfSDavid du Colombier Mailbox *mb; 2137dd7cddfSDavid du Colombier Message *m; 2147dd7cddfSDavid du Colombier }; 2157dd7cddfSDavid du Colombier 2167dd7cddfSDavid du Colombier Hash *hlook(ulong, char*); 2177dd7cddfSDavid du Colombier void henter(ulong, char*, Qid, Message*, Mailbox*); 2187dd7cddfSDavid du Colombier void hfree(ulong, char*); 2197dd7cddfSDavid du Colombier 2207dd7cddfSDavid du Colombier ulong msgallocd, msgfreed; 22159cc4ca5SDavid du Colombier 222