From 094ca96844842928810f14844413109fc6cdd890 Mon Sep 17 00:00:00 2001 From: Eduardo Chappa Date: Sun, 3 Feb 2013 00:59:38 -0700 Subject: Initial Alpine Version --- imap/src/c-client/mail.h | 1838 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1838 insertions(+) create mode 100644 imap/src/c-client/mail.h (limited to 'imap/src/c-client/mail.h') diff --git a/imap/src/c-client/mail.h b/imap/src/c-client/mail.h new file mode 100644 index 00000000..174993e1 --- /dev/null +++ b/imap/src/c-client/mail.h @@ -0,0 +1,1838 @@ +/* ======================================================================== + * Copyright 1988-2008 University of Washington + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * + * ======================================================================== + */ + +/* + * Program: Mailbox Access routines + * + * Author: Mark Crispin + * UW Technology + * University of Washington + * Seattle, WA 98195 + * Internet: MRC@Washington.EDU + * + * Date: 22 November 1989 + * Last Edited: 16 December 2008 + */ + +/* The Version */ + +#define CCLIENTVERSION "2007e" + +/* Build parameters */ + +#define CACHEINCREMENT 250 /* cache growth increments */ +#define MAILTMPLEN 1024 /* size of a temporary buffer */ +#define SENDBUFLEN 16385 /* size of temporary sending buffer, also + * used for SMTP commands and NETMBX generation + * buffer so shouldn't be made smaller than + * MAILTMPLEN. Note that there's a guard byte, + * so this is actually len+1. */ +#define MAXAUTHENTICATORS 8 /* maximum number of SASL authenticators */ + /* maximum number of messages */ +#define MAXMESSAGES (unsigned long) 1000000 +#define MAXLOGINTRIALS 3 /* maximum number of client login attempts */ +#define MAXWILDCARDS 10 /* maximum wildcards allowed in LIST/LSUB */ + + +/* These can't be changed without changing code */ + +#define NUSERFLAGS 30 /* maximum number of user flags */ +#define MAXUSERFLAG 50 /* maximum length of a user flag */ +#define BASEYEAR 1970 /* the year time began on Unix DON'T CHANGE */ + /* default for unqualified addresses */ +#define BADHOST ".MISSING-HOST-NAME." + /* default for syntax errors in addresses */ +#define ERRHOST ".SYNTAX-ERROR." + + +/* Coddle certain compilers' 6-character symbol limitation */ + +#ifdef __COMPILER_KCC__ +#include "shortsym.h" +#endif + + +/* Function status code */ + +#define NIL 0 /* convenient name */ +#define T 1 /* opposite of NIL */ +#define LONGT (long) 1 /* long T to pacify some compilers */ +#define VOIDT (void *) "" /* void T ditto */ + +/* Global and Driver Parameters */ + + /* 0xx: driver and authenticator flags */ +#define ENABLE_DRIVER (long) 1 +#define DISABLE_DRIVER (long) 2 +#define ENABLE_AUTHENTICATOR (long) 3 +#define DISABLE_AUTHENTICATOR (long) 4 +#define ENABLE_DEBUG (long) 5 +#define DISABLE_DEBUG (long) 6 +#define HIDE_AUTHENTICATOR (long) 7 +#define UNHIDE_AUTHENTICATOR (long) 8 + /* 1xx: c-client globals */ +#define GET_DRIVERS (long) 101 +#define SET_DRIVERS (long) 102 +#define GET_GETS (long) 103 +#define SET_GETS (long) 104 +#define GET_CACHE (long) 105 +#define SET_CACHE (long) 106 +#define GET_SMTPVERBOSE (long) 107 +#define SET_SMTPVERBOSE (long) 108 +#define GET_RFC822OUTPUT (long) 109 +#define SET_RFC822OUTPUT (long) 110 +#define GET_READPROGRESS (long) 111 +#define SET_READPROGRESS (long) 112 +#define GET_THREADERS (long) 113 +#define SET_THREADERS (long) 114 +#define GET_NAMESPACE (long) 115 +#define SET_NAMESPACE (long) 116 +#define GET_MAILPROXYCOPY (long) 117 +#define SET_MAILPROXYCOPY (long) 118 +#define GET_SERVICENAME (long) 119 +#define SET_SERVICENAME (long) 120 +#define GET_DRIVER (long) 121 +#define SET_DRIVER (long) 122 +#define GET_EXPUNGEATPING (long) 123 +#define SET_EXPUNGEATPING (long) 124 +#define GET_PARSEPHRASE (long) 125 +#define SET_PARSEPHRASE (long) 126 +#define GET_SSLDRIVER (long) 127 +#define SET_SSLDRIVER (long) 128 +#define GET_TRYSSLFIRST (long) 129 +#define SET_TRYSSLFIRST (long) 130 +#define GET_BLOCKNOTIFY (long) 131 +#define SET_BLOCKNOTIFY (long) 132 +#define GET_SORTRESULTS (long) 133 +#define SET_SORTRESULTS (long) 134 +#define GET_THREADRESULTS (long) 135 +#define SET_THREADRESULTS (long) 136 +#define GET_PARSELINE (long) 137 +#define SET_PARSELINE (long) 138 +#define GET_NEWSRCQUERY (long) 139 +#define SET_NEWSRCQUERY (long) 140 +#define GET_FREEENVELOPESPAREP (long) 141 +#define SET_FREEENVELOPESPAREP (long) 142 +#define GET_FREEELTSPAREP (long) 143 +#define SET_FREEELTSPAREP (long) 144 +#define GET_SSLSTART (long) 145 +#define SET_SSLSTART (long) 146 +#define GET_DEBUGSENSITIVE (long) 147 +#define SET_DEBUGSENSITIVE (long) 148 +#define GET_TCPDEBUG (long) 149 +#define SET_TCPDEBUG (long) 150 +#define GET_FREESTREAMSPAREP (long) 151 +#define SET_FREESTREAMSPAREP (long) 152 +#define GET_FREEBODYSPAREP (long) 153 +#define SET_FREEBODYSPAREP (long) 154 +#define GET_COPYUID (long) 155 +#define SET_COPYUID (long) 156 +#define GET_APPENDUID (long) 157 +#define SET_APPENDUID (long) 158 +#define GET_RFC822OUTPUTFULL (long) 159 +#define SET_RFC822OUTPUTFULL (long) 160 +#define GET_BLOCKENVINIT (long) 161 +#define SET_BLOCKENVINIT (long) 162 + + /* 2xx: environment */ +#define GET_USERNAME (long) 201 +#define SET_USERNAME (long) 202 +#define GET_HOMEDIR (long) 203 +#define SET_HOMEDIR (long) 204 +#define GET_LOCALHOST (long) 205 +#define SET_LOCALHOST (long) 206 +#define GET_SYSINBOX (long) 207 +#define SET_SYSINBOX (long) 208 +#define GET_USERPROMPT (long) 209 +#define SET_USERPROMPT (long) 210 +#define GET_DISABLEPLAINTEXT (long) 211 +#define SET_DISABLEPLAINTEXT (long) 212 +#define GET_CHROOTSERVER (long) 213 +#define SET_CHROOTSERVER (long) 214 +#define GET_ADVERTISETHEWORLD (long) 215 +#define SET_ADVERTISETHEWORLD (long) 216 +#define GET_DISABLEAUTOSHAREDNS (long) 217 +#define SET_DISABLEAUTOSHAREDNS (long) 218 +#define GET_MAILSUBDIR 219 +#define SET_MAILSUBDIR 220 +#define GET_DISABLE822TZTEXT 221 +#define SET_DISABLE822TZTEXT 222 +#define GET_LIMITEDADVERTISE (long) 223 +#define SET_LIMITEDADVERTISE (long) 224 +#define GET_LOGOUTHOOK (long) 225 +#define SET_LOGOUTHOOK (long) 226 +#define GET_LOGOUTDATA (long) 227 +#define SET_LOGOUTDATA (long) 228 +#define GET_EXTERNALAUTHID (long) 229 +#define SET_EXTERNALAUTHID (long) 230 +#define GET_SSLCAPATH (long) 231 +#define SET_SSLCAPATH (long) 232 + + /* 3xx: TCP/IP */ +#define GET_OPENTIMEOUT (long) 300 +#define SET_OPENTIMEOUT (long) 301 +#define GET_READTIMEOUT (long) 302 +#define SET_READTIMEOUT (long) 303 +#define GET_WRITETIMEOUT (long) 304 +#define SET_WRITETIMEOUT (long) 305 +#define GET_CLOSETIMEOUT (long) 306 +#define SET_CLOSETIMEOUT (long) 307 +#define GET_TIMEOUT (long) 308 +#define SET_TIMEOUT (long) 309 +#define GET_RSHTIMEOUT (long) 310 +#define SET_RSHTIMEOUT (long) 311 +#define GET_ALLOWREVERSEDNS (long) 312 +#define SET_ALLOWREVERSEDNS (long) 313 +#define GET_RSHCOMMAND (long) 314 +#define SET_RSHCOMMAND (long) 315 +#define GET_RSHPATH (long) 316 +#define SET_RSHPATH (long) 317 +#define GET_SSHTIMEOUT (long) 318 +#define SET_SSHTIMEOUT (long) 319 +#define GET_SSHCOMMAND (long) 320 +#define SET_SSHCOMMAND (long) 321 +#define GET_SSHPATH (long) 322 +#define SET_SSHPATH (long) 323 +#define GET_SSLCERTIFICATEQUERY (long) 324 +#define SET_SSLCERTIFICATEQUERY (long) 325 +#define GET_SSLFAILURE (long) 326 +#define SET_SSLFAILURE (long) 327 +#define GET_NEWSRCCANONHOST (long) 328 +#define SET_NEWSRCCANONHOST (long) 329 +#define GET_KINIT (long) 330 +#define SET_KINIT (long) 331 +#define GET_SSLCLIENTCERT (long) 332 +#define SET_SSLCLIENTCERT (long) 333 +#define GET_SSLCLIENTKEY (long) 334 +#define SET_SSLCLIENTKEY (long) 335 +#define GET_KERBEROS_CP_SVR_NAME (long) 336 +#define SET_KERBEROS_CP_SVR_NAME (long) 337 + + /* 4xx: network drivers */ +#define GET_MAXLOGINTRIALS (long) 400 +#define SET_MAXLOGINTRIALS (long) 401 +#define GET_LOOKAHEAD (long) 402 +#define SET_LOOKAHEAD (long) 403 +#define GET_IMAPPORT (long) 404 +#define SET_IMAPPORT (long) 405 +#define GET_PREFETCH (long) 406 +#define SET_PREFETCH (long) 407 +#define GET_CLOSEONERROR (long) 408 +#define SET_CLOSEONERROR (long) 409 +#define GET_POP3PORT (long) 410 +#define SET_POP3PORT (long) 411 +#define GET_UIDLOOKAHEAD (long) 412 +#define SET_UIDLOOKAHEAD (long) 413 +#define GET_NNTPPORT (long) 414 +#define SET_NNTPPORT (long) 415 +#define GET_IMAPENVELOPE (long) 416 +#define SET_IMAPENVELOPE (long) 417 +#define GET_IMAPREFERRAL (long) 418 +#define SET_IMAPREFERRAL (long) 419 +#define GET_SSLIMAPPORT (long) 420 +#define SET_SSLIMAPPORT (long) 421 +#define GET_SSLPOPPORT (long) 422 +#define SET_SSLPOPPORT (long) 423 +#define GET_SSLNNTPPORT (long) 424 +#define SET_SSLNNTPPORT (long) 425 +#define GET_SSLSMTPPORT (long) 426 +#define SET_SSLSMTPPORT (long) 427 +#define GET_SMTPPORT (long) 428 +#define SET_SMTPPORT (long) 429 +#define GET_IMAPEXTRAHEADERS (long) 430 +#define SET_IMAPEXTRAHEADERS (long) 431 +#define GET_ACL (long) 432 +#define SET_ACL (long) 433 +#define GET_LISTRIGHTS (long) 434 +#define SET_LISTRIGHTS (long) 435 +#define GET_MYRIGHTS (long) 436 +#define SET_MYRIGHTS (long) 437 +#define GET_QUOTA (long) 438 +#define SET_QUOTA (long) 439 +#define GET_QUOTAROOT (long) 440 +#define SET_QUOTAROOT (long) 441 +#define GET_IMAPTRYSSL (long) 442 +#define SET_IMAPTRYSSL (long) 443 +#define GET_FETCHLOOKAHEAD (long) 444 +#define SET_FETCHLOOKAHEAD (long) 445 +#define GET_NNTPRANGE (long) 446 +#define SET_NNTPRANGE (long) 447 +#define GET_NNTPHIDEPATH (long) 448 +#define SET_NNTPHIDEPATH (long) 449 +#define GET_SENDCOMMAND (long) 450 +#define SET_SENDCOMMAND (long) 451 +#define GET_IDLETIMEOUT (long) 452 +#define SET_IDLETIMEOUT (long) 453 +#define GET_FETCHLOOKAHEADLIMIT (long) 454 +#define SET_FETCHLOOKAHEADLIMIT (long) 455 + + /* 5xx: local file drivers */ +#define GET_MBXPROTECTION (long) 500 +#define SET_MBXPROTECTION (long) 501 +#define GET_DIRPROTECTION (long) 502 +#define SET_DIRPROTECTION (long) 503 +#define GET_LOCKPROTECTION (long) 504 +#define SET_LOCKPROTECTION (long) 505 +#define GET_FROMWIDGET (long) 506 +#define SET_FROMWIDGET (long) 507 +#define GET_NEWSACTIVE (long) 508 +#define SET_NEWSACTIVE (long) 509 +#define GET_NEWSSPOOL (long) 510 +#define SET_NEWSSPOOL (long) 511 +#define GET_NEWSRC (long) 512 +#define SET_NEWSRC (long) 513 +#define GET_EXTENSION (long) 514 +#define SET_EXTENSION (long) 515 +#define GET_DISABLEFCNTLLOCK (long) 516 +#define SET_DISABLEFCNTLLOCK (long) 517 +#define GET_LOCKEACCESERROR (long) 518 +#define SET_LOCKEACCESERROR (long) 519 +#define GET_LISTMAXLEVEL (long) 520 +#define SET_LISTMAXLEVEL (long) 521 +#define GET_ANONYMOUSHOME (long) 522 +#define SET_ANONYMOUSHOME (long) 523 +#define GET_FTPHOME (long) 524 +#define SET_FTPHOME (long) 525 +#define GET_PUBLICHOME (long) 526 +#define SET_PUBLICHOME (long) 527 +#define GET_SHAREDHOME (long) 528 +#define SET_SHAREDHOME (long) 529 +#define GET_MHPROFILE (long) 530 +#define SET_MHPROFILE (long) 531 +#define GET_MHPATH (long) 532 +#define SET_MHPATH (long) 533 +#define GET_ONETIMEEXPUNGEATPING (long) 534 +#define SET_ONETIMEEXPUNGEATPING (long) 535 +#define GET_USERHASNOLIFE (long) 536 +#define SET_USERHASNOLIFE (long) 537 +#define GET_FTPPROTECTION (long) 538 +#define SET_FTPPROTECTION (long) 539 +#define GET_PUBLICPROTECTION (long) 540 +#define SET_PUBLICPROTECTION (long) 541 +#define GET_SHAREDPROTECTION (long) 542 +#define SET_SHAREDPROTECTION (long) 543 +#define GET_LOCKTIMEOUT (long) 544 +#define SET_LOCKTIMEOUT (long) 545 +#define GET_NOTIMEZONES (long) 546 +#define SET_NOTIMEZONES (long) 547 +#define GET_HIDEDOTFILES (long) 548 +#define SET_HIDEDOTFILES (long) 549 +#define GET_FTPDIRPROTECTION (long) 550 +#define SET_FTPDIRPROTECTION (long) 551 +#define GET_PUBLICDIRPROTECTION (long) 552 +#define SET_PUBLICDIRPROTECTION (long) 553 +#define GET_SHAREDDIRPROTECTION (long) 554 +#define SET_SHAREDDIRPROTECTION (long) 555 +#define GET_TRUSTDNS (long) 556 +#define SET_TRUSTDNS (long) 557 +#define GET_SASLUSESPTRNAME (long) 558 +#define SET_SASLUSESPTRNAME (long) 559 +#define GET_NETFSSTATBUG (long) 560 +#define SET_NETFSSTATBUG (long) 561 +#define GET_SNARFMAILBOXNAME (long) 562 +#define SET_SNARFMAILBOXNAME (long) 563 +#define GET_SNARFINTERVAL (long) 564 +#define SET_SNARFINTERVAL (long) 565 +#define GET_SNARFPRESERVE (long) 566 +#define SET_SNARFPRESERVE (long) 567 +#define GET_INBOXPATH (long) 568 +#define SET_INBOXPATH (long) 569 +#define GET_DIRFMTTEST (long) 570 +#define SET_DIRFMTTEST (long) 571 +#define GET_SCANCONTENTS (long) 572 +#define SET_SCANCONTENTS (long) 573 +#define GET_MHALLOWINBOX (long) 574 +#define SET_MHALLOWINBOX (long) 575 + +/* Driver flags */ + +#define DR_DISABLE (long) 0x1 /* driver is disabled */ +#define DR_LOCAL (long) 0x2 /* local file driver */ +#define DR_MAIL (long) 0x4 /* supports mail */ +#define DR_NEWS (long) 0x8 /* supports news */ +#define DR_READONLY (long) 0x10 /* driver only allows readonly access */ +#define DR_NOFAST (long) 0x20 /* "fast" data is slow (whole msg fetch) */ +#define DR_NAMESPACE (long) 0x40/* driver has a special namespace */ +#define DR_LOWMEM (long) 0x80 /* low amounts of memory available */ +#define DR_LOCKING (long) 0x100 /* driver does locking */ +#define DR_CRLF (long) 0x200 /* driver internal form uses CRLF newlines */ +#define DR_NOSTICKY (long) 0x400/* driver does not support sticky UIDs */ +#define DR_RECYCLE (long) 0x800 /* driver does stream recycling */ +#define DR_XPOINT (long) 0x1000 /* needs to be checkpointed */ + /* driver has no real internal date */ +#define DR_NOINTDATE (long) 0x2000 + /* driver does not announce new mail */ +#define DR_NONEWMAIL (long) 0x4000 + /* driver does not announce new mail when RO */ +#define DR_NONEWMAILRONLY (long) 0x8000 + /* driver can be halfopen */ +#define DR_HALFOPEN (long) 0x10000 +#define DR_DIRFMT (long) 0x20000/* driver is a directory-format */ +#define DR_MODSEQ (long) 0x40000/* driver supports modseqs */ + + +/* Cache management function codes */ + +#define CH_INIT (long) 10 /* initialize cache */ +#define CH_SIZE (long) 11 /* (re-)size the cache */ +#define CH_MAKEELT (long) 30 /* return elt, make if needed */ +#define CH_ELT (long) 31 /* return elt if exists */ +#define CH_SORTCACHE (long) 35 /* return sortcache entry, make if needed */ +#define CH_FREE (long) 40 /* free space used by elt */ + /* free space used by sortcache */ +#define CH_FREESORTCACHE (long) 43 +#define CH_EXPUNGE (long) 45 /* delete elt pointer from list */ + + +/* Mailbox open options + * For compatibility with the past, OP_DEBUG must always be 1. + */ + +#define OP_DEBUG (long) 0x1 /* debug protocol negotiations */ +#define OP_READONLY (long) 0x2 /* read-only open */ +#define OP_ANONYMOUS (long) 0x4 /* anonymous open of newsgroup */ +#define OP_SHORTCACHE (long) 0x8/* short (elt-only) caching */ +#define OP_SILENT (long) 0x10 /* don't pass up events (internal use) */ +#define OP_PROTOTYPE (long) 0x20/* return driver prototype */ +#define OP_HALFOPEN (long) 0x40 /* half-open (IMAP connect but no select) */ +#define OP_EXPUNGE (long) 0x80 /* silently expunge recycle stream */ +#define OP_SECURE (long) 0x100 /* don't do non-secure authentication */ +#define OP_TRYSSL (long) 0x200 /* try SSL first */ + /* use multiple newsrc files */ +#define OP_MULNEWSRC (long) 0x400 +#define OP_NOKOD (long) 0x800 /* suppress kiss-of-death */ +#define OP_SNIFF (long) 0x1000 /* metadata only open */ + /* reserved for application use */ +#define OP_RESERVED (unsigned long) 0xff000000 + + +/* Net open options */ + + /* no error messages */ +#define NET_SILENT ((unsigned long) 0x80000000) + /* no validation of SSL certificates */ +#define NET_NOVALIDATECERT ((unsigned long) 0x40000000) + /* no open timeout */ +#define NET_NOOPENTIMEOUT ((unsigned long) 0x20000000) + /* TLS not SSL */ +#define NET_TLSCLIENT ((unsigned long) 0x10000000) + /* try SSL mode */ +#define NET_TRYSSL ((unsigned long) 0x8000000) + +/* Close options */ + +#define CL_EXPUNGE (long) 1 /* expunge silently */ + + +/* Fetch options */ + +#define FT_UID (long) 0x1 /* argument is a UID */ +#define FT_PEEK (long) 0x2 /* peek at data */ +#define FT_NOT (long) 0x4 /* NOT flag for header lines fetch */ +#define FT_INTERNAL (long) 0x8 /* text can be internal strings */ + /* IMAP prefetch text when fetching header */ +#define FT_PREFETCHTEXT (long) 0x20 +#define FT_NOHDRS (long) 0x40 /* suppress fetching extra headers (note that + this breaks news handling) */ +#define FT_NEEDENV (long) 0x80 /* (internal use) include envelope */ +#define FT_NEEDBODY (long) 0x100/* (internal use) include body structure */ + /* no fetch lookahead */ +#define FT_NOLOOKAHEAD (long) 0x200 + /* (internal use) lookahead in hdr searching */ +#define FT_SEARCHLOOKAHEAD (long) 0x400 + /* stringstruct return hack */ +#define FT_RETURNSTRINGSTRUCT (long) 0x800 + + +/* Flagging options */ + +#define ST_UID (long) 0x1 /* argument is a UID sequence */ +#define ST_SILENT (long) 0x2 /* don't return results */ +#define ST_SET (long) 0x4 /* set vs. clear */ + + +/* Expunge options */ + +#define EX_UID (long) 0x1 /* argument is a UID sequence */ + + +/* Copy options */ + +#define CP_UID (long) 0x1 /* argument is a UID sequence */ +#define CP_MOVE (long) 0x2 /* delete from source after copying */ + /* set debug in any created stream */ +#define CP_DEBUG (long) 0x20000000 + +/* Search/sort/thread options */ + +#define SE_UID (long) 0x1 /* return UID */ +#define SE_FREE (long) 0x2 /* free search program after finished */ +#define SE_NOPREFETCH (long) 0x4/* no search prefetching */ +#define SO_FREE (long) 0x8 /* free sort program after finished */ +#define SE_NOSERVER (long) 0x10 /* don't do server-based search/sort/thread */ +#define SE_RETAIN (long) 0x20 /* retain previous search results */ +#define SO_OVERVIEW (long) 0x40 /* use overviews in searching (NNTP only) */ +#define SE_NEEDBODY (long) 0x80 /* include body structure in prefetch */ +#define SE_NOHDRS (long) 0x100 /* suppress prefetching extra headers (note + that this breaks news handling) */ +#define SE_NOLOCAL (long) 0x200 /* no local retry (IMAP only) */ + +#define SO_NOSERVER SE_NOSERVER /* compatibility name */ +#define SE_SILLYOK (long) 0x400 /* allow silly searches */ + + +/* Status options */ + +#define SA_MESSAGES (long) 0x1 /* number of messages */ +#define SA_RECENT (long) 0x2 /* number of recent messages */ +#define SA_UNSEEN (long) 0x4 /* number of unseen messages */ +#define SA_UIDNEXT (long) 0x8 /* next UID to be assigned */ + /* UID validity value */ +#define SA_UIDVALIDITY (long) 0x10 + /* set OP_DEBUG on any created stream */ +#define SA_DEBUG (long) 0x10000000 + /* use multiple newsrcs */ +#define SA_MULNEWSRC (long) 0x20000000 + +/* Mailgets flags */ + +#define MG_UID (long) 0x1 /* message number is a UID */ +#define MG_COPY (long) 0x2 /* must return copy of argument */ + +/* SASL authenticator categories */ + +#define AU_SECURE (long) 0x1 /* /secure allowed */ +#define AU_AUTHUSER (long) 0x2 /* /authuser=xxx allowed */ + /* authenticator hidden */ +#define AU_HIDE (long) 0x10000000 + /* authenticator disabled */ +#define AU_DISABLE (long) 0x20000000 + + +/* Garbage collection flags */ + +#define GC_ELT (long) 0x1 /* message cache elements */ +#define GC_ENV (long) 0x2 /* envelopes and bodies */ +#define GC_TEXTS (long) 0x4 /* cached texts */ + + +/* mm_log()/mm_notify() condition codes */ + +#define WARN (long) 1 /* mm_log warning type */ +#define ERROR (long) 2 /* mm_log error type */ +#define PARSE (long) 3 /* mm_log parse error type */ +#define BYE (long) 4 /* mm_notify stream dying */ +#define TCPDEBUG (long) 5 /* mm_log TCP debug babble */ + + +/* Bits from mail_parse_flags(). Don't change these, since the header format + * used by tenex, mtx, and mbx corresponds to these bits. + */ + +#define fSEEN 0x1 +#define fDELETED 0x2 +#define fFLAGGED 0x4 +#define fANSWERED 0x8 +#define fOLD 0x10 +#define fDRAFT 0x20 + +#define fEXPUNGED 0x8000 /* internal flag */ + +/* Bits for mm_list() and mm_lsub() */ + +/* Note that (LATT_NOINFERIORS LATT_HASCHILDREN LATT_HASNOCHILDREN) and + * (LATT_NOSELECT LATT_MARKED LATT_UNMARKED) each have eight possible states, + * but only four of these are valid. The other four are silly states which + * while invalid can unfortunately be expressed in the IMAP protocol. + */ + + /* terminal node in hierarchy */ +#define LATT_NOINFERIORS (long) 0x1 + /* name can not be selected */ +#define LATT_NOSELECT (long) 0x2 + /* changed since last accessed */ +#define LATT_MARKED (long) 0x4 + /* accessed since last changed */ +#define LATT_UNMARKED (long) 0x8 + /* name has referral to remote mailbox */ +#define LATT_REFERRAL (long) 0x10 + /* has selectable inferiors */ +#define LATT_HASCHILDREN (long) 0x20 + /* has no selectable inferiors */ +#define LATT_HASNOCHILDREN (long) 0x40 + + +/* Sort functions */ + +#define SORTDATE 0 /* date */ +#define SORTARRIVAL 1 /* arrival date */ +#define SORTFROM 2 /* from */ +#define SORTSUBJECT 3 /* subject */ +#define SORTTO 4 /* to */ +#define SORTCC 5 /* cc */ +#define SORTSIZE 6 /* size */ + + +/* imapreferral_t codes */ + +#define REFAUTHFAILED (long) 0 /* authentication referral -- not logged in */ +#define REFAUTH (long) 1 /* authentication referral -- logged in */ +#define REFSELECT (long) 2 /* select referral */ +#define REFCREATE (long) 3 +#define REFDELETE (long) 4 +#define REFRENAME (long) 5 +#define REFSUBSCRIBE (long) 6 +#define REFUNSUBSCRIBE (long) 7 +#define REFSTATUS (long) 8 +#define REFCOPY (long) 9 +#define REFAPPEND (long) 10 + + +/* sendcommand_t codes */ + + /* expunge response deferred */ +#define SC_EXPUNGEDEFERRED (long) 1 + +/* Block notification codes */ + +#define BLOCK_NONE 0 /* not blocked */ +#define BLOCK_SENSITIVE 1 /* sensitive code, disallow alarms */ +#define BLOCK_NONSENSITIVE 2 /* non-sensitive code, allow alarms */ +#define BLOCK_DNSLOOKUP 10 /* blocked on DNS lookup */ +#define BLOCK_TCPOPEN 11 /* blocked on TCP open */ +#define BLOCK_TCPREAD 12 /* blocked on TCP read */ +#define BLOCK_TCPWRITE 13 /* blocked on TCP write */ +#define BLOCK_TCPCLOSE 14 /* blocked on TCP close */ +#define BLOCK_FILELOCK 20 /* blocked on file locking */ + + +/* In-memory sized-text */ + +#define SIZEDTEXT struct mail_sizedtext + +SIZEDTEXT { + unsigned char *data; /* text */ + unsigned long size; /* size of text in octets */ +}; + + +/* String list */ + +#define STRINGLIST struct string_list + +STRINGLIST { + SIZEDTEXT text; /* string text */ + STRINGLIST *next; +}; + + +/* Parse results from mail_valid_net_parse */ + +#define NETMAXHOST 256 +#define NETMAXUSER 65 +#define NETMAXMBX (MAILTMPLEN/4) +#define NETMAXSRV 21 +typedef struct net_mailbox { + char host[NETMAXHOST]; /* host name (may be canonicalized) */ + char orighost[NETMAXHOST]; /* host name before canonicalization */ + char user[NETMAXUSER]; /* user name */ + char authuser[NETMAXUSER]; /* authentication user name */ + char mailbox[NETMAXMBX]; /* mailbox name */ + char service[NETMAXSRV]; /* service name */ + unsigned long port; /* TCP port number */ + unsigned int anoflag : 1; /* anonymous */ + unsigned int dbgflag : 1; /* debug flag */ + unsigned int secflag : 1; /* secure flag */ + unsigned int sslflag : 1; /* SSL driver flag */ + unsigned int trysslflag : 1; /* try SSL driver first flag */ + unsigned int novalidate : 1; /* don't validate certificates */ + unsigned int tlsflag : 1; /* TLS flag */ + unsigned int notlsflag : 1; /* do not do TLS flag */ + unsigned int readonlyflag : 1;/* want readonly */ + unsigned int norsh : 1; /* don't use rsh/ssh */ + unsigned int loser : 1; /* server is a loser */ + unsigned int tlssslv23 : 1; /* force SSLv23 client method over TLS */ +} NETMBX; + +/* Item in an address list */ + +#define ADDRESS struct mail_address + +ADDRESS { + char *personal; /* personal name phrase */ + char *adl; /* at-domain-list source route */ + char *mailbox; /* mailbox name */ + char *host; /* domain name of mailbox's host */ + char *error; /* error in address from SMTP module */ + struct { + char *type; /* address type (default "rfc822") */ + char *addr; /* address as xtext */ + } orcpt; + ADDRESS *next; /* pointer to next address in list */ +}; + + +/* Message envelope */ + +typedef struct mail_envelope { + unsigned int ngpathexists : 1; /* newsgroups may be bogus */ + unsigned int incomplete : 1; /* envelope may be incomplete */ + unsigned int imapenvonly : 1; /* envelope only has IMAP envelope */ + char *remail; /* remail header if any */ + ADDRESS *return_path; /* error return address */ + unsigned char *date; /* message composition date string */ + ADDRESS *from; /* originator address list */ + ADDRESS *sender; /* sender address list */ + ADDRESS *reply_to; /* reply address list */ + char *subject; /* message subject string */ + ADDRESS *to; /* primary recipient list */ + ADDRESS *cc; /* secondary recipient list */ + ADDRESS *bcc; /* blind secondary recipient list */ + char *in_reply_to; /* replied message ID */ + char *message_id; /* message ID */ + char *newsgroups; /* USENET newsgroups */ + char *followup_to; /* USENET reply newsgroups */ + char *references; /* USENET references */ + void *sparep; /* spare pointer reserved for main program */ +} ENVELOPE; + +/* Primary body types */ +/* If you change any of these you must also change body_types in rfc822.c */ + +#define TYPETEXT 0 /* unformatted text */ +#define TYPEMULTIPART 1 /* multiple part */ +#define TYPEMESSAGE 2 /* encapsulated message */ +#define TYPEAPPLICATION 3 /* application data */ +#define TYPEAUDIO 4 /* audio */ +#define TYPEIMAGE 5 /* static image */ +#define TYPEVIDEO 6 /* video */ +#define TYPEMODEL 7 /* model */ +#define TYPEOTHER 8 /* unknown */ +#define TYPEMAX 15 /* maximum type code */ + + +/* Body encodings */ +/* If you change any of these you must also change body_encodings in rfc822.c + */ + +#define ENC7BIT 0 /* 7 bit SMTP semantic data */ +#define ENC8BIT 1 /* 8 bit SMTP semantic data */ +#define ENCBINARY 2 /* 8 bit binary data */ +#define ENCBASE64 3 /* base-64 encoded data */ +#define ENCQUOTEDPRINTABLE 4 /* human-readable 8-as-7 bit data */ +#define ENCOTHER 5 /* unknown */ +#define ENCMAX 10 /* maximum encoding code */ + + +/* Body contents */ + +#define BODY struct mail_bodystruct +#define MESSAGE struct mail_body_message +#define PARAMETER struct mail_body_parameter +#define PART struct mail_body_part +#define PARTTEXT struct mail_body_text + +/* Message body text */ + +PARTTEXT { + unsigned long offset; /* offset from body origin */ + SIZEDTEXT text; /* text */ +}; + + +/* Message body structure */ + +BODY { + unsigned short type; /* body primary type */ + unsigned short encoding; /* body transfer encoding */ + char *subtype; /* subtype string */ + PARAMETER *parameter; /* parameter list */ + char *id; /* body identifier */ + char *description; /* body description */ + struct { /* body disposition */ + char *type; /* disposition type */ + PARAMETER *parameter; /* disposition parameters */ + } disposition; + STRINGLIST *language; /* body language */ + char *location; /* body content URI */ + PARTTEXT mime; /* MIME header */ + PARTTEXT contents; /* body part contents */ + union { /* different ways of accessing contents */ + PART *part; /* body part list */ + MESSAGE *msg; /* body encapsulated message */ + } nested; + struct { + unsigned long lines; /* size of text in lines */ + unsigned long bytes; /* size of text in octets */ + } size; + char *md5; /* MD5 checksum */ + void *sparep; /* spare pointer reserved for main program */ +}; + + +/* Parameter list */ + +PARAMETER { + char *attribute; /* parameter attribute name */ + char *value; /* parameter value */ + PARAMETER *next; /* next parameter in list */ +}; + + +/* Multipart content list */ + +PART { + BODY body; /* body information for this part */ + PART *next; /* next body part */ +}; + + +/* RFC-822 Message */ + +MESSAGE { + ENVELOPE *env; /* message envelope */ + BODY *body; /* message body */ + PARTTEXT full; /* full message */ + STRINGLIST *lines; /* lines used to filter header */ + PARTTEXT header; /* header text */ + PARTTEXT text; /* body text */ +}; + +/* Entry in the message cache array */ + +typedef struct message_cache { + unsigned long msgno; /* message number */ + unsigned int lockcount : 8; /* non-zero if multiple references */ + unsigned long rfc822_size; /* # of bytes of message as raw RFC822 */ + struct { /* c-client internal use only */ + unsigned long uid; /* message unique ID */ + unsigned long mod; /* modseq */ + PARTTEXT special; /* special text pointers */ + MESSAGE msg; /* internal message pointers */ + union { /* driver internal use */ + unsigned long data; + void *ptr; + } spare; + unsigned int sequence : 1; /* saved sequence bit */ + unsigned int dirty : 1; /* driver internal use */ + unsigned int filter : 1; /* driver internal use */ + unsigned int ghost : 1; /* driver internal use */ + } private; + /* internal date */ + unsigned int day : 5; /* day of month (1-31) */ + unsigned int month : 4; /* month of year (1-12) */ + unsigned int year : 7; /* year since BASEYEAR (expires in 127 yrs) */ + unsigned int hours: 5; /* hours (0-23) */ + unsigned int minutes: 6; /* minutes (0-59) */ + unsigned int seconds: 6; /* seconds (0-59) */ + unsigned int zoccident : 1; /* non-zero if west of UTC */ + unsigned int zhours : 4; /* hours from UTC (0-12) */ + unsigned int zminutes: 6; /* minutes (0-59) */ + /* system flags */ + unsigned int seen : 1; /* system Seen flag */ + unsigned int deleted : 1; /* system Deleted flag */ + unsigned int flagged : 1; /* system Flagged flag */ + unsigned int answered : 1; /* system Answered flag */ + unsigned int draft : 1; /* system Draft flag */ + unsigned int recent : 1; /* system Recent flag */ + /* message status */ + unsigned int valid : 1; /* elt has valid flags */ + unsigned int searched : 1; /* message was searched */ + unsigned int sequence : 1; /* message is in sequence */ + /* reserved for use by main program */ + 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 */ + void *sparep; /* spare pointer */ + unsigned long user_flags; /* user-assignable flags */ +} MESSAGECACHE; + +/* String structure */ + +#define STRINGDRIVER struct string_driver + +typedef struct mailstring { + void *data; /* driver-dependent data */ + unsigned long data1; /* driver-dependent data */ + unsigned long size; /* total length of string */ + char *chunk; /* base address of chunk */ + unsigned long chunksize; /* size of chunk */ + unsigned long offset; /* offset of this chunk in base */ + char *curpos; /* current position in chunk */ + unsigned long cursize; /* number of bytes remaining in chunk */ + STRINGDRIVER *dtb; /* driver that handles this type of string */ +} STRING; + + +/* Dispatch table for string driver */ + +STRINGDRIVER { + /* initialize string driver */ + void (*init) (STRING *s,void *data,unsigned long size); + /* get next character in string */ + char (*next) (STRING *s); + /* set position in string */ + void (*setpos) (STRING *s,unsigned long i); +}; + + +/* Stringstruct access routines */ + +#define INIT(s,d,data,size) ((*((s)->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, char *host); +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); -- cgit v1.2.3-54-g00ecf