222 lines
4.2 KiB
C
222 lines
4.2 KiB
C
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;
|
|
|