mail.h
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:51k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: Mailbox Access routines
  3.  *
  4.  * Author: Mark Crispin
  5.  * Networks and Distributed Computing
  6.  * Computing & Communications
  7.  * University of Washington
  8.  * Administration Building, AG-44
  9.  * Seattle, WA  98195
  10.  * Internet: MRC@CAC.Washington.EDU
  11.  *
  12.  * Date: 22 November 1989
  13.  * Last Edited: 1 November 1999
  14.  *
  15.  * Copyright 1999 by the University of Washington
  16.  *
  17.  *  Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose and without fee is hereby granted, provided
  19.  * that the above copyright notice appears in all copies and that both the
  20.  * above copyright notice and this permission notice appear in supporting
  21.  * documentation, and that the name of the University of Washington not be
  22.  * used in advertising or publicity pertaining to distribution of the software
  23.  * without specific, written prior permission.  This software is made
  24.  * available "as is", and
  25.  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
  26.  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
  27.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
  28.  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
  29.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  30.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
  31.  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
  32.  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33.  *
  34.  */
  35. /* Build parameters */
  36. #define CACHEINCREMENT 250 /* cache growth increments */
  37. #define MAILTMPLEN 1024 /* size of a temporary buffer */
  38. #define MAXMESSAGESIZE 65000 /* MS-DOS: maximum text buffer size
  39.  * other:  initial text buffer size */
  40. #define NUSERFLAGS 30 /* # of user flags (current servers 30 max) */
  41. #define BASEYEAR 1970 /* the year time began on Unix (note: mx
  42.  * driver depends upon this matching Unix) */
  43. /* default for unqualified addresses */
  44. #define BADHOST ".MISSING-HOST-NAME."
  45. /* default for syntax errors in addresses */
  46. #define ERRHOST ".SYNTAX-ERROR."
  47. /* Coddle certain compilers' 6-character symbol limitation */
  48. #ifdef __COMPILER_KCC__
  49. #include "shortsym.h"
  50. #endif
  51. /* Constants */
  52. #define NIL 0 /* convenient name */
  53. #define T 1 /* opposite of NIL */
  54. #define LONGT (long) 1 /* long T */
  55. #define WARN (long) 1 /* mm_log warning type */
  56. #define ERROR (long) 2 /* mm_log error type */
  57. #define PARSE (long) 3 /* mm_log parse error type */
  58. #define BYE (long) 4 /* mm_notify stream dying */
  59. #define DELIM '377' /* strtok delimiter character */
  60. /* Bits from mail_parse_flags().  Don't change these, since the header format
  61.  * used by tenex, mtx, and mbx corresponds to these bits.
  62.  */
  63. #define fSEEN 1
  64. #define fDELETED 2
  65. #define fFLAGGED 4
  66. #define fANSWERED 8
  67. #define fOLD 16
  68. #define fDRAFT 32
  69. /* Global and Driver Parameters */
  70. /* 0xx: driver and authenticator flags */
  71. #define ENABLE_DRIVER (long) 1
  72. #define DISABLE_DRIVER (long) 2
  73. #define ENABLE_AUTHENTICATOR (long) 3
  74. #define DISABLE_AUTHENTICATOR (long) 4
  75. /* 1xx: c-client globals */
  76. #define GET_DRIVERS (long) 101
  77. #define SET_DRIVERS (long) 102
  78. #define GET_GETS (long) 103
  79. #define SET_GETS (long) 104
  80. #define GET_CACHE (long) 105
  81. #define SET_CACHE (long) 106
  82. #define GET_SMTPVERBOSE (long) 107
  83. #define SET_SMTPVERBOSE (long) 108
  84. #define GET_RFC822OUTPUT (long) 109
  85. #define SET_RFC822OUTPUT (long) 110
  86. #define GET_READPROGRESS (long) 111
  87. #define SET_READPROGRESS (long) 112
  88. #define GET_THREADERS (long) 113
  89. #define SET_THREADERS (long) 114
  90. #define GET_NAMESPACE (long) 115
  91. #define SET_NAMESPACE (long) 116
  92. #define GET_MAILPROXYCOPY (long) 117
  93. #define SET_MAILPROXYCOPY (long) 118
  94. #define GET_SERVICENAME (long) 119
  95. #define SET_SERVICENAME (long) 120
  96. #define GET_DRIVER (long) 121
  97. #define SET_DRIVER (long) 122
  98. #define GET_EXPUNGEATPING (long) 123
  99. #define SET_EXPUNGEATPING (long) 124
  100. #define GET_PARSEPHRASE (long) 125
  101. #define SET_PARSEPHRASE (long) 126
  102. #define GET_ALTDRIVER (long) 127
  103. #define SET_ALTDRIVER (long) 128
  104. #define GET_ALTDRIVERNAME (long) 129
  105. #define SET_ALTDRIVERNAME (long) 130
  106. #define GET_TRYALTFIRST (long) 131
  107. #define SET_TRYALTFIRST (long) 132
  108. #define GET_BLOCKNOTIFY (long) 133
  109. #define SET_BLOCKNOTIFY (long) 134
  110. #define GET_SORTRESULTS (long) 135
  111. #define SET_SORTRESULTS (long) 136
  112. #define GET_THREADRESULTS (long) 137
  113. #define SET_THREADRESULTS (long) 138
  114. #define GET_PARSELINE (long) 139
  115. #define SET_PARSELINE (long) 140
  116. /* 2xx: environment */
  117. #define GET_USERNAME (long) 201
  118. #define SET_USERNAME (long) 202
  119. #define GET_HOMEDIR (long) 203
  120. #define SET_HOMEDIR (long) 204
  121. #define GET_LOCALHOST (long) 205
  122. #define SET_LOCALHOST (long) 206
  123. #define GET_SYSINBOX (long) 207
  124. #define SET_SYSINBOX (long) 208
  125. #define GET_USERPROMPT (long) 209
  126. #define SET_USERPROMPT (long) 210
  127. /* 3xx: TCP/IP */
  128. #define GET_OPENTIMEOUT (long) 300
  129. #define SET_OPENTIMEOUT (long) 301
  130. #define GET_READTIMEOUT (long) 302
  131. #define SET_READTIMEOUT (long) 303
  132. #define GET_WRITETIMEOUT (long) 304
  133. #define SET_WRITETIMEOUT (long) 305
  134. #define GET_CLOSETIMEOUT (long) 306
  135. #define SET_CLOSETIMEOUT (long) 307
  136. #define GET_TIMEOUT (long) 308
  137. #define SET_TIMEOUT (long) 309
  138. #define GET_RSHTIMEOUT (long) 310
  139. #define SET_RSHTIMEOUT (long) 311
  140. #define GET_ALLOWREVERSEDNS (long) 312
  141. #define SET_ALLOWREVERSEDNS (long) 313
  142. #define GET_RSHCOMMAND (long) 314
  143. #define SET_RSHCOMMAND (long) 315
  144. #define GET_RSHPATH (long) 316
  145. #define SET_RSHPATH (long) 317
  146. #define GET_SSHTIMEOUT (long) 318
  147. #define SET_SSHTIMEOUT (long) 319
  148. #define GET_SSHCOMMAND (long) 320
  149. #define SET_SSHCOMMAND (long) 321
  150. #define GET_SSHPATH (long) 322
  151. #define SET_SSHPATH (long) 323
  152. /* 4xx: network drivers */
  153. #define GET_MAXLOGINTRIALS (long) 400
  154. #define SET_MAXLOGINTRIALS (long) 401
  155. #define GET_LOOKAHEAD (long) 402
  156. #define SET_LOOKAHEAD (long) 403
  157. #define GET_IMAPPORT (long) 404
  158. #define SET_IMAPPORT (long) 405
  159. #define GET_PREFETCH (long) 406
  160. #define SET_PREFETCH (long) 407
  161. #define GET_CLOSEONERROR (long) 408
  162. #define SET_CLOSEONERROR (long) 409
  163. #define GET_POP3PORT (long) 410
  164. #define SET_POP3PORT (long) 411
  165. #define GET_UIDLOOKAHEAD (long) 412
  166. #define SET_UIDLOOKAHEAD (long) 413
  167. #define GET_NNTPPORT (long) 414
  168. #define SET_NNTPPORT (long) 415
  169. #define GET_IMAPENVELOPE (long) 416
  170. #define SET_IMAPENVELOPE (long) 417
  171. #define GET_IMAPREFERRAL (long) 418
  172. #define SET_IMAPREFERRAL (long) 419
  173. #define GET_ALTIMAPNAME (long) 420
  174. #define SET_ALTIMAPNAME (long) 421
  175. #define GET_ALTIMAPPORT (long) 422
  176. #define SET_ALTIMAPPORT (long) 423
  177. #define GET_ALTPOPNAME (long) 424
  178. #define SET_ALTPOPNAME (long) 425
  179. #define GET_ALTPOPPORT (long) 426
  180. #define SET_ALTPOPPORT (long) 427
  181. #define GET_ALTNNTPNAME (long) 428
  182. #define SET_ALTNNTPNAME (long) 429
  183. #define GET_ALTNNTPPORT (long) 430
  184. #define SET_ALTNNTPPORT (long) 431
  185. #define GET_ALTSMTPNAME (long) 432
  186. #define SET_ALTSMTPNAME (long) 433
  187. #define GET_ALTSMTPPORT (long) 434
  188. #define SET_ALTSMTPPORT (long) 435
  189. #define GET_SMTPPORT (long) 436
  190. #define SET_SMTPPORT (long) 437
  191. #define GET_IMAPEXTRAHEADERS (long) 438
  192. #define SET_IMAPEXTRAHEADERS (long) 439
  193. /* 5xx: local file drivers */
  194. #define GET_MBXPROTECTION (long) 500
  195. #define SET_MBXPROTECTION (long) 501
  196. #define GET_DIRPROTECTION (long) 502
  197. #define SET_DIRPROTECTION (long) 503
  198. #define GET_LOCKPROTECTION (long) 504
  199. #define SET_LOCKPROTECTION (long) 505
  200. #define GET_FROMWIDGET (long) 506
  201. #define SET_FROMWIDGET (long) 507
  202. #define GET_NEWSACTIVE (long) 508
  203. #define SET_NEWSACTIVE (long) 509
  204. #define GET_NEWSSPOOL (long) 510
  205. #define SET_NEWSSPOOL (long) 511
  206. #define GET_NEWSRC (long) 512
  207. #define SET_NEWSRC (long) 513
  208. #define GET_EXTENSION (long) 514
  209. #define SET_EXTENSION (long) 515
  210. #define GET_DISABLEFCNTLLOCK (long) 516
  211. #define SET_DISABLEFCNTLLOCK (long) 517
  212. #define GET_LOCKEACCESERROR (long) 518
  213. #define SET_LOCKEACCESERROR (long) 519
  214. #define GET_LISTMAXLEVEL (long) 520
  215. #define SET_LISTMAXLEVEL (long) 521
  216. #define GET_ANONYMOUSHOME (long) 522
  217. #define SET_ANONYMOUSHOME (long) 523
  218. #define GET_FTPHOME (long) 524
  219. #define SET_FTPHOME (long) 525
  220. #define GET_PUBLICHOME (long) 526
  221. #define SET_PUBLICHOME (long) 527
  222. #define GET_SHAREDHOME (long) 528
  223. #define SET_SHAREDHOME (long) 529
  224. #define GET_MHPROFILE (long) 530
  225. #define SET_MHPROFILE (long) 531
  226. #define GET_MHPATH (long) 532
  227. #define SET_MHPATH (long) 533
  228. #define GET_ONETIMEEXPUNGEATPING (long) 534
  229. #define SET_ONETIMEEXPUNGEATPING (long) 535
  230. #define GET_USERHASNOLIFE (long) 536
  231. #define SET_USERHASNOLIFE (long) 537
  232. #define GET_FTPPROTECTION (long) 538
  233. #define SET_FTPPROTECTION (long) 539
  234. #define GET_PUBLICPROTECTION (long) 540
  235. #define SET_PUBLICPROTECTION (long) 541
  236. #define GET_SHAREDPROTECTION (long) 542
  237. #define SET_SHAREDPROTECTION (long) 543
  238. #define GET_LOCKTIMEOUT (long) 544
  239. #define SET_LOCKTIMEOUT (long) 545
  240. #define GET_NOTIMEZONES (long) 546
  241. #define SET_NOTIMEZONES (long) 547
  242. /* Driver flags */
  243. #define DR_DISABLE (long) 1 /* driver is disabled */
  244. #define DR_LOCAL (long) 2 /* local file driver */
  245. #define DR_MAIL (long) 4 /* supports mail */
  246. #define DR_NEWS (long) 8 /* supports news */
  247. #define DR_READONLY (long) 16 /* driver only allows readonly access */
  248. #define DR_NOFAST (long) 32 /* "fast" data is slow (whole msg fetch) */
  249. #define DR_NAMESPACE (long) 64 /* driver has a special namespace */
  250. #define DR_LOWMEM (long) 128 /* low amounts of memory available */
  251. #define DR_LOCKING (long) 256 /* driver does locking */
  252. #define DR_CRLF (long) 512 /* driver internal form uses CRLF newlines */
  253. #define DR_NOSTICKY (long) 1024 /* driver does not support sticky UIDs */
  254. #define DR_RECYCLE (long) 2048 /* driver does stream recycling */
  255. /* Cache management function codes */
  256. #define CH_INIT (long) 10 /* initialize cache */
  257. #define CH_SIZE (long) 11 /* (re-)size the cache */
  258. #define CH_MAKEELT (long) 30 /* return elt, make if needed */
  259. #define CH_ELT (long) 31 /* return elt if exists */
  260. #define CH_SORTCACHE (long) 35 /* return sortcache entry, make if needed */
  261. #define CH_FREE (long) 40 /* free space used by elt */
  262. /* free space used by sortcache */
  263. #define CH_FREESORTCACHE (long) 43
  264. #define CH_EXPUNGE (long) 45 /* delete elt pointer from list */
  265. /* Open options */
  266. #define OP_DEBUG (long) 1 /* debug protocol negotiations */
  267. #define OP_READONLY (long) 2 /* read-only open */
  268. #define OP_ANONYMOUS (long) 4 /* anonymous open of newsgroup */
  269. #define OP_SHORTCACHE (long) 8 /* short (elt-only) caching */
  270. #define OP_SILENT (long) 16 /* don't pass up events (internal use) */
  271. #define OP_PROTOTYPE (long) 32 /* return driver prototype */
  272. #define OP_HALFOPEN (long) 64 /* half-open (IMAP connect but no select) */
  273. #define OP_EXPUNGE (long) 128 /* silently expunge recycle stream */
  274. #define OP_SECURE (long) 256 /* don't do non-secure authentication */
  275. #define OP_TRYALT (long) 512 /* try alternate first */
  276. /* Close options */
  277. #define CL_EXPUNGE (long) 1 /* expunge silently */
  278. /* Fetch options */
  279. #define FT_UID (long) 1 /* argument is a UID */
  280. #define FT_PEEK (long) 2 /* peek at data */
  281. #define FT_NOT (long) 4 /* NOT flag for header lines fetch */
  282. #define FT_INTERNAL (long) 8 /* text can be internal strings */
  283. #define FT_PREFETCHTEXT (long) 16 /* IMAP prefetch text when fetching header */
  284. /* Flagging options */
  285. #define ST_UID (long) 1 /* argument is a UID sequence */
  286. #define ST_SILENT (long) 2 /* don't return results */
  287. #define ST_SET (long) 4 /* set vs. clear */
  288. /* Copy options */
  289. #define CP_UID (long) 1 /* argument is a UID sequence */
  290. #define CP_MOVE (long) 2 /* delete from source after copying */
  291. /* Search/sort options */
  292. #define SE_UID (long) 1 /* return UID */
  293. #define SE_FREE (long) 2 /* free search program after finished */
  294. #define SE_NOPREFETCH (long) 4 /* no search prefetching */
  295. #define SO_FREE (long) 8 /* free sort program after finished */
  296. #define SO_NOSERVER (long) 16 /* don't do server-based sort */
  297. #define SE_RETAIN (long) 32 /* retain previous search results */
  298. #define SO_OVERVIEW (long) 64 /* use overviews in searching (NNTP only) */
  299. /* Status options */
  300. #define SA_MESSAGES (long) 1 /* number of messages */
  301. #define SA_RECENT (long) 2 /* number of recent messages */
  302. #define SA_UNSEEN (long) 4 /* number of unseen messages */
  303. #define SA_UIDNEXT (long) 8 /* next UID to be assigned */
  304. #define SA_UIDVALIDITY (long) 16/* UID validity value */
  305. /* Mailgets flags */
  306. #define MG_UID (long) 1 /* message number is a UID */
  307. #define MG_COPY (long) 2 /* must return copy of argument */
  308. /* Garbage collection flags */
  309. #define GC_ELT (long) 1 /* message cache elements */
  310. #define GC_ENV (long) 2 /* envelopes and bodies */
  311. #define GC_TEXTS (long) 4 /* cached texts */
  312. /* Bits for mm_list() and mm_lsub() */
  313. #define LATT_NOINFERIORS (long) 1
  314. #define LATT_NOSELECT (long) 2
  315. #define LATT_MARKED (long) 4
  316. #define LATT_UNMARKED (long) 8
  317. #define LATT_REFERRAL (long) 16
  318. /* Sort functions */
  319. #define SORTDATE 0 /* date */
  320. #define SORTARRIVAL 1 /* arrival date */
  321. #define SORTFROM 2 /* from */
  322. #define SORTSUBJECT 3 /* subject */
  323. #define SORTTO 4 /* to */
  324. #define SORTCC 5 /* cc */
  325. #define SORTSIZE 6 /* size */
  326. /* imapreferral_t codes */
  327. #define REFAUTHFAILED (long) 0 /* authentication referral -- not logged in */
  328. #define REFAUTH (long) 1 /* authentication referral -- logged in */
  329. #define REFSELECT (long) 2 /* select referral */
  330. #define REFCREATE (long) 3
  331. #define REFDELETE (long) 4
  332. #define REFRENAME (long) 5
  333. #define REFSUBSCRIBE (long) 6
  334. #define REFUNSUBSCRIBE (long) 7
  335. #define REFSTATUS (long) 8
  336. #define REFCOPY (long) 9
  337. #define REFAPPEND (long) 10
  338. /* Block notification codes */
  339. #define BLOCK_NONE 0 /* not blocked */
  340. #define BLOCK_SENSITIVE 1 /* sensitive code, disallow alarms */
  341. #define BLOCK_NONSENSITIVE 2 /* non-sensitive code, allow alarms */
  342. #define BLOCK_DNSLOOKUP 10 /* blocked on DNS lookup */
  343. #define BLOCK_TCPOPEN 11 /* blocked on TCP open */
  344. #define BLOCK_TCPREAD 12 /* blocked on TCP read */
  345. #define BLOCK_TCPWRITE 13 /* blocked on TCP write */
  346. #define BLOCK_TCPCLOSE 14 /* blocked on TCP close */
  347. #define BLOCK_FILELOCK 20 /* blocked on file locking */
  348. /* In-memory sized-text */
  349. #define SIZEDTEXT struct mail_sizedtext
  350. SIZEDTEXT {
  351.   unsigned char *data; /* text */
  352.   unsigned long size; /* size of text in octets */
  353. };
  354. /* String list */
  355. #define STRINGLIST struct string_list
  356. STRINGLIST {
  357.   SIZEDTEXT text; /* string text */
  358.   STRINGLIST *next;
  359. };
  360. /* Parse results from mail_valid_net_parse */
  361. #define NETMAXHOST 65
  362. #define NETMAXUSER 65
  363. #define NETMAXMBX 256
  364. #define NETMAXSRV 21
  365. typedef struct net_mailbox {
  366.   char host[NETMAXHOST]; /* host name (may be canonicalized) */
  367.   char orighost[NETMAXHOST]; /* host name before canonicalization */
  368.   char user[NETMAXUSER]; /* user name */
  369.   char mailbox[NETMAXMBX]; /* mailbox name */
  370.   char service[NETMAXSRV]; /* service name */
  371.   unsigned long port; /* TCP port number */
  372.   unsigned int anoflag : 1; /* anonymous */
  373.   unsigned int dbgflag : 1; /* debug flag */
  374.   unsigned int secflag : 1; /* secure flag */
  375.   unsigned int altflag : 1; /* alt driver flag */
  376.   unsigned int tryaltflag : 1; /* (internal) try alt driver first flag */
  377. } NETMBX;
  378. /* Item in an address list */
  379. #define ADDRESS struct mail_address
  380. ADDRESS {
  381.   char *personal; /* personal name phrase */
  382.   char *adl; /* at-domain-list source route */
  383.   char *mailbox; /* mailbox name */
  384.   char *host; /* domain name of mailbox's host */
  385.   char *error; /* error in address from SMTP module */
  386.   ADDRESS *next; /* pointer to next address in list */
  387. };
  388. /* Message envelope */
  389. typedef struct mail_envelope {
  390.   unsigned int ngbogus : 1; /* newsgroups may be bogus */
  391.   unsigned int incomplete : 1; /* envelope may be incomplete */
  392.   char *remail; /* remail header if any */
  393.   ADDRESS *return_path; /* error return address */
  394.   char *date; /* message composition date string */
  395.   ADDRESS *from; /* originator address list */
  396.   ADDRESS *sender; /* sender address list */
  397.   ADDRESS *reply_to; /* reply address list */
  398.   char *subject; /* message subject string */
  399.   ADDRESS *to; /* primary recipient list */
  400.   ADDRESS *cc; /* secondary recipient list */
  401.   ADDRESS *bcc; /* blind secondary recipient list */
  402.   char *in_reply_to; /* replied message ID */
  403.   char *message_id; /* message ID */
  404.   char *newsgroups; /* USENET newsgroups */
  405.   char *followup_to; /* USENET reply newsgroups */
  406.   char *references; /* USENET references */
  407.   void *sparep; /* spare pointer reserved for main program */
  408. } ENVELOPE;
  409. /* Primary body types */
  410. /* If you change any of these you must also change body_types in rfc822.c */
  411. #define TYPETEXT 0 /* unformatted text */
  412. #define TYPEMULTIPART 1 /* multiple part */
  413. #define TYPEMESSAGE 2 /* encapsulated message */
  414. #define TYPEAPPLICATION 3 /* application data */
  415. #define TYPEAUDIO 4 /* audio */
  416. #define TYPEIMAGE 5 /* static image */
  417. #define TYPEVIDEO 6 /* video */
  418. #define TYPEMODEL 7 /* model */
  419. #define TYPEOTHER 8 /* unknown */
  420. #define TYPEMAX 15 /* maximum type code */
  421. /* Body encodings */
  422. /* If you change any of these you must also change body_encodings in rfc822.c
  423.  */
  424. #define ENC7BIT 0 /* 7 bit SMTP semantic data */
  425. #define ENC8BIT 1 /* 8 bit SMTP semantic data */
  426. #define ENCBINARY 2 /* 8 bit binary data */
  427. #define ENCBASE64 3 /* base-64 encoded data */
  428. #define ENCQUOTEDPRINTABLE 4 /* human-readable 8-as-7 bit data */
  429. #define ENCOTHER 5 /* unknown */
  430. #define ENCMAX 10 /* maximum encoding code */
  431. /* Body contents */
  432. #define BODY struct mail_bodystruct
  433. #define MESSAGE struct mail_body_message
  434. #define PARAMETER struct mail_body_parameter
  435. #define PART struct mail_body_part
  436. #define PARTTEXT struct mail_body_text
  437. /* Message body text */
  438. PARTTEXT {
  439.   unsigned long offset; /* offset from body origin */
  440.   SIZEDTEXT text; /* text */
  441. };
  442. /* Message body structure */
  443. BODY {
  444.   unsigned short type; /* body primary type */
  445.   unsigned short encoding; /* body transfer encoding */
  446.   char *subtype; /* subtype string */
  447.   PARAMETER *parameter; /* parameter list */
  448.   char *id; /* body identifier */
  449.   char *description; /* body description */
  450.   struct { /* body disposition */
  451.     char *type; /* disposition type */
  452.     PARAMETER *parameter; /* disposition parameters */
  453.   } disposition;
  454.   STRINGLIST *language; /* body language */
  455.   PARTTEXT mime; /* MIME header */
  456.   PARTTEXT contents; /* body part contents */
  457.   union { /* different ways of accessing contents */
  458.     PART *part; /* body part list */
  459.     MESSAGE *msg; /* body encapsulated message */
  460.   } nested;
  461.   struct {
  462.     unsigned long lines; /* size of text in lines */
  463.     unsigned long bytes; /* size of text in octets */
  464.   } size;
  465.   char *md5; /* MD5 checksum */
  466. };
  467. /* Parameter list */
  468. PARAMETER {
  469.   char *attribute; /* parameter attribute name */
  470.   char *value; /* parameter value */
  471.   PARAMETER *next; /* next parameter in list */
  472. };
  473. /* Multipart content list */
  474. PART {
  475.   BODY body; /* body information for this part */
  476.   PART *next; /* next body part */
  477. };
  478. /* RFC-822 Message */
  479. MESSAGE {
  480.   ENVELOPE *env; /* message envelope */
  481.   BODY *body; /* message body */
  482.   PARTTEXT full; /* full message */
  483.   STRINGLIST *lines; /* lines used to filter header */
  484.   PARTTEXT header; /* header text */
  485.   PARTTEXT text; /* body text */
  486. };
  487. /* Entry in the message cache array */
  488. typedef struct message_cache {
  489.   unsigned long msgno; /* message number */
  490.   unsigned int lockcount : 8; /* non-zero if multiple references */
  491.   unsigned long rfc822_size; /* # of bytes of message as raw RFC822 */
  492.   struct { /* c-client internal use only */
  493.     unsigned long uid; /* message unique ID */
  494.     PARTTEXT special; /* special text pointers */
  495.     MESSAGE msg; /* internal message pointers */
  496.     unsigned int sequence : 1; /* saved sequence bit */
  497.     unsigned int dirty : 1; /* driver internal use */
  498.     unsigned long data; /* driver internal use */
  499.   } private;
  500. /* internal date */
  501.   unsigned int day : 5; /* day of month (1-31) */
  502.   unsigned int month : 4; /* month of year (1-12) */
  503.   unsigned int year : 7; /* year since BASEYEAR (expires in 127 yrs) */
  504.   unsigned int hours: 5; /* hours (0-23) */
  505.   unsigned int minutes: 6; /* minutes (0-59) */
  506.   unsigned int seconds: 6; /* seconds (0-59) */
  507.   unsigned int zoccident : 1; /* non-zero if west of UTC */
  508.   unsigned int zhours : 4; /* hours from UTC (0-12) */
  509.   unsigned int zminutes: 6; /* minutes (0-59) */
  510. /* system flags */
  511.   unsigned int seen : 1; /* system Seen flag */
  512.   unsigned int deleted : 1; /* system Deleted flag */
  513.   unsigned int flagged : 1;  /* system Flagged flag */
  514.   unsigned int answered : 1; /* system Answered flag */
  515.   unsigned int draft : 1; /* system Draft flag */
  516.   unsigned int recent : 1; /* system Recent flag */
  517. /* message status */
  518.   unsigned int valid : 1; /* elt has valid flags */
  519.   unsigned int searched : 1; /* message was searched */
  520.   unsigned int sequence : 1; /* message is in sequence */
  521. /* reserved for use by main program */
  522.   unsigned int spare : 1; /* first spare bit */
  523.   unsigned int spare2 : 1; /* second spare bit */
  524.   unsigned int spare3 : 1; /* third spare bit */
  525.   void *sparep; /* spare pointer */
  526.   unsigned long user_flags; /* user-assignable flags */
  527. } MESSAGECACHE;
  528. /* String structure */
  529. #define STRINGDRIVER struct string_driver
  530. typedef struct mailstring {
  531.   void *data; /* driver-dependent data */
  532.   unsigned long data1; /* driver-dependent data */
  533.   unsigned long size; /* total length of string */
  534.   char *chunk; /* base address of chunk */
  535.   unsigned long chunksize; /* size of chunk */
  536.   unsigned long offset; /* offset of this chunk in base */
  537.   char *curpos; /* current position in chunk */
  538.   unsigned long cursize; /* number of bytes remaining in chunk */
  539.   STRINGDRIVER *dtb; /* driver that handles this type of string */
  540. } STRING;
  541. /* Dispatch table for string driver */
  542. STRINGDRIVER {
  543. /* initialize string driver */
  544.   void (*init) (STRING *s,void *data,unsigned long size);
  545. /* get next character in string */
  546.   char (*next) (STRING *s);
  547. /* set position in string */
  548.   void (*setpos) (STRING *s,unsigned long i);
  549. };
  550. /* Stringstruct access routines */
  551. #define INIT(s,d,data,size) ((*((s)->dtb = &d)->init) (s,data,size))
  552. #define SIZE(s) ((s)->size - GETPOS (s))
  553. #define CHR(s) (*(s)->curpos)
  554. #define SNX(s) (--(s)->cursize ? *(s)->curpos++ : (*(s)->dtb->next) (s))
  555. #define GETPOS(s) ((s)->offset + ((s)->curpos - (s)->chunk))
  556. #define SETPOS(s,i) (*(s)->dtb->setpos) (s,i)
  557. /* Search program */
  558. #define SEARCHPGM struct search_program
  559. #define SEARCHHEADER struct search_header
  560. #define SEARCHSET struct search_set
  561. #define SEARCHOR struct search_or
  562. #define SEARCHPGMLIST struct search_pgm_list
  563. SEARCHHEADER { /* header search */
  564.   SIZEDTEXT line; /* header line */
  565.   SIZEDTEXT text; /* text in header */
  566.   SEARCHHEADER *next; /* next in list */
  567. };
  568. SEARCHSET { /* message set */
  569.   unsigned long first; /* sequence number */
  570.   unsigned long last; /* last value, if a range */
  571.   SEARCHSET *next; /* next in list */
  572. };
  573. SEARCHOR {
  574.   SEARCHPGM *first; /* first program */
  575.   SEARCHPGM *second; /* second program */
  576.   SEARCHOR *next; /* next in list */
  577. };
  578. SEARCHPGMLIST {
  579.   SEARCHPGM *pgm; /* search program */
  580.   SEARCHPGMLIST *next; /* next in list */
  581. };
  582. SEARCHPGM { /* search program */
  583.   SEARCHSET *msgno; /* message numbers */
  584.   SEARCHSET *uid; /* unique identifiers */
  585.   SEARCHOR *or; /* or'ed in programs */
  586.   SEARCHPGMLIST *not; /* and'ed not program */
  587.   SEARCHHEADER *header; /* list of headers */
  588.   STRINGLIST *bcc; /* bcc recipients */
  589.   STRINGLIST *body; /* text in message body */
  590.   STRINGLIST *cc; /* cc recipients */
  591.   STRINGLIST *from; /* originator */
  592.   STRINGLIST *keyword; /* keywords */
  593.   STRINGLIST *unkeyword; /* unkeywords */
  594.   STRINGLIST *subject; /* text in subject */
  595.   STRINGLIST *text; /* text in headers and body */
  596.   STRINGLIST *to; /* to recipients */
  597.   unsigned long larger; /* larger than this size */
  598.   unsigned long smaller; /* smaller than this size */
  599.   unsigned short sentbefore; /* sent before this date */
  600.   unsigned short senton; /* sent on this date */
  601.   unsigned short sentsince; /* sent since this date */
  602.   unsigned short before; /* before this date */
  603.   unsigned short on; /* on this date */
  604.   unsigned short since; /* since this date */
  605.   unsigned int answered : 1; /* answered messages */
  606.   unsigned int unanswered : 1; /* unanswered messages */
  607.   unsigned int deleted : 1; /* deleted messages */
  608.   unsigned int undeleted : 1; /* undeleted messages */
  609.   unsigned int draft : 1; /* message draft */
  610.   unsigned int undraft : 1; /* message undraft */
  611.   unsigned int flagged : 1; /* flagged messages */
  612.   unsigned int unflagged : 1; /* unflagged messages */
  613.   unsigned int recent : 1; /* recent messages */
  614.   unsigned int old : 1; /* old messages */
  615.   unsigned int seen : 1; /* seen messages */
  616.   unsigned int unseen : 1; /* unseen messages */
  617.   /* These must be simulated in IMAP */
  618.   STRINGLIST *return_path; /* error return address */
  619.   STRINGLIST *sender; /* sender address list */
  620.   STRINGLIST *reply_to; /* reply address list */
  621.   STRINGLIST *in_reply_to; /* replied message ID */
  622.   STRINGLIST *message_id; /* message ID */
  623.   STRINGLIST *newsgroups; /* USENET newsgroups */
  624.   STRINGLIST *followup_to; /* USENET reply newsgroups */
  625.   STRINGLIST *references; /* USENET references */
  626. };
  627. /* Mailbox status */
  628. typedef struct mbx_status {
  629.   long flags; /* validity flags */
  630.   unsigned long messages; /* number of messages */
  631.   unsigned long recent; /* number of recent messages */
  632.   unsigned long unseen; /* number of unseen messages */
  633.   unsigned long uidnext; /* next UID to be assigned */
  634.   unsigned long uidvalidity; /* UID validity value */
  635. } MAILSTATUS;
  636. /* Sort program */
  637. typedef void (*postsort_t) (void *sc);
  638. #define SORTPGM struct sort_program
  639. SORTPGM {
  640.   unsigned int reverse : 1; /* sort function is to be reversed */
  641.   unsigned int abort : 1; /* abort sorting */
  642.   short function; /* sort function */
  643.   unsigned long nmsgs; /* number of messages being sorted */
  644.   struct {
  645.     unsigned long cached; /* number of messages cached so far */
  646.     unsigned long sorted; /* number of messages sorted so far */
  647.     unsigned long postsorted; /* number of postsorted messages so far */
  648.   } progress;
  649.   postsort_t postsort; /* post sorter */
  650.   SORTPGM *next; /* next function */
  651. };
  652. /* Sort cache */
  653. #define SORTCACHE struct sort_cache
  654. SORTCACHE {
  655.   unsigned int sorted : 1; /* message has been sorted */
  656.   unsigned int postsorted : 1; /* message has been postsorted */
  657.   SORTPGM *pgm; /* sort program */
  658.   unsigned long num; /* message number (sequence or UID) */
  659.   unsigned long date; /* delivery date */
  660.   unsigned long arrival; /* arrival date */
  661.   unsigned long size; /* message size */
  662.   char *from; /* from string */
  663.   char *to; /* to string */
  664.   char *cc; /* cc string */
  665.   char *subject; /* subject string */
  666. };
  667. /* Mail Access I/O stream */
  668. /* Structure for mail driver dispatch */
  669. #define DRIVER struct driver
  670. /* Mail I/O stream */
  671. typedef struct mail_stream {
  672.   DRIVER *dtb; /* dispatch table for this driver */
  673.   void *local; /* pointer to driver local data */
  674.   char *mailbox; /* mailbox name */
  675.   unsigned short use; /* stream use count */
  676.   unsigned short sequence; /* stream sequence */
  677.   unsigned int inbox : 1; /* stream open on an INBOX */
  678.   unsigned int lock : 1; /* stream lock flag */
  679.   unsigned int debug : 1; /* stream debug flag */
  680.   unsigned int silent : 1; /* don't pass events to main program */
  681.   unsigned int rdonly : 1; /* stream read-only flag */
  682.   unsigned int anonymous : 1; /* stream anonymous access flag */
  683.   unsigned int scache : 1; /* stream short cache flag */
  684.   unsigned int halfopen : 1; /* stream half-open flag */
  685.   unsigned int secure : 1; /* stream secure flag */
  686.   unsigned int tryalt : 1; /* stream tryalt flag */
  687.   unsigned int perm_seen : 1; /* permanent Seen flag */
  688.   unsigned int perm_deleted : 1;/* permanent Deleted flag */
  689.   unsigned int perm_flagged : 1;/* permanent Flagged flag */
  690.   unsigned int perm_answered :1;/* permanent Answered flag */
  691.   unsigned int perm_draft : 1; /* permanent Draft flag */
  692.   unsigned int kwd_create : 1; /* can create new keywords */
  693.   unsigned int uid_nosticky : 1;/* UIDs are not preserved */
  694.   unsigned long perm_user_flags;/* mask of permanent user flags */
  695.   unsigned long gensym; /* generated tag */
  696.   unsigned long nmsgs; /* # of associated msgs */
  697.   unsigned long recent; /* # of recent msgs */
  698.   unsigned long uid_validity; /* UID validity sequence */
  699.   unsigned long uid_last; /* last assigned UID */
  700.   char *user_flags[NUSERFLAGS]; /* pointers to user flags in bit order */
  701.   unsigned long cachesize; /* size of message cache */
  702.   MESSAGECACHE **cache; /* message cache array */
  703.   SORTCACHE **sc; /* sort cache array */
  704.   unsigned long msgno; /* message number of `current' message */
  705.   ENVELOPE *env; /* scratch buffer for envelope */
  706.   BODY *body; /* scratch buffer for body */
  707.   SIZEDTEXT text; /* scratch buffer for text */
  708.   union { /* internal use only */
  709.     struct { /* search temporaries */
  710.       STRINGLIST *string; /* string(s) to search */
  711.       long result; /* search result */
  712.       char *text; /* cache of fetched text */
  713.     } search;
  714.   } private;
  715. } MAILSTREAM;
  716. /* Mail I/O stream handle */
  717. typedef struct mail_stream_handle {
  718.   MAILSTREAM *stream; /* pointer to mail stream */
  719.   unsigned short sequence; /* sequence of what we expect stream to be */
  720. } MAILHANDLE;
  721. /* Message overview */
  722. typedef struct mail_overview {
  723.   char *subject; /* message subject string */
  724.   ADDRESS *from; /* originator address list */
  725.   char *date; /* message composition date string */
  726.   char *message_id; /* message ID */
  727.   char *references; /* USENET references */
  728.   struct { /* may be 0 or NUL if unknown/undefined */
  729.     unsigned long octets; /* message octets (probably LF-newline form) */
  730.     unsigned long lines; /* message lines */
  731.     char *xref; /* cross references */
  732.   } optional;
  733. } OVERVIEW;
  734. /* Network access I/O stream */
  735. /* Structure for network driver dispatch */
  736. #define NETDRIVER struct net_driver
  737. /* Network transport I/O stream */
  738. typedef struct net_stream {
  739.   void *stream; /* driver's I/O stream */
  740.   NETDRIVER *dtb; /* network driver */
  741. } NETSTREAM;
  742. /* Network transport driver dispatch */
  743. NETDRIVER {
  744.   void *(*open) (char *host,char *service,unsigned long port);
  745.   void *(*aopen) (NETMBX *mb,char *service,char *usrbuf);
  746.   char *(*getline) (void *stream);
  747.   long (*getbuffer) (void *stream,unsigned long size,char *buffer);
  748.   long (*soutr) (void *stream,char *string);
  749.   long (*sout) (void *stream,char *string,unsigned long size);
  750.   void (*close) (void *stream);
  751.   char *(*host) (void *stream);
  752.   char *(*remotehost) (void *stream);
  753.   unsigned long (*port) (void *stream);
  754.   char *(*localhost) (void *stream);
  755. };
  756. /* Mailgets data identifier */
  757. typedef struct GETS_DATA {
  758.   MAILSTREAM *stream;
  759.   unsigned long msgno;
  760.   char *what;
  761.   STRINGLIST *stl;
  762.   unsigned long first;
  763.   unsigned long last;
  764.   long flags;
  765. } GETS_DATA;
  766. #define INIT_GETS(md,s,m,w,f,l) 
  767.   md.stream = s, md.msgno = m, md.what = w, md.first = f, md.last = l, 
  768.   md.stl = NIL, md.flags = NIL;
  769. /* Mail delivery I/O stream */
  770. typedef struct send_stream {
  771.   NETSTREAM *netstream; /* network I/O stream */
  772.   char *reply; /* last reply string */
  773.   long replycode; /* last reply code */
  774.   unsigned int debug : 1; /* stream debug flag */
  775.   union { /* protocol specific */
  776.     struct { /* SMTP specific */
  777.       unsigned int ok : 1; /* supports ESMTP */
  778.       struct { /* service extensions */
  779. unsigned int send : 1; /* supports SEND */
  780. unsigned int soml : 1; /* supports SOML */
  781. unsigned int saml : 1; /* supports SAML */
  782. unsigned int expn : 1; /* supports EXPN */
  783. unsigned int help : 1; /* supports HELP */
  784. unsigned int turn : 1; /* supports TURN */
  785. unsigned int etrn : 1; /* supports ETRN */
  786. unsigned int relay : 1; /* supports relaying */
  787. unsigned int pipe : 1; /* supports pipelining */
  788. unsigned int ensc : 1; /* supports enhanced status codes */
  789.       } service;
  790.       struct { /* 8-bit MIME transport */
  791. unsigned int ok : 1; /* supports 8-bit MIME */
  792. unsigned int want : 1; /* want 8-bit MIME */
  793.       } eightbit;
  794.       struct { /* delivery status notification */
  795. unsigned int ok : 1; /* supports DSN */
  796. unsigned int want : 1; /* want DSN */
  797. struct { /* notification options */
  798. /* notify on failure */
  799.   unsigned int failure : 1;
  800. /* notify on delay */
  801.   unsigned int delay : 1;
  802. /* notify on success */
  803.   unsigned int success : 1;
  804. } notify;
  805. unsigned int full : 1; /* return full headers */
  806.       } dsn;
  807.       struct { /* size declaration */
  808. unsigned int ok : 1; /* supports SIZE */
  809. unsigned long limit; /* maximum size supported */
  810.       } size;
  811.       unsigned long auth; /* supported SASL authenticators */
  812.     } esmtp;
  813.     struct { /* NNTP specific */
  814.       unsigned int post : 1; /* supports POST */
  815.     } nntp;
  816.   } protocol;
  817. } SENDSTREAM;
  818. /* Jacket into external interfaces */
  819. typedef long (*readfn_t) (void *stream,unsigned long size,char *buffer);
  820. typedef char *(*mailgets_t) (readfn_t f,void *stream,unsigned long size,
  821.      GETS_DATA *md);
  822. typedef char *(*readprogress_t) (GETS_DATA *md,unsigned long octets);
  823. typedef void *(*mailcache_t) (MAILSTREAM *stream,unsigned long msgno,long op);
  824. typedef long (*mailproxycopy_t) (MAILSTREAM *stream,char *sequence,
  825.  char *mailbox,long options);
  826. typedef long (*tcptimeout_t) (long overall,long last);
  827. typedef void *(*authchallenge_t) (void *stream,unsigned long *len);
  828. typedef long (*authrespond_t) (void *stream,char *s,unsigned long size);
  829. typedef long (*authcheck_t) (void);
  830. typedef long (*authclient_t) (authchallenge_t challenger,
  831.       authrespond_t responder,NETMBX *mb,void *s,
  832.       unsigned long *trial,char *user);
  833. typedef char *(*authresponse_t) (void *challenge,unsigned long clen,
  834.  unsigned long *rlen);
  835. typedef char *(*authserver_t) (authresponse_t responder,int argc,char *argv[]);
  836. typedef void (*smtpverbose_t) (char *buffer);
  837. typedef void (*imapenvelope_t) (MAILSTREAM *stream,unsigned long msgno,
  838. ENVELOPE *env);
  839. typedef char *(*imapreferral_t) (MAILSTREAM *stream,char *url,long code);
  840. typedef void (*overview_t) (MAILSTREAM *stream,unsigned long uid,OVERVIEW *ov);
  841. typedef unsigned long *(*sorter_t) (MAILSTREAM *stream,char *charset,
  842.     SEARCHPGM *spg,SORTPGM *pgm,long flags);
  843. typedef void (*parseline_t) (ENVELOPE *env,char *hdr,char *data,char *host);
  844. typedef ADDRESS *(*parsephrase_t) (char *phrase,char *end,char *host);
  845. typedef void *(*blocknotify_t) (int reason,void *data);
  846. typedef void (*sortresults_t) (MAILSTREAM *stream,unsigned long *list,
  847.        unsigned long size);
  848. typedef char *(*userprompt_t) (void);
  849. /* Globals */
  850. extern char *body_types[]; /* defined body type strings */
  851. extern char *body_encodings[]; /* defined body encoding strings */
  852. extern const char *days[]; /* day name strings */
  853. extern const char *months[]; /* month name strings */
  854. /* Threading */
  855. /* Thread node */
  856. #define THREADNODE struct thread_node
  857. THREADNODE {
  858.   unsigned long num; /* message number */
  859.   SORTCACHE *sc; /* (internal use) sortcache entry */
  860.   THREADNODE *branch; /* branch at this point in tree */
  861.   THREADNODE *next; /* next node */
  862. };
  863. typedef void (*threadresults_t) (MAILSTREAM *stream,THREADNODE *tree);
  864. /* Thread dispatch */
  865. #define THREADER struct threader_list
  866. THREADER {
  867.   char *name; /* name of threader */
  868.   THREADNODE *(*dispatch) (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,
  869.    long flags,sorter_t sorter);
  870.   THREADER *next;
  871. };
  872. /* Namespaces */
  873. #define NAMESPACE struct mail_namespace
  874. NAMESPACE {
  875.   char *name; /* name of this namespace */
  876.   int delimiter; /* hierarchy delimiter */
  877.   PARAMETER *param; /* namespace parameters */
  878.   NAMESPACE *next; /* next namespace */
  879. };
  880. /* Authentication */
  881. #define AUTHENTICATOR struct mail_authenticator
  882. AUTHENTICATOR {
  883.   unsigned int secflag : 1; /* secure authenticator */
  884.   char *name; /* name of this authenticator */
  885.   authcheck_t valid; /* authenticator valid on this system */
  886.   authclient_t client; /* client function that supports it */
  887.   authserver_t server; /* server function that supports it */
  888.   AUTHENTICATOR *next; /* next authenticator */
  889. };
  890. /* Mail driver dispatch */
  891. /* normal dispatching */
  892. #define SAFE_DISPATCH(dtb,ret,dsp,args) 
  893.   if (dtb) SAFE_FUNCTION(dtb,ret,(*dtb->dsp),args)
  894. #define SAFE_FUNCTION(dtb,ret,func,args) ret = func args;
  895. DRIVER {
  896.   char *name; /* driver name */
  897.   unsigned long flags; /* driver flags */
  898.   DRIVER *next; /* next driver */
  899. /* mailbox is valid for us */
  900.   DRIVER *(*valid) (char *mailbox);
  901. /* manipulate driver parameters */
  902.   void *(*parameters) (long function,void *value);
  903. /* scan mailboxes */
  904.   void (*scan) (MAILSTREAM *stream,char *ref,char *pat,char *contents);
  905. /* list mailboxes */
  906.   void (*list) (MAILSTREAM *stream,char *ref,char *pat);
  907. /* list subscribed mailboxes */
  908.   void (*lsub) (MAILSTREAM *stream,char *ref,char *pat);
  909. /* subscribe to mailbox */
  910.   long (*subscribe) (MAILSTREAM *stream,char *mailbox);
  911. /* unsubscribe from mailbox */
  912.   long (*unsubscribe) (MAILSTREAM *stream,char *mailbox);
  913. /* create mailbox */
  914.   long (*create) (MAILSTREAM *stream,char *mailbox);
  915. /* delete mailbox */
  916.   long (*mbxdel) (MAILSTREAM *stream,char *mailbox);
  917. /* rename mailbox */
  918.   long (*mbxren) (MAILSTREAM *stream,char *old,char *newname);
  919. /* status of mailbox */
  920.   long (*status) (MAILSTREAM *stream,char *mbx,long flags);
  921. /* open mailbox */
  922.   MAILSTREAM *(*open) (MAILSTREAM *stream);
  923. /* close mailbox */
  924.   void (*close) (MAILSTREAM *stream,long options);
  925. /* fetch message "fast" attributes */
  926.   void (*fast) (MAILSTREAM *stream,char *sequence,long flags);
  927. /* fetch message flags */
  928.   void (*msgflags) (MAILSTREAM *stream,char *sequence,long flags);
  929. /* fetch message overview */
  930.   long (*overview) (MAILSTREAM *stream,char *sequence,overview_t ofn);
  931. /* fetch message envelopes */
  932.   ENVELOPE *(*structure) (MAILSTREAM *stream,unsigned long msgno,BODY **body,
  933.   long flags);
  934. /* return RFC-822 header */
  935.   char *(*header) (MAILSTREAM *stream,unsigned long msgno,
  936.    unsigned long *length,long flags);
  937. /* return RFC-822 text */
  938.   long (*text) (MAILSTREAM *stream,unsigned long msgno,STRING *bs,long flags);
  939. /* load cache */
  940.   long (*msgdata) (MAILSTREAM *stream,unsigned long msgno,char *section,
  941.    unsigned long first,unsigned long last,STRINGLIST *lines,
  942.    long flags);
  943. /* return UID for message */
  944.   unsigned long (*uid) (MAILSTREAM *stream,unsigned long msgno);
  945. /* return message number from UID */
  946.   unsigned long (*msgno) (MAILSTREAM *stream,unsigned long uid);
  947. /* modify flags */
  948.   void (*flag) (MAILSTREAM *stream,char *sequence,char *flag,long flags);
  949. /* per-message modify flags */
  950.   void (*flagmsg) (MAILSTREAM *stream,MESSAGECACHE *elt);
  951. /* search for message based on criteria */
  952.   void (*search) (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,long flags);
  953. /* sort messages */
  954.   unsigned long *(*sort) (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,
  955.   SORTPGM *pgm,long flags);
  956. /* thread messages */
  957.   THREADNODE *(*thread) (MAILSTREAM *stream,char *type,char *charset,
  958.  SEARCHPGM *spg,long flag);
  959. /* ping mailbox to see if still alive */
  960.   long (*ping) (MAILSTREAM *stream);
  961. /* check for new messages */
  962.   void (*check) (MAILSTREAM *stream);
  963. /* expunge deleted messages */
  964.   void (*expunge) (MAILSTREAM *stream);
  965. /* copy messages to another mailbox */
  966.   long (*copy) (MAILSTREAM *stream,char *sequence,char *mailbox,long options);
  967. /* append string message to mailbox */
  968.   long (*append) (MAILSTREAM *stream,char *mailbox,char *flags,char *date,
  969.   STRING *message);
  970. /* garbage collect stream */
  971.   void (*gc) (MAILSTREAM *stream,long gcflags);
  972. };
  973. #include "linkage.h"
  974. /* Compatibility support names for old interfaces */
  975. #define mail_close(stream) 
  976.   mail_close_full (stream,NIL)
  977. #define mail_fetchfast(stream,sequence) 
  978.   mail_fetch_fast (stream,sequence,NIL)
  979. #define mail_fetchfast_full mail_fetch_fast
  980. #define mail_fetchflags(stream,sequence) 
  981.   mail_fetch_flags (stream,sequence,NIL)
  982. #define mail_fetchflags_full mail_fetch_flags
  983. #define mail_fetchenvelope(stream,msgno) 
  984.   mail_fetch_structure (stream,msgno,NIL,NIL)
  985. #define mail_fetchstructure(stream,msgno,body) 
  986.   mail_fetch_structure (stream,msgno,body,NIL)
  987. #define mail_fetchstructure_full mail_fetch_structure
  988. #define mail_fetchheader(stream,msgno) 
  989.   mail_fetch_header (stream,msgno,NIL,NIL,NIL,FT_PEEK)
  990. #define mail_fetchheader_full(stream,msgno,lines,len,flags) 
  991.   mail_fetch_header (stream,msgno,NIL,lines,len,FT_PEEK | (flags))
  992. #define mail_fetchtext(stream,msgno) 
  993.   mail_fetch_text (stream,msgno,NIL,NIL,NIL)
  994. #define mail_fetchtext_full(stream,msgno,length,flags) 
  995.   mail_fetch_text (stream,msgno,NIL,length,flags)
  996. #define mail_fetchbody(stream,msgno,section,length) 
  997.   mail_fetch_body (stream,msgno,section,length,NIL)
  998. #define mail_fetchbody_full mail_fetch_body
  999. #define mail_setflag(stream,sequence,flag) 
  1000.   mail_flag (stream,sequence,flag,ST_SET)
  1001. #define mail_setflag_full(stream,sequence,flag,flags) 
  1002.   mail_flag (stream,sequence,flag,ST_SET | (flags))
  1003. #define mail_clearflag(stream,sequence,flag) 
  1004.   mail_flag (stream,sequence,flag,NIL)
  1005. #define mail_clearflag_full mail_flag
  1006. #define mail_search(stream,criteria) 
  1007.   mail_search_full (stream,NIL,mail_criteria (criteria),SE_FREE);
  1008. #define mail_copy(stream,sequence,mailbox) 
  1009.   mail_copy_full (stream,sequence,mailbox,NIL)
  1010. #define mail_move(stream,sequence,mailbox) 
  1011.   mail_copy_full (stream,sequence,mailbox,CP_MOVE)
  1012. #define mail_append(stream,mailbox,message) 
  1013.   mail_append_full (stream,mailbox,NIL,NIL,message)
  1014. /* Function prototypes */
  1015. void mm_searched (MAILSTREAM *stream,unsigned long number);
  1016. void mm_exists (MAILSTREAM *stream,unsigned long number);
  1017. void mm_expunged (MAILSTREAM *stream,unsigned long number);
  1018. void mm_flags (MAILSTREAM *stream,unsigned long number);
  1019. void mm_notify (MAILSTREAM *stream,char *string,long errflg);
  1020. void mm_list (MAILSTREAM *stream,int delimiter,char *name,long attributes);
  1021. void mm_lsub (MAILSTREAM *stream,int delimiter,char *name,long attributes);
  1022. void mm_status (MAILSTREAM *stream,char *mailbox,MAILSTATUS *status);
  1023. void mm_log (char *string,long errflg);
  1024. void mm_dlog (char *string);
  1025. void mm_login (NETMBX *mb,char *user,char *pwd,long trial);
  1026. void mm_critical (MAILSTREAM *stream);
  1027. void mm_nocritical (MAILSTREAM *stream);
  1028. long mm_diskerror (MAILSTREAM *stream,long errcode,long serious);
  1029. void mm_fatal (char *string);
  1030. void *mm_cache (MAILSTREAM *stream,unsigned long msgno,long op);
  1031. extern STRINGDRIVER mail_string;
  1032. void mail_string_init (STRING *s,void *data,unsigned long size);
  1033. char mail_string_next (STRING *s);
  1034. void mail_string_setpos (STRING *s,unsigned long i);
  1035. void mail_link (DRIVER *driver);
  1036. void *mail_parameters (MAILSTREAM *stream,long function,void *value);
  1037. DRIVER *mail_valid (MAILSTREAM *stream,char *mailbox,char *purpose);
  1038. DRIVER *mail_valid_net (char *name,DRIVER *drv,char *host,char *mailbox);
  1039. long mail_valid_net_parse (char *name,NETMBX *mb);
  1040. void mail_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents);
  1041. void mail_list (MAILSTREAM *stream,char *ref,char *pat);
  1042. void mail_lsub (MAILSTREAM *stream,char *ref,char *pat);
  1043. long mail_subscribe (MAILSTREAM *stream,char *mailbox);
  1044. long mail_unsubscribe (MAILSTREAM *stream,char *mailbox);
  1045. long mail_create (MAILSTREAM *stream,char *mailbox);
  1046. long mail_delete (MAILSTREAM *stream,char *mailbox);
  1047. long mail_rename (MAILSTREAM *stream,char *old,char *newname);
  1048. long mail_status (MAILSTREAM *stream,char *mbx,long flags);
  1049. long mail_status_default (MAILSTREAM *stream,char *mbx,long flags);
  1050. MAILSTREAM *mail_open (MAILSTREAM *oldstream,char *name,long options);
  1051. MAILSTREAM *mail_close_full (MAILSTREAM *stream,long options);
  1052. MAILHANDLE *mail_makehandle (MAILSTREAM *stream);
  1053. void mail_free_handle (MAILHANDLE **handle);
  1054. MAILSTREAM *mail_stream (MAILHANDLE *handle);
  1055. void mail_fetch_fast (MAILSTREAM *stream,char *sequence,long flags);
  1056. void mail_fetch_flags (MAILSTREAM *stream,char *sequence,long flags);
  1057. void mail_fetch_overview (MAILSTREAM *stream,char *sequence,overview_t ofn);
  1058. ENVELOPE *mail_fetch_structure (MAILSTREAM *stream,unsigned long msgno,
  1059. BODY **body,long flags);
  1060. char *mail_fetch_message (MAILSTREAM *stream,unsigned long msgno,
  1061.   unsigned long *len,long flags);
  1062. char *mail_fetch_header (MAILSTREAM *stream,unsigned long msgno,char *section,
  1063.  STRINGLIST *lines,unsigned long *len,long flags);
  1064. char *mail_fetch_text (MAILSTREAM *stream,unsigned long msgno,char *section,
  1065.        unsigned long *len,long flags);
  1066. char *mail_fetch_mime (MAILSTREAM *stream,unsigned long msgno,char *section,
  1067.        unsigned long *len,long flags);
  1068. char *mail_fetch_body (MAILSTREAM *stream,unsigned long msgno,char *section,
  1069.        unsigned long *len,long flags);
  1070. long mail_partial_text (MAILSTREAM *stream,unsigned long msgno,char *section,
  1071. unsigned long first,unsigned long last,long flags);
  1072. long mail_partial_body (MAILSTREAM *stream,unsigned long msgno,char *section,
  1073. unsigned long first,unsigned long last,long flags);
  1074. char *mail_fetch_text_return (GETS_DATA *md,SIZEDTEXT *t,unsigned long *len);
  1075. char *mail_fetch_string_return (GETS_DATA *md,STRING *bs,unsigned long i,
  1076. unsigned long *len);
  1077. long mail_read (void *stream,unsigned long size,char *buffer);
  1078. unsigned long mail_uid (MAILSTREAM *stream,unsigned long msgno);
  1079. unsigned long mail_msgno (MAILSTREAM *stream,unsigned long uid);
  1080. void mail_fetchfrom (char *s,MAILSTREAM *stream,unsigned long msgno,
  1081.      long length);
  1082. void mail_fetchsubject (char *s,MAILSTREAM *stream,unsigned long msgno,
  1083. long length);
  1084. MESSAGECACHE *mail_elt (MAILSTREAM *stream,unsigned long msgno);
  1085. void mail_flag (MAILSTREAM *stream,char *sequence,char *flag,long flags);
  1086. void mail_search_full (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,
  1087.        long flags);
  1088. void mail_search_default (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,
  1089.   long flags);
  1090. long mail_ping (MAILSTREAM *stream);
  1091. void mail_check (MAILSTREAM *stream);
  1092. void mail_expunge (MAILSTREAM *stream);
  1093. long mail_copy_full (MAILSTREAM *stream,char *sequence,char *mailbox,
  1094.      long options);
  1095. long mail_append_full (MAILSTREAM *stream,char *mailbox,char *flags,char *date,
  1096.        STRING *message);
  1097. void mail_gc (MAILSTREAM *stream,long gcflags);
  1098. void mail_gc_msg (MESSAGE *msg,long gcflags);
  1099. void mail_gc_body (BODY *body);
  1100. BODY *mail_body (MAILSTREAM *stream,unsigned long msgno,char *section);
  1101. char *mail_date (char *string,MESSAGECACHE *elt);
  1102. char *mail_cdate (char *string,MESSAGECACHE *elt);
  1103. long mail_parse_date (MESSAGECACHE *elt,char *string);
  1104. void mail_exists (MAILSTREAM *stream,unsigned long nmsgs);
  1105. void mail_recent (MAILSTREAM *stream,unsigned long recent);
  1106. void mail_expunged (MAILSTREAM *stream,unsigned long msgno);
  1107. void mail_lock (MAILSTREAM *stream);
  1108. void mail_unlock (MAILSTREAM *stream);
  1109. void mail_debug (MAILSTREAM *stream);
  1110. void mail_nodebug (MAILSTREAM *stream);
  1111. long mail_match_lines (STRINGLIST *lines,STRINGLIST *msglines,long flags);
  1112. unsigned long mail_filter (char *text,unsigned long len,STRINGLIST *lines,
  1113.    long flags);
  1114. long mail_search_msg (MAILSTREAM *stream,unsigned long msgno,char *section,
  1115.       SEARCHPGM *pgm);
  1116. long mail_search_header_text (char *s,STRINGLIST *st);
  1117. long mail_search_header (SIZEDTEXT *hdr,STRINGLIST *st);
  1118. long mail_search_text (MAILSTREAM *stream,unsigned long msgno,char *section,
  1119.        STRINGLIST *st,long flags);
  1120. long mail_search_body (MAILSTREAM *stream,unsigned long msgno,BODY *body,
  1121.        char *prefix,unsigned long section,long flags);
  1122. long mail_search_string (SIZEDTEXT *s,char *charset,STRINGLIST **st);
  1123. long mail_search_keyword (MAILSTREAM *stream,MESSAGECACHE *elt,STRINGLIST *st);
  1124. long mail_search_addr (ADDRESS *adr,STRINGLIST *st);
  1125. char *mail_search_gets (readfn_t f,void *stream,unsigned long size,
  1126. GETS_DATA *md);
  1127. SEARCHPGM *mail_criteria (char *criteria);
  1128. int mail_criteria_date (unsigned short *date);
  1129. int mail_criteria_string (STRINGLIST **s);
  1130. unsigned long *mail_sort (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,
  1131.   SORTPGM *pgm,long flags);
  1132. unsigned long *mail_sort_cache (MAILSTREAM *stream,SORTPGM *pgm,SORTCACHE **sc,
  1133. long flags);
  1134. unsigned long *mail_sort_msgs (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,
  1135.        SORTPGM *pgm,long flags);
  1136. SORTCACHE **mail_sort_loadcache (MAILSTREAM *stream,SORTPGM *pgm);
  1137. char *mail_strip_subject (char *t);
  1138. int mail_sort_compare (const void *a1,const void *a2);
  1139. int mail_compare_ulong (unsigned long l1,unsigned long l2);
  1140. int mail_compare_cstring (char *s1,char *s2);
  1141. unsigned long mail_longdate (MESSAGECACHE *elt);
  1142. THREADNODE *mail_thread (MAILSTREAM *stream,char *type,char *charset,
  1143.  SEARCHPGM *spg,long flags);
  1144. THREADNODE *mail_thread_msgs (MAILSTREAM *stream,char *type,char *charset,
  1145.       SEARCHPGM *spg,long flags,sorter_t sorter);
  1146. THREADNODE *mail_thread_orderedsubject (MAILSTREAM *stream,char *charset,
  1147. SEARCHPGM *spg,long flags,
  1148. sorter_t sorter);
  1149. int mail_thread_compare_date (const void *a1,const void *a2);
  1150. long mail_sequence (MAILSTREAM *stream,char *sequence);
  1151. long mail_uid_sequence (MAILSTREAM *stream,char *sequence);
  1152. long mail_parse_flags (MAILSTREAM *stream,char *flag,unsigned long *uf);
  1153. long mail_usable_network_stream (MAILSTREAM *stream,char *name);
  1154. MESSAGECACHE *mail_new_cache_elt (unsigned long msgno);
  1155. ENVELOPE *mail_newenvelope (void);
  1156. ADDRESS *mail_newaddr (void);
  1157. BODY *mail_newbody (void);
  1158. BODY *mail_initbody (BODY *body);
  1159. PARAMETER *mail_newbody_parameter (void);
  1160. PART *mail_newbody_part (void);
  1161. MESSAGE *mail_newmsg (void);
  1162. STRINGLIST *mail_newstringlist (void);
  1163. SEARCHPGM *mail_newsearchpgm (void);
  1164. SEARCHHEADER *mail_newsearchheader (char *line,char *text);
  1165. SEARCHSET *mail_newsearchset (void);
  1166. SEARCHOR *mail_newsearchor (void);
  1167. SEARCHPGMLIST *mail_newsearchpgmlist (void);
  1168. SORTPGM *mail_newsortpgm (void);
  1169. THREADNODE *mail_newthreadnode (SORTCACHE *sc);
  1170. void mail_free_body (BODY **body);
  1171. void mail_free_body_data (BODY *body);
  1172. void mail_free_body_parameter (PARAMETER **parameter);
  1173. void mail_free_body_part (PART **part);
  1174. void mail_free_cache (MAILSTREAM *stream);
  1175. void mail_free_elt (MESSAGECACHE **elt);
  1176. void mail_free_envelope (ENVELOPE **env);
  1177. void mail_free_address (ADDRESS **address);
  1178. void mail_free_stringlist (STRINGLIST **string);
  1179. void mail_free_searchpgm (SEARCHPGM **pgm);
  1180. void mail_free_searchheader (SEARCHHEADER **hdr);
  1181. void mail_free_searchset (SEARCHSET **set);
  1182. void mail_free_searchor (SEARCHOR **orl);
  1183. void mail_free_searchpgmlist (SEARCHPGMLIST **pgl);
  1184. void mail_free_namespace (NAMESPACE **n);
  1185. void mail_free_sortpgm (SORTPGM **pgm);
  1186. void mail_free_threadnode (THREADNODE **thr);
  1187. void auth_link (AUTHENTICATOR *auth);
  1188. char *mail_auth (char *mechanism,authresponse_t resp,int argc,char *argv[]);
  1189. AUTHENTICATOR *mail_lookup_auth (unsigned long i);
  1190. unsigned int mail_lookup_auth_name (char *mechanism,long secflag);
  1191. NETSTREAM *net_open (NETMBX *mb,NETDRIVER *dv,unsigned long port,
  1192.      NETDRIVER *altd,char *alts,unsigned long altp);
  1193. NETSTREAM *net_open_work (NETDRIVER *dv,char *host,char *service,
  1194.   unsigned long port,unsigned long portoverride,
  1195.   long flags);
  1196. NETSTREAM *net_aopen (NETDRIVER *dv,NETMBX *mb,char *service,char *usrbuf);
  1197. char *net_getline (NETSTREAM *stream);
  1198. /* stream must be void* for use as readfn_t */
  1199. long net_getbuffer (void *stream,unsigned long size,char *buffer);
  1200. long net_soutr (NETSTREAM *stream,char *string);
  1201. long net_sout (NETSTREAM *stream,char *string,unsigned long size);
  1202. void net_close (NETSTREAM *stream);
  1203. char *net_host (NETSTREAM *stream);
  1204. char *net_remotehost (NETSTREAM *stream);
  1205. unsigned long net_port (NETSTREAM *stream);
  1206. char *net_localhost (NETSTREAM *stream);
  1207. long sm_subscribe (char *mailbox);
  1208. long sm_unsubscribe (char *mailbox);
  1209. char *sm_read (void **sdb);