1 typedef struct Message Message; 2 struct Message 3 { 4 int id; 5 int refs; 6 int subname; 7 char name[Elemlen]; 8 9 // pointers into message 10 char *start; // start of message 11 char *end; // end of message 12 char *header; // start of header 13 char *hend; // end of header 14 int hlen; // length of header minus ignored fields 15 char *mheader; // start of mime header 16 char *mhend; // end of mime header 17 char *body; // start of body 18 char *bend; // end of body 19 char *rbody; // raw (unprocessed) body 20 char *rbend; // end of raw (unprocessed) body 21 char *lim; 22 char deleted; 23 char inmbox; 24 char mallocd; // message is malloc'd 25 char ballocd; // body is malloc'd 26 char hallocd; // header is malloce'd 27 28 // mail info 29 String *unixheader; 30 String *unixfrom; 31 String *unixdate; 32 String *from822; 33 String *sender822; 34 String *to822; 35 String *bcc822; 36 String *cc822; 37 String *replyto822; 38 String *date822; 39 String *inreplyto822; 40 String *subject822; 41 String *messageid822; 42 String *addrs; 43 String *mimeversion; 44 String *sdigest; 45 46 // mime info 47 String *boundary; 48 String *type; 49 int encoding; 50 int disposition; 51 String *charset; 52 String *filename; 53 int converted; 54 int decoded; 55 char lines[10]; // number of lines in rawbody 56 57 Message *next; // same level 58 Message *part; // down a level 59 Message *whole; // up a level 60 61 uchar digest[SHA1dlen]; 62 63 vlong imapuid; // used by imap4 64 65 char uidl[80]; // used by pop3 66 int mesgno; 67 }; 68 69 enum 70 { 71 // encodings 72 Enone= 0, 73 Ebase64, 74 Equoted, 75 76 // disposition possibilities 77 Dnone= 0, 78 Dinline, 79 Dfile, 80 Dignore, 81 82 PAD64= '=', 83 }; 84 85 typedef struct Mailbox Mailbox; 86 struct Mailbox 87 { 88 QLock; 89 int refs; 90 Mailbox *next; 91 int id; 92 int dolock; // lock when syncing? 93 int std; 94 char name[Elemlen]; 95 char path[Pathlen]; 96 Dir *d; 97 Message *root; 98 int vers; // goes up each time mailbox is read 99 100 ulong waketime; 101 char *(*sync)(Mailbox*, int); 102 void (*close)(Mailbox*); 103 char *(*fetch)(Mailbox*, Message*); 104 char *(*ctl)(Mailbox*, int, char**); 105 void *aux; // private to Mailbox implementation 106 }; 107 108 typedef char *Mailboxinit(Mailbox*, char*); 109 110 extern Message *root; 111 extern Mailboxinit plan9mbox; 112 extern Mailboxinit pop3mbox; 113 extern Mailboxinit imap4mbox; 114 extern Mailboxinit planbmbox; 115 extern Mailboxinit planbvmbox; 116 117 char* syncmbox(Mailbox*, int); 118 char* geterrstr(void); 119 void* emalloc(ulong); 120 void* erealloc(void*, ulong); 121 Message* newmessage(Message*); 122 void delmessage(Mailbox*, Message*); 123 void delmessages(int, char**); 124 int newid(void); 125 void mailplumb(Mailbox*, Message*, int); 126 char* newmbox(char*, char*, int); 127 void freembox(char*); 128 void logmsg(char*, Message*); 129 void msgincref(Message*); 130 void msgdecref(Mailbox*, Message*); 131 void mboxincref(Mailbox*); 132 void mboxdecref(Mailbox*); 133 void convert(Message*); 134 void decode(Message*); 135 int cistrncmp(char*, char*, int); 136 int cistrcmp(char*, char*); 137 int decquoted(char*, char*, char*, int); 138 int xtoutf(char*, char**, char*, char*); 139 void countlines(Message*); 140 int headerlen(Message*); 141 void parse(Message*, int, Mailbox*, int); 142 void parseheaders(Message*, int, Mailbox*, int); 143 void parsebody(Message*, Mailbox*); 144 void parseunix(Message*); 145 String* date822tounix(char*); 146 int fidmboxrefs(Mailbox*); 147 int hashmboxrefs(Mailbox*); 148 void checkmboxrefs(void); 149 150 extern int debug; 151 extern int fflag; 152 extern int logging; 153 extern char user[Elemlen]; 154 extern char stdmbox[Pathlen]; 155 extern QLock mbllock; 156 extern Mailbox *mbl; 157 extern char *mntpt; 158 extern int biffing; 159 extern int plumbing; 160 extern char* Enotme; 161 162 enum 163 { 164 /* mail subobjects */ 165 Qbody, 166 Qbcc, 167 Qcc, 168 Qdate, 169 Qdigest, 170 Qdisposition, 171 Qfilename, 172 Qfrom, 173 Qheader, 174 Qinreplyto, 175 Qlines, 176 Qmimeheader, 177 Qmessageid, 178 Qraw, 179 Qrawbody, 180 Qrawheader, 181 Qrawunix, 182 Qreplyto, 183 Qsender, 184 Qsubject, 185 Qto, 186 Qtype, 187 Qunixheader, 188 Qinfo, 189 Qunixdate, 190 Qmax, 191 192 /* other files */ 193 Qtop, 194 Qmbox, 195 Qdir, 196 Qctl, 197 Qmboxctl, 198 }; 199 200 #define PATH(id, f) ((((id)&0xfffff)<<10) | (f)) 201 #define FILE(p) ((p) & 0x3ff) 202 203 char *dirtab[]; 204 205 // hash table to aid in name lookup, all files have an entry 206 typedef struct Hash Hash; 207 struct Hash { 208 Hash *next; 209 char *name; 210 ulong ppath; 211 Qid qid; 212 Mailbox *mb; 213 Message *m; 214 }; 215 216 Hash *hlook(ulong, char*); 217 void henter(ulong, char*, Qid, Message*, Mailbox*); 218 void hfree(ulong, char*); 219 220 ulong msgallocd, msgfreed; 221 222