home *** CD-ROM | disk | FTP | other *** search
/ ftp.uv.es / 2014.11.ftp.uv.es.tar / ftp.uv.es / pub / unix / pine4.10.tar.gz / pine4.10.tar / pine4.10 / imap / src / c-client / mail.h < prev    next >
C/C++ Source or Header  |  1998-12-01  |  49KB  |  1,340 lines

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