dtb = &d)->init) (s,data,size))
#define SIZE(s) ((s)->size - GETPOS (s))
#define CHR(s) (*(s)->curpos)
#define SNX(s) (--(s)->cursize ? *(s)->curpos++ : (*(s)->dtb->next) (s))
#define GETPOS(s) ((s)->offset + ((s)->curpos - (s)->chunk))
#define SETPOS(s,i) (*(s)->dtb->setpos) (s,i)
/* Search program */
#define SEARCHPGM struct search_program
#define SEARCHHEADER struct search_header
#define SEARCHSET struct search_set
#define SEARCHOR struct search_or
#define SEARCHPGMLIST struct search_pgm_list
SEARCHHEADER { /* header search */
SIZEDTEXT line; /* header line */
SIZEDTEXT text; /* text in header */
SEARCHHEADER *next; /* next in list */
};
SEARCHSET { /* message set */
unsigned long first; /* sequence number */
unsigned long last; /* last value, if a range */
SEARCHSET *next; /* next in list */
};
SEARCHOR {
SEARCHPGM *first; /* first program */
SEARCHPGM *second; /* second program */
SEARCHOR *next; /* next in list */
};
SEARCHPGMLIST {
SEARCHPGM *pgm; /* search program */
SEARCHPGMLIST *next; /* next in list */
};
SEARCHPGM { /* search program */
SEARCHSET *msgno; /* message numbers */
SEARCHSET *uid; /* unique identifiers */
SEARCHOR *or; /* or'ed in programs */
SEARCHPGMLIST *not; /* and'ed not program */
SEARCHHEADER *header; /* list of headers */
STRINGLIST *bcc; /* bcc recipients */
STRINGLIST *body; /* text in message body */
STRINGLIST *cc; /* cc recipients */
STRINGLIST *from; /* originator */
STRINGLIST *keyword; /* keywords */
STRINGLIST *unkeyword; /* unkeywords */
STRINGLIST *subject; /* text in subject */
STRINGLIST *text; /* text in headers and body */
STRINGLIST *to; /* to recipients */
unsigned long larger; /* larger than this size */
unsigned long smaller; /* smaller than this size */
unsigned long older; /* older than this interval */
unsigned long younger; /* younger than this interval */
unsigned short sentbefore; /* sent before this date */
unsigned short senton; /* sent on this date */
unsigned short sentsince; /* sent since this date */
unsigned short before; /* before this date */
unsigned short on; /* on this date */
unsigned short since; /* since this date */
unsigned int answered : 1; /* answered messages */
unsigned int unanswered : 1; /* unanswered messages */
unsigned int deleted : 1; /* deleted messages */
unsigned int undeleted : 1; /* undeleted messages */
unsigned int draft : 1; /* message draft */
unsigned int undraft : 1; /* message undraft */
unsigned int flagged : 1; /* flagged messages */
unsigned int unflagged : 1; /* unflagged messages */
unsigned int recent : 1; /* recent messages */
unsigned int old : 1; /* old messages */
unsigned int seen : 1; /* seen messages */
unsigned int unseen : 1; /* unseen messages */
/* These must be simulated in IMAP */
STRINGLIST *return_path; /* error return address */
STRINGLIST *sender; /* sender address list */
STRINGLIST *reply_to; /* reply address list */
STRINGLIST *in_reply_to; /* replied message ID */
STRINGLIST *message_id; /* message ID */
STRINGLIST *newsgroups; /* USENET newsgroups */
STRINGLIST *followup_to; /* USENET reply newsgroups */
STRINGLIST *references; /* USENET references */
};
/* Mailbox status */
typedef struct mbx_status {
long flags; /* validity flags */
unsigned long messages; /* number of messages */
unsigned long recent; /* number of recent messages */
unsigned long unseen; /* number of unseen messages */
unsigned long uidnext; /* next UID to be assigned */
unsigned long uidvalidity; /* UID validity value */
} MAILSTATUS;
/* Sort program */
typedef void (*postsort_t) (void *sc);
#define SORTPGM struct sort_program
SORTPGM {
unsigned int reverse : 1; /* sort function is to be reversed */
unsigned int abort : 1; /* abort sorting */
short function; /* sort function */
unsigned long nmsgs; /* number of messages being sorted */
struct {
unsigned long cached; /* number of messages cached so far */
unsigned long sorted; /* number of messages sorted so far */
unsigned long postsorted; /* number of postsorted messages so far */
} progress;
postsort_t postsort; /* post sorter */
SORTPGM *next; /* next function */
};
/* Sort cache */
#define SORTCACHE struct sort_cache
SORTCACHE {
unsigned int sorted : 1; /* message has been sorted */
unsigned int postsorted : 1; /* message has been postsorted */
unsigned int refwd : 1; /* subject is a re or fwd */
unsigned int dirty : 1; /* has data not written to backup */
SORTPGM *pgm; /* sort program */
unsigned long num; /* message number (sequence or UID) */
unsigned long date; /* sent date */
unsigned long arrival; /* arrival date */
unsigned long size; /* message size */
char *from; /* from string */
char *to; /* to string */
char *cc; /* cc string */
char *subject; /* extracted subject string */
char *message_id; /* message-id string */
char *unique; /* unique string, normally message-id */
STRINGLIST *references; /* references string */
};
/* ACL list */
#define ACLLIST struct acl_list
ACLLIST {
char *identifier; /* authentication identifier */
char *rights; /* access rights */
ACLLIST *next;
};
/* Quota resource list */
#define QUOTALIST struct quota_list
QUOTALIST {
char *name; /* resource name */
unsigned long usage; /* resource usage */
unsigned long limit; /* resource limit */
QUOTALIST *next; /* next resource */
};
/* Mail Access I/O stream */
/* Structure for mail driver dispatch */
#define DRIVER struct driver
/* Mail I/O stream */
typedef struct mail_stream {
DRIVER *dtb; /* dispatch table for this driver */
void *local; /* pointer to driver local data */
char *mailbox; /* mailbox name (canonicalized) */
char *original_mailbox; /* mailbox name (non-canonicalized) */
unsigned short use; /* stream use count */
unsigned short sequence; /* stream sequence */
unsigned int inbox : 1; /* stream open on an INBOX */
unsigned int lock : 1; /* stream lock flag */
unsigned int debug : 1; /* stream debug flag */
unsigned int silent : 1; /* don't pass events to main program */
unsigned int rdonly : 1; /* stream read-only flag */
unsigned int anonymous : 1; /* stream anonymous access flag */
unsigned int scache : 1; /* stream short cache flag */
unsigned int halfopen : 1; /* stream half-open flag */
unsigned int secure : 1; /* stream secure flag */
unsigned int tryssl : 1; /* stream tryssl flag */
unsigned int mulnewsrc : 1; /* stream use multiple newsrc files */
unsigned int perm_seen : 1; /* permanent Seen flag */
unsigned int perm_deleted : 1;/* permanent Deleted flag */
unsigned int perm_flagged : 1;/* permanent Flagged flag */
unsigned int perm_answered :1;/* permanent Answered flag */
unsigned int perm_draft : 1; /* permanent Draft flag */
unsigned int kwd_create : 1; /* can create new keywords */
unsigned int uid_nosticky : 1;/* UIDs are not preserved */
unsigned int unhealthy : 1; /* unhealthy protocol negotiations */
unsigned int nokod : 1; /* suppress kiss-of-death */
unsigned int sniff : 1; /* metadata only */
unsigned long perm_user_flags;/* mask of permanent user flags */
unsigned long gensym; /* generated tag */
unsigned long nmsgs; /* # of associated msgs */
unsigned long recent; /* # of recent msgs */
unsigned long uid_validity; /* UID validity sequence */
unsigned long uid_last; /* last assigned UID */
char *user_flags[NUSERFLAGS]; /* pointers to user flags in bit order */
unsigned long cachesize; /* size of message cache */
MESSAGECACHE **cache; /* message cache array */
SORTCACHE **sc; /* sort cache array */
unsigned long msgno; /* message number of `current' message */
ENVELOPE *env; /* scratch buffer for envelope */
BODY *body; /* scratch buffer for body */
SIZEDTEXT text; /* scratch buffer for text */
struct {
char *name; /* mailbox name to snarf from */
unsigned long time; /* last snarf time */
long options; /* snarf open options */
} snarf;
struct { /* internal use only */
struct { /* search temporaries */
STRINGLIST *string; /* string(s) to search */
long result; /* search result */
char *text; /* cache of fetched text */
} search;
STRING string; /* stringstruct return hack */
} private;
/* reserved for use by main program */
void *sparep; /* spare pointer */
unsigned int spare : 1; /* first spare bit */
unsigned int spare2 : 1; /* second spare bit */
unsigned int spare3 : 1; /* third spare bit */
unsigned int spare4 : 1; /* fourth spare bit */
unsigned int spare5 : 1; /* fifth spare bit */
unsigned int spare6 : 1; /* sixth spare bit */
unsigned int spare7 : 1; /* seventh spare bit */
unsigned int spare8 : 1; /* eighth spare bit */
} MAILSTREAM;
/* Mail I/O stream handle */
typedef struct mail_stream_handle {
MAILSTREAM *stream; /* pointer to mail stream */
unsigned short sequence; /* sequence of what we expect stream to be */
} MAILHANDLE;
/* Message overview */
typedef struct mail_overview {
char *subject; /* message subject string */
ADDRESS *from; /* originator address list */
char *date; /* message composition date string */
char *message_id; /* message ID */
char *references; /* USENET references */
struct { /* may be 0 or NUL if unknown/undefined */
unsigned long octets; /* message octets (probably LF-newline form) */
unsigned long lines; /* message lines */
char *xref; /* cross references */
} optional;
} OVERVIEW;
/* Network access I/O stream */
/* Structure for network driver dispatch */
#define NETDRIVER struct net_driver
/* Network transport I/O stream */
typedef struct net_stream {
void *stream; /* driver's I/O stream */
NETDRIVER *dtb; /* network driver */
} NETSTREAM;
/* Network transport driver dispatch */
NETDRIVER {
void *(*open) (char *host,char *service,unsigned long port);
void *(*aopen) (NETMBX *mb,char *service,char *usrbuf);
char *(*getline) (void *stream);
long (*getbuffer) (void *stream,unsigned long size,char *buffer);
long (*soutr) (void *stream,char *string);
long (*sout) (void *stream,char *string,unsigned long size);
void (*close) (void *stream);
char *(*host) (void *stream);
char *(*remotehost) (void *stream);
unsigned long (*port) (void *stream);
char *(*localhost) (void *stream);
};
/* Mailgets data identifier */
typedef struct getsdata {
MAILSTREAM *stream;
unsigned long msgno;
char *what;
STRINGLIST *stl;
unsigned long first;
unsigned long last;
long flags;
} GETS_DATA;
#define INIT_GETS(md,s,m,w,f,l) \
md.stream = s, md.msgno = m, md.what = w, md.first = f, md.last = l, \
md.stl = NIL, md.flags = NIL;
/* Mail delivery I/O stream */
typedef struct send_stream {
NETSTREAM *netstream; /* network I/O stream */
char *host; /* SMTP service host */
char *reply; /* last reply string */
long replycode; /* last reply code */
unsigned int debug : 1; /* stream debug flag */
unsigned int sensitive : 1; /* sensitive data in progress */
unsigned int loser : 1; /* server is a loser */
unsigned int saslcancel : 1; /* SASL cancelled by protocol */
union { /* protocol specific */
struct { /* SMTP specific */
unsigned int ok : 1; /* supports ESMTP */
struct { /* service extensions */
unsigned int send : 1; /* supports SEND */
unsigned int soml : 1; /* supports SOML */
unsigned int saml : 1; /* supports SAML */
unsigned int expn : 1; /* supports EXPN */
unsigned int help : 1; /* supports HELP */
unsigned int turn : 1; /* supports TURN */
unsigned int etrn : 1; /* supports ETRN */
unsigned int starttls:1;/* supports STARTTLS */
unsigned int relay : 1; /* supports relaying */
unsigned int pipe : 1; /* supports pipelining */
unsigned int ensc : 1; /* supports enhanced status codes */
unsigned int bmime : 1; /* supports BINARYMIME */
unsigned int chunk : 1; /* supports CHUNKING */
} service;
struct { /* 8-bit MIME transport */
unsigned int ok : 1; /* supports 8-bit MIME */
unsigned int want : 1; /* want 8-bit MIME */
} eightbit;
struct { /* delivery status notification */
unsigned int ok : 1; /* supports DSN */
unsigned int want : 1; /* want DSN */
struct { /* notification options */
/* notify on failure */
unsigned int failure : 1;
/* notify on delay */
unsigned int delay : 1;
/* notify on success */
unsigned int success : 1;
} notify;
unsigned int full : 1; /* return full headers */
char *envid; /* envelope identifier as xtext */
} dsn;
struct { /* size declaration */
unsigned int ok : 1; /* supports SIZE */
unsigned long limit; /* maximum size supported */
} size;
struct { /* deliverby declaration */
unsigned int ok : 1; /* supports DELIVERBY */
unsigned long minby; /* minimum by-time */
} deliverby;
struct { /* authenticated turn */
unsigned int ok : 1; /* supports ATRN */
char *domains; /* domains */
} atrn;
/* supported SASL authenticators */
unsigned int auth : MAXAUTHENTICATORS;
} esmtp;
struct { /* NNTP specific */
unsigned int post : 1; /* supports POST */
struct { /* NNTP extensions */
unsigned int ok : 1; /* supports extensions */
/* supports LISTGROUP */
unsigned int listgroup : 1;
unsigned int over : 1; /* supports OVER */
unsigned int hdr : 1; /* supports HDR */
unsigned int pat : 1; /* supports PAT */
/* supports STARTTLS */
unsigned int starttls : 1;
/* server has MULTIDOMAIN */
unsigned int multidomain : 1;
/* supports AUTHINFO USER */
unsigned int authuser : 1;
/* supported authenticators */
unsigned int sasl : MAXAUTHENTICATORS;
} ext;
} nntp;
} protocol;
} SENDSTREAM;
/* Jacket into external interfaces */
typedef long (*readfn_t) (void *stream,unsigned long size,char *buffer);
typedef char *(*mailgets_t) (readfn_t f,void *stream,unsigned long size,
GETS_DATA *md);
typedef char *(*readprogress_t) (GETS_DATA *md,unsigned long octets);
typedef void *(*mailcache_t) (MAILSTREAM *stream,unsigned long msgno,long op);
typedef long (*mailproxycopy_t) (MAILSTREAM *stream,char *sequence,
char *mailbox,long options);
typedef long (*tcptimeout_t) (long overall,long last);
typedef void *(*authchallenge_t) (void *stream,unsigned long *len);
typedef long (*authrespond_t) (void *stream,char *s,unsigned long size);
typedef long (*authcheck_t) (void);
typedef long (*authclient_t) (authchallenge_t challenger,
authrespond_t responder,char *service,NETMBX *mb,
void *s,unsigned long *trial,char *user);
typedef char *(*authresponse_t) (void *challenge,unsigned long clen,
unsigned long *rlen);
typedef char *(*authserver_t) (authresponse_t responder,int argc,char *argv[]);
typedef void (*smtpverbose_t) (char *buffer);
typedef void (*imapenvelope_t) (MAILSTREAM *stream,unsigned long msgno,
ENVELOPE *env);
typedef char *(*imapreferral_t) (MAILSTREAM *stream,char *url,long code);
typedef void (*overview_t) (MAILSTREAM *stream,unsigned long uid,OVERVIEW *ov,
unsigned long msgno);
typedef unsigned long *(*sorter_t) (MAILSTREAM *stream,char *charset,
SEARCHPGM *spg,SORTPGM *pgm,long flags);
typedef void (*parseline_t) (ENVELOPE *env,char *hdr,char *data,char *host);
typedef ADDRESS *(*parsephrase_t) (char *phrase,char *end,char *host);
typedef void *(*blocknotify_t) (int reason,void *data);
typedef long (*kinit_t) (char *host,char *reason);
typedef void (*sendcommand_t) (MAILSTREAM *stream,char *cmd,long flags);
typedef char *(*newsrcquery_t) (MAILSTREAM *stream,char *mulname,char *name);
typedef void (*getacl_t) (MAILSTREAM *stream,char *mailbox,ACLLIST *acl);
typedef void (*listrights_t) (MAILSTREAM *stream,char *mailbox,char *id,
char *alwaysrights,STRINGLIST *possiblerights);
typedef void (*myrights_t) (MAILSTREAM *stream,char *mailbox,char *rights);
typedef void (*quota_t) (MAILSTREAM *stream,char *qroot,QUOTALIST *qlist);
typedef void (*quotaroot_t) (MAILSTREAM *stream,char *mbx,STRINGLIST *qroot);
typedef void (*sortresults_t) (MAILSTREAM *stream,unsigned long *list,
unsigned long size);
typedef char *(*userprompt_t) (void);
typedef long (*append_t) (MAILSTREAM *stream,void *data,char **flags,
char **date,STRING **message);
typedef void (*copyuid_t) (MAILSTREAM *stream,char *mailbox,
unsigned long uidvalidity,SEARCHSET *sourceset,
SEARCHSET *destset);
typedef void (*appenduid_t) (char *mailbox,unsigned long uidvalidity,
SEARCHSET *set);
typedef long (*dirfmttest_t) (char *name);
typedef long (*scancontents_t) (char *name,char *contents,unsigned long csiz,
unsigned long fsiz);
typedef void (*freeeltsparep_t) (void **sparep);
typedef void (*freeenvelopesparep_t) (void **sparep);
typedef void (*freebodysparep_t) (void **sparep);
typedef void (*freestreamsparep_t) (void **sparep);
typedef void *(*sslstart_t) (void *stream,char *host,unsigned long flags);
typedef long (*sslcertificatequery_t) (char *reason,char *host,char *cert);
typedef void (*sslfailure_t) (char *host,char *reason,unsigned long flags);
typedef void (*logouthook_t) (void *data);
typedef char *(*sslclientcert_t) (void);
typedef char *(*sslclientkey_t) (void);
/* Globals */
extern char *body_types[]; /* defined body type strings */
extern char *body_encodings[]; /* defined body encoding strings */
extern const char *days[]; /* day name strings */
extern const char *months[]; /* month name strings */
/* Threading */
/* Thread node */
#define THREADNODE struct thread_node
THREADNODE {
unsigned long num; /* message number */
SORTCACHE *sc; /* (internal use) sortcache entry */
THREADNODE *branch; /* branch at this point in tree */
THREADNODE *next; /* next node */
};
typedef void (*threadresults_t) (MAILSTREAM *stream,THREADNODE *tree);
/* Thread dispatch */
#define THREADER struct threader_list
THREADER {
char *name; /* name of threader */
THREADNODE *(*dispatch) (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,
long flags,sorter_t sorter);
THREADER *next;
};
/* Container for references threading */
typedef void ** container_t;
/* Namespaces */
#define NAMESPACE struct mail_namespace
NAMESPACE {
char *name; /* name of this namespace */
int delimiter; /* hierarchy delimiter */
PARAMETER *param; /* namespace parameters */
NAMESPACE *next; /* next namespace */
};
/* Authentication */
#define AUTHENTICATOR struct mail_authenticator
AUTHENTICATOR {
long flags; /* authenticator flags */
char *name; /* name of this authenticator */
authcheck_t valid; /* authenticator valid on this system */
authclient_t client; /* client function that supports it */
authserver_t server; /* server function that supports it */
AUTHENTICATOR *next; /* next authenticator */
};
/* Mail driver dispatch */
DRIVER {
char *name; /* driver name */
unsigned long flags; /* driver flags */
DRIVER *next; /* next driver */
/* mailbox is valid for us */
DRIVER *(*valid) (char *mailbox);
/* manipulate driver parameters */
void *(*parameters) (long function,void *value);
/* scan mailboxes */
void (*scan) (MAILSTREAM *stream,char *ref,char *pat,char *contents);
/* list mailboxes */
void (*list) (MAILSTREAM *stream,char *ref,char *pat);
/* list subscribed mailboxes */
void (*lsub) (MAILSTREAM *stream,char *ref,char *pat);
/* subscribe to mailbox */
long (*subscribe) (MAILSTREAM *stream,char *mailbox);
/* unsubscribe from mailbox */
long (*unsubscribe) (MAILSTREAM *stream,char *mailbox);
/* create mailbox */
long (*create) (MAILSTREAM *stream,char *mailbox);
/* delete mailbox */
long (*mbxdel) (MAILSTREAM *stream,char *mailbox);
/* rename mailbox */
long (*mbxren) (MAILSTREAM *stream,char *old,char *newname);
/* status of mailbox */
long (*status) (MAILSTREAM *stream,char *mbx,long flags);
/* open mailbox */
MAILSTREAM *(*open) (MAILSTREAM *stream);
/* close mailbox */
void (*close) (MAILSTREAM *stream,long options);
/* fetch message "fast" attributes */
void (*fast) (MAILSTREAM *stream,char *sequence,long flags);
/* fetch message flags */
void (*msgflags) (MAILSTREAM *stream,char *sequence,long flags);
/* fetch message overview */
long (*overview) (MAILSTREAM *stream,overview_t ofn);
/* fetch message envelopes */
ENVELOPE *(*structure) (MAILSTREAM *stream,unsigned long msgno,BODY **body,
long flags);
/* return RFC-822 header */
char *(*header) (MAILSTREAM *stream,unsigned long msgno,
unsigned long *length,long flags);
/* return RFC-822 text */
long (*text) (MAILSTREAM *stream,unsigned long msgno,STRING *bs,long flags);
/* load cache */
long (*msgdata) (MAILSTREAM *stream,unsigned long msgno,char *section,
unsigned long first,unsigned long last,STRINGLIST *lines,
long flags);
/* return UID for message */
unsigned long (*uid) (MAILSTREAM *stream,unsigned long msgno);
/* return message number from UID */
unsigned long (*msgno) (MAILSTREAM *stream,unsigned long uid);
/* modify flags */
void (*flag) (MAILSTREAM *stream,char *sequence,char *flag,long flags);
/* per-message modify flags */
void (*flagmsg) (MAILSTREAM *stream,MESSAGECACHE *elt);
/* search for message based on criteria */
long (*search) (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,long flags);
/* sort messages */
unsigned long *(*sort) (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,
SORTPGM *pgm,long flags);
/* thread messages */
THREADNODE *(*thread) (MAILSTREAM *stream,char *type,char *charset,
SEARCHPGM *spg,long flag);
/* ping mailbox to see if still alive */
long (*ping) (MAILSTREAM *stream);
/* check for new messages */
void (*check) (MAILSTREAM *stream);
/* expunge deleted messages */
long (*expunge) (MAILSTREAM *stream,char *sequence,long options);
/* copy messages to another mailbox */
long (*copy) (MAILSTREAM *stream,char *sequence,char *mailbox,long options);
/* append string message to mailbox */
long (*append) (MAILSTREAM *stream,char *mailbox,append_t af,void *data);
/* garbage collect stream */
void (*gc) (MAILSTREAM *stream,long gcflags);
};
#include "linkage.h"
/* Compatibility support names for old interfaces */
#define GET_TRYALTFIRST GET_TRYSSLFIRST
#define SET_TRYALTFIRST SET_TRYSSLFIRST
#define GET_IMAPTRYALT GET_IMAPTRYSSL
#define SET_IMAPTRYALT SET_IMAPTRYSSL
#define OP_TRYALT OP_TRYSSL
#define altflag sslflag
#define mail_close(stream) \
mail_close_full (stream,NIL)
#define mail_fetchfast(stream,sequence) \
mail_fetch_fast (stream,sequence,NIL)
#define mail_fetchfast_full mail_fetch_fast
#define mail_fetchflags(stream,sequence) \
mail_fetch_flags (stream,sequence,NIL)
#define mail_fetchflags_full mail_fetch_flags
#define mail_fetchenvelope(stream,msgno) \
mail_fetch_structure (stream,msgno,NIL,NIL)
#define mail_fetchstructure(stream,msgno,body) \
mail_fetch_structure (stream,msgno,body,NIL)
#define mail_fetchstructure_full mail_fetch_structure
#define mail_fetchheader(stream,msgno) \
mail_fetch_header (stream,msgno,NIL,NIL,NIL,FT_PEEK)
#define mail_fetchheader_full(stream,msgno,lines,len,flags) \
mail_fetch_header (stream,msgno,NIL,lines,len,FT_PEEK | (flags))
#define mail_fetchtext(stream,msgno) \
mail_fetch_text (stream,msgno,NIL,NIL,NIL)
#define mail_fetchtext_full(stream,msgno,length,flags) \
mail_fetch_text (stream,msgno,NIL,length,flags)
#define mail_fetchbody(stream,msgno,section,length) \
mail_fetch_body (stream,msgno,section,length,NIL)
#define mail_fetchbody_full mail_fetch_body
#define mail_setflag(stream,sequence,flag) \
mail_flag (stream,sequence,flag,ST_SET)
#define mail_setflag_full(stream,sequence,flag,flags) \
mail_flag (stream,sequence,flag,ST_SET | (flags))
#define mail_clearflag(stream,sequence,flag) \
mail_flag (stream,sequence,flag,NIL)
#define mail_clearflag_full mail_flag
#define mail_search(stream,criteria) \
mail_search_full (stream,NIL,mail_criteria (criteria),SE_FREE);
#define mail_expunge(stream) \
mail_expunge_full (stream,NIL,NIL)
#define mail_copy(stream,sequence,mailbox) \
mail_copy_full (stream,sequence,mailbox,NIL)
#define mail_move(stream,sequence,mailbox) \
mail_copy_full (stream,sequence,mailbox,CP_MOVE)
#define mail_append(stream,mailbox,message) \
mail_append_full (stream,mailbox,NIL,NIL,message)
/* Interfaces for SVR4 locking brain-damage workaround */
/* Driver dispatching */
#define SAFE_DELETE(dtb,stream,mailbox) (*dtb->mbxdel) (stream,mailbox)
#define SAFE_RENAME(dtb,stream,old,newname) (*dtb->mbxren) (stream,old,newname)
#define SAFE_STATUS(dtb,stream,mbx,flags) (*dtb->status) (stream,mbx,flags)
#define SAFE_COPY(dtb,stream,sequence,mailbox,options) \
(*dtb->copy) (stream,sequence,mailbox,options)
#define SAFE_APPEND(dtb,stream,mailbox,af,data) \
(*dtb->append) (stream,mailbox,af,data)
#define SAFE_SCAN_CONTENTS(dtb,name,contents,csiz,fsiz) \
scan_contents (dtb,name,contents,csiz,fsiz)
/* Driver callbacks */
#define MM_EXISTS mm_exists
#define MM_EXPUNGED mm_expunged
#define MM_FLAGS mm_flags
#define MM_NOTIFY mm_notify
#define MM_STATUS mm_status
#define MM_LOG mm_log
#define MM_CRITICAL mm_critical
#define MM_NOCRITICAL mm_nocritical
#define MM_DISKERROR mm_diskerror
#define MM_FATAL mm_fatal
#define MM_APPEND(af) (*af)
/* Function prototypes */
void mm_searched (MAILSTREAM *stream,unsigned long number);
void mm_exists (MAILSTREAM *stream,unsigned long number);
void mm_expunged (MAILSTREAM *stream,unsigned long number);
void mm_flags (MAILSTREAM *stream,unsigned long number);
void mm_notify (MAILSTREAM *stream,char *string,long errflg);
void mm_list (MAILSTREAM *stream,int delimiter,char *name,long attributes);
void mm_lsub (MAILSTREAM *stream,int delimiter,char *name,long attributes);
void mm_status (MAILSTREAM *stream,char *mailbox,MAILSTATUS *status);
void mm_log (char *string,long errflg);
void mm_dlog (char *string);
void mm_login (NETMBX *mb,char *user,char *pwd,long trial);
void mm_critical (MAILSTREAM *stream);
void mm_nocritical (MAILSTREAM *stream);
long mm_diskerror (MAILSTREAM *stream,long errcode,long serious);
void mm_fatal (char *string);
void *mm_cache (MAILSTREAM *stream,unsigned long msgno,long op);
extern STRINGDRIVER mail_string;
void mail_versioncheck (char *version);
void mail_link (DRIVER *driver);
void *mail_parameters (MAILSTREAM *stream,long function,void *value);
DRIVER *mail_valid (MAILSTREAM *stream,char *mailbox,char *purpose);
DRIVER *mail_valid_net (char *name,DRIVER *drv,char *host,char *mailbox);
long mail_valid_net_parse (char *name,NETMBX *mb);
long mail_valid_net_parse_work (char *name,NETMBX *mb,char *service);
void mail_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents);
void mail_list (MAILSTREAM *stream,char *ref,char *pat);
void mail_lsub (MAILSTREAM *stream,char *ref,char *pat);
long mail_subscribe (MAILSTREAM *stream,char *mailbox);
long mail_unsubscribe (MAILSTREAM *stream,char *mailbox);
long mail_create (MAILSTREAM *stream,char *mailbox);
long mail_delete (MAILSTREAM *stream,char *mailbox);
long mail_rename (MAILSTREAM *stream,char *old,char *newname);
char *mail_utf7_valid (char *mailbox);
long mail_status (MAILSTREAM *stream,char *mbx,long flags);
long mail_status_default (MAILSTREAM *stream,char *mbx,long flags);
MAILSTREAM *mail_open (MAILSTREAM *stream,char *name,long options);
MAILSTREAM *mail_open_work (DRIVER *d,MAILSTREAM *stream,char *name,
long options);
MAILSTREAM *mail_close_full (MAILSTREAM *stream,long options);
MAILHANDLE *mail_makehandle (MAILSTREAM *stream);
void mail_free_handle (MAILHANDLE **handle);
MAILSTREAM *mail_stream (MAILHANDLE *handle);
void mail_fetch_fast (MAILSTREAM *stream,char *sequence,long flags);
void mail_fetch_flags (MAILSTREAM *stream,char *sequence,long flags);
void mail_fetch_overview (MAILSTREAM *stream,char *sequence,overview_t ofn);
void mail_fetch_overview_sequence (MAILSTREAM *stream,char *sequence,
overview_t ofn);
void mail_fetch_overview_default (MAILSTREAM *stream,overview_t ofn);
ENVELOPE *mail_fetch_structure (MAILSTREAM *stream,unsigned long msgno,
BODY **body,long flags);
char *mail_fetch_message (MAILSTREAM *stream,unsigned long msgno,
unsigned long *len,long flags);
char *mail_fetch_header (MAILSTREAM *stream,unsigned long msgno,char *section,
STRINGLIST *lines,unsigned long *len,long flags);
char *mail_fetch_text (MAILSTREAM *stream,unsigned long msgno,char *section,
unsigned long *len,long flags);
char *mail_fetch_mime (MAILSTREAM *stream,unsigned long msgno,char *section,
unsigned long *len,long flags);
char *mail_fetch_body (MAILSTREAM *stream,unsigned long msgno,char *section,
unsigned long *len,long flags);
long mail_partial_text (MAILSTREAM *stream,unsigned long msgno,char *section,
unsigned long first,unsigned long last,long flags);
long mail_partial_body (MAILSTREAM *stream,unsigned long msgno,char *section,
unsigned long first,unsigned long last,long flags);
char *mail_fetch_text_return (GETS_DATA *md,SIZEDTEXT *t,unsigned long *len);
char *mail_fetch_string_return (GETS_DATA *md,STRING *bs,unsigned long i,
unsigned long *len,long flags);
long mail_read (void *stream,unsigned long size,char *buffer);
unsigned long mail_uid (MAILSTREAM *stream,unsigned long msgno);
unsigned long mail_msgno (MAILSTREAM *stream,unsigned long uid);
void mail_fetchfrom (char *s,MAILSTREAM *stream,unsigned long msgno,
long length);
void mail_fetchsubject (char *s,MAILSTREAM *stream,unsigned long msgno,
long length);
MESSAGECACHE *mail_elt (MAILSTREAM *stream,unsigned long msgno);
void mail_flag (MAILSTREAM *stream,char *sequence,char *flag,long flags);
long mail_search_full (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,
long flags);
long mail_search_default (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,
long flags);
long mail_ping (MAILSTREAM *stream);
void mail_check (MAILSTREAM *stream);
long mail_expunge_full (MAILSTREAM *stream,char *sequence,long options);
long mail_copy_full (MAILSTREAM *stream,char *sequence,char *mailbox,
long options);
long mail_append_full (MAILSTREAM *stream,char *mailbox,char *flags,char *date,
STRING *message);
long mail_append_multiple (MAILSTREAM *stream,char *mailbox,append_t af,
void *data);
void mail_gc (MAILSTREAM *stream,long gcflags);
void mail_gc_msg (MESSAGE *msg,long gcflags);
void mail_gc_body (BODY *body);
BODY *mail_body (MAILSTREAM *stream,unsigned long msgno,
unsigned char *section);
char *mail_date (char *string,MESSAGECACHE *elt);
char *mail_cdate (char *string,MESSAGECACHE *elt);
long mail_parse_date (MESSAGECACHE *elt,unsigned char *string);
void mail_exists (MAILSTREAM *stream,unsigned long nmsgs);
void mail_recent (MAILSTREAM *stream,unsigned long recent);
void mail_expunged (MAILSTREAM *stream,unsigned long msgno);
void mail_lock (MAILSTREAM *stream);
void mail_unlock (MAILSTREAM *stream);
void mail_debug (MAILSTREAM *stream);
void mail_nodebug (MAILSTREAM *stream);
void mail_dlog (char *string,long flag);
long mail_match_lines (STRINGLIST *lines,STRINGLIST *msglines,long flags);
unsigned long mail_filter (char *text,unsigned long len,STRINGLIST *lines,
long flags);
long mail_search_msg (MAILSTREAM *stream,unsigned long msgno,char *section,
SEARCHPGM *pgm);
long mail_search_header_text (char *s,STRINGLIST *st);
long mail_search_header (SIZEDTEXT *hdr,STRINGLIST *st);
long mail_search_text (MAILSTREAM *stream,unsigned long msgno,char *section,
STRINGLIST *st,long flags);
long mail_search_body (MAILSTREAM *stream,unsigned long msgno,BODY *body,
char *prefix,unsigned long section,long flags);
long mail_search_string (SIZEDTEXT *s,char *charset,STRINGLIST **st);
long mail_search_string_work (SIZEDTEXT *s,STRINGLIST **st);
long mail_search_keyword (MAILSTREAM *stream,MESSAGECACHE *elt,STRINGLIST *st,
long flag);
long mail_search_addr (ADDRESS *adr,STRINGLIST *st);
char *mail_search_gets (readfn_t f,void *stream,unsigned long size,
GETS_DATA *md);
SEARCHPGM *mail_criteria (char *criteria);
int mail_criteria_date (unsigned short *date,char **r);
int mail_criteria_string (STRINGLIST **s,char **r);
unsigned short mail_shortdate (unsigned int year,unsigned int month,
unsigned int day);
SEARCHSET *mail_parse_set (char *s,char **ret);
SEARCHSET *mail_append_set (SEARCHSET *set,unsigned long msgno);
unsigned long *mail_sort (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,
SORTPGM *pgm,long flags);
unsigned long *mail_sort_cache (MAILSTREAM *stream,SORTPGM *pgm,SORTCACHE **sc,
long flags);
unsigned long *mail_sort_msgs (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,
SORTPGM *pgm,long flags);
SORTCACHE **mail_sort_loadcache (MAILSTREAM *stream,SORTPGM *pgm);
unsigned int mail_strip_subject (char *t,char **ret);
char *mail_strip_subject_wsp (char *s);
char *mail_strip_subject_blob (char *s);
int mail_sort_compare (const void *a1,const void *a2);
unsigned long mail_longdate (MESSAGECACHE *elt);
THREADNODE *mail_thread (MAILSTREAM *stream,char *type,char *charset,
SEARCHPGM *spg,long flags);
THREADNODE *mail_thread_msgs (MAILSTREAM *stream,char *type,char *charset,
SEARCHPGM *spg,long flags,sorter_t sorter);
THREADNODE *mail_thread_orderedsubject (MAILSTREAM *stream,char *charset,
SEARCHPGM *spg,long flags,
sorter_t sorter);
THREADNODE *mail_thread_references (MAILSTREAM *stream,char *charset,
SEARCHPGM *spg,long flags,
sorter_t sorter);
void mail_thread_loadcache (MAILSTREAM *stream,unsigned long uid,OVERVIEW *ov,
unsigned long msgno);
char *mail_thread_parse_msgid (char *s,char **ss);
STRINGLIST *mail_thread_parse_references (char *s,long flag);
long mail_thread_check_child (container_t mother,container_t daughter);
container_t mail_thread_prune_dummy (container_t msg,container_t ane);
container_t mail_thread_prune_dummy_work (container_t msg,container_t ane);
THREADNODE *mail_thread_c2node (MAILSTREAM *stream,container_t con,long flags);
THREADNODE *mail_thread_sort (THREADNODE *thr,THREADNODE **tc);
int mail_thread_compare_date (const void *a1,const void *a2);
long mail_sequence (MAILSTREAM *stream,unsigned char *sequence);
long mail_uid_sequence (MAILSTREAM *stream,unsigned char *sequence);
long mail_parse_flags (MAILSTREAM *stream,char *flag,unsigned long *uf);
long mail_usable_network_stream (MAILSTREAM *stream,char *name);
MESSAGECACHE *mail_new_cache_elt (unsigned long msgno);
ENVELOPE *mail_newenvelope (void);
ADDRESS *mail_newaddr (void);
BODY *mail_newbody (void);
BODY *mail_initbody (BODY *body);
PARAMETER *mail_newbody_parameter (void);
PART *mail_newbody_part (void);
MESSAGE *mail_newmsg (void);
STRINGLIST *mail_newstringlist (void);
SEARCHPGM *mail_newsearchpgm (void);
SEARCHHEADER *mail_newsearchheader (char *line,char *text);
SEARCHSET *mail_newsearchset (void);
SEARCHOR *mail_newsearchor (void);
SEARCHPGMLIST *mail_newsearchpgmlist (void);
SORTPGM *mail_newsortpgm (void);
THREADNODE *mail_newthreadnode (SORTCACHE *sc);
ACLLIST *mail_newacllist (void);
QUOTALIST *mail_newquotalist (void);
void mail_free_body (BODY **body);
void mail_free_body_data (BODY *body);
void mail_free_body_parameter (PARAMETER **parameter);
void mail_free_body_part (PART **part);
void mail_free_cache (MAILSTREAM *stream);
void mail_free_elt (MESSAGECACHE **elt);
void mail_free_envelope (ENVELOPE **env);
void mail_free_address (ADDRESS **address);
void mail_free_stringlist (STRINGLIST **string);
void mail_free_searchpgm (SEARCHPGM **pgm);
void mail_free_searchheader (SEARCHHEADER **hdr);
void mail_free_searchset (SEARCHSET **set);
void mail_free_searchor (SEARCHOR **orl);
void mail_free_searchpgmlist (SEARCHPGMLIST **pgl);
void mail_free_namespace (NAMESPACE **n);
void mail_free_sortpgm (SORTPGM **pgm);
void mail_free_threadnode (THREADNODE **thr);
void mail_free_acllist (ACLLIST **al);
void mail_free_quotalist (QUOTALIST **ql);
void auth_link (AUTHENTICATOR *auth);
char *mail_auth (char *mechanism,authresponse_t resp,int argc,char *argv[]);
AUTHENTICATOR *mail_lookup_auth (unsigned long i);
unsigned int mail_lookup_auth_name (char *mechanism,long flags);
NETSTREAM *net_open (NETMBX *mb,NETDRIVER *dv,unsigned long port,
NETDRIVER *ssld,char *ssls,unsigned long sslp);
NETSTREAM *net_open_work (NETDRIVER *dv,char *host,char *service,
unsigned long port,unsigned long portoverride,
unsigned long flags);
NETSTREAM *net_aopen (NETDRIVER *dv,NETMBX *mb,char *service,char *usrbuf);
char *net_getline (NETSTREAM *stream);
/* stream must be void* for use as readfn_t */
long net_getbuffer (void *stream,unsigned long size,char *buffer);
long net_soutr (NETSTREAM *stream,char *string);
long net_sout (NETSTREAM *stream,char *string,unsigned long size);
void net_close (NETSTREAM *stream);
char *net_host (NETSTREAM *stream);
char *net_remotehost (NETSTREAM *stream);
unsigned long net_port (NETSTREAM *stream);
char *net_localhost (NETSTREAM *stream);
long sm_subscribe (char *mailbox);
long sm_unsubscribe (char *mailbox);
char *sm_read (void **sdb);
void ssl_onceonlyinit (void);
char *ssl_start_tls (char *s);
void ssl_server_init (char *server);
/* Server I/O functions */
int PBIN (void);
char *PSIN (char *s,int n);
long PSINR (char *s,unsigned long n);
int PBOUT (int c);
long INWAIT (long seconds);
int PSOUT (char *s);
int PSOUTR (SIZEDTEXT *s);
int PFLUSH (void);