2 * Copyright 2016-2020 Eduardo Chappa
4 * Last Edited: January 26, 2020 Eduardo Chappa <chappa@washington.edu>
7 /* ========================================================================
8 * Copyright 2008-2011 Mark Crispin
9 * ========================================================================
13 * Program: Mailbox Access routines
15 * Author: Mark Crispin
17 * Date: 22 November 1989
18 * Last Edited: 8 April 2011
20 * Previous versions of this file were
22 * Copyright 1988-2008 University of Washington
24 * Licensed under the Apache License, Version 2.0 (the "License");
25 * you may not use this file except in compliance with the License.
26 * You may obtain a copy of the License at
28 * http://www.apache.org/licenses/LICENSE-2.0
34 #define CCLIENTVERSION "2010"
36 /* Build parameters */
38 #define CACHEINCREMENT 250 /* cache growth increments */
39 #define MAILTMPLEN 1024 /* size of a temporary buffer */
40 #define SENDBUFLEN 16385 /* size of temporary sending buffer, also
41 * used for SMTP commands and NETMBX generation
42 * buffer so shouldn't be made smaller than
43 * MAILTMPLEN. Note that there's a guard byte,
44 * so this is actually len+1. */
45 #define MAXAUTHENTICATORS 8 /* maximum number of SASL authenticators */
46 /* maximum number of messages */
47 #define MAXMESSAGES (unsigned long) 1000000
48 #define MAXLOGINTRIALS 3 /* maximum number of client login attempts */
49 #define MAXWILDCARDS 10 /* maximum wildcards allowed in LIST/LSUB */
52 /* These can't be changed without changing code */
54 #define NUSERFLAGS 30 /* maximum number of user flags */
55 #define MAXUSERFLAG 50 /* maximum length of a user flag */
56 #define BASEYEAR 1970 /* the year time began on Unix DON'T CHANGE */
57 /* default for unqualified addresses */
58 #define BADHOST ".MISSING-HOST-NAME."
59 /* default for syntax errors in addresses */
60 #define ERRHOST ".SYNTAX-ERROR."
63 /* Coddle certain compilers' 6-character symbol limitation */
65 #ifdef __COMPILER_KCC__
70 /* Function status code */
72 #define NIL 0 /* convenient name */
73 #define T 1 /* opposite of NIL */
74 #define LONGT (long) 1 /* long T to pacify some compilers */
75 #define VOIDT (void *) "" /* void T ditto */
77 /* Global and Driver Parameters */
79 /* 0xx: driver and authenticator flags */
80 #define ENABLE_DRIVER (long) 1
81 #define DISABLE_DRIVER (long) 2
82 #define ENABLE_AUTHENTICATOR (long) 3
83 #define DISABLE_AUTHENTICATOR (long) 4
84 #define ENABLE_DEBUG (long) 5
85 #define DISABLE_DEBUG (long) 6
86 #define HIDE_AUTHENTICATOR (long) 7
87 #define UNHIDE_AUTHENTICATOR (long) 8
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_SSLDRIVER (long) 127
116 #define SET_SSLDRIVER (long) 128
117 #define GET_TRYSSLFIRST (long) 129
118 #define SET_TRYSSLFIRST (long) 130
119 #define GET_BLOCKNOTIFY (long) 131
120 #define SET_BLOCKNOTIFY (long) 132
121 #define GET_SORTRESULTS (long) 133
122 #define SET_SORTRESULTS (long) 134
123 #define GET_THREADRESULTS (long) 135
124 #define SET_THREADRESULTS (long) 136
125 #define GET_PARSELINE (long) 137
126 #define SET_PARSELINE (long) 138
127 #define GET_NEWSRCQUERY (long) 139
128 #define SET_NEWSRCQUERY (long) 140
129 #define GET_FREEENVELOPESPAREP (long) 141
130 #define SET_FREEENVELOPESPAREP (long) 142
131 #define GET_FREEELTSPAREP (long) 143
132 #define SET_FREEELTSPAREP (long) 144
133 #define GET_SSLSTART (long) 145
134 #define SET_SSLSTART (long) 146
135 #define GET_DEBUGSENSITIVE (long) 147
136 #define SET_DEBUGSENSITIVE (long) 148
137 #define GET_TCPDEBUG (long) 149
138 #define SET_TCPDEBUG (long) 150
139 #define GET_FREESTREAMSPAREP (long) 151
140 #define SET_FREESTREAMSPAREP (long) 152
141 #define GET_FREEBODYSPAREP (long) 153
142 #define SET_FREEBODYSPAREP (long) 154
143 #define GET_COPYUID (long) 155
144 #define SET_COPYUID (long) 156
145 #define GET_APPENDUID (long) 157
146 #define SET_APPENDUID (long) 158
147 #define GET_RFC822OUTPUTFULL (long) 159
148 #define SET_RFC822OUTPUTFULL (long) 160
149 #define GET_BLOCKENVINIT (long) 161
150 #define SET_BLOCKENVINIT (long) 162
151 #define GET_UCS4WIDTH (long) 163
152 #define SET_UCS4WIDTH (long) 164
153 #define GET_IDPARAMS (long) 165
154 #define SET_IDPARAMS (long) 166
155 #define GET_IDSTREAM (long) 167
156 #define SET_IDSTREAM (long) 168
157 #define GET_OA2CLIENTGETACCESSCODE (long) 169
158 #define SET_OA2CLIENTGETACCESSCODE (long) 170
159 #define GET_OA2CLIENTINFO (long) 171
160 #define SET_OA2CLIENTINFO (long) 172
162 /* 2xx: environment */
163 #define GET_USERNAME (long) 201
164 #define SET_USERNAME (long) 202
165 #define GET_HOMEDIR (long) 203
166 #define SET_HOMEDIR (long) 204
167 #define GET_LOCALHOST (long) 205
168 #define SET_LOCALHOST (long) 206
169 #define GET_SYSINBOX (long) 207
170 #define SET_SYSINBOX (long) 208
171 #define GET_USERPROMPT (long) 209
172 #define SET_USERPROMPT (long) 210
173 #define GET_DISABLEPLAINTEXT (long) 211
174 #define SET_DISABLEPLAINTEXT (long) 212
175 #define GET_CHROOTSERVER (long) 213
176 #define SET_CHROOTSERVER (long) 214
177 #define GET_ADVERTISETHEWORLD (long) 215
178 #define SET_ADVERTISETHEWORLD (long) 216
179 #define GET_DISABLEAUTOSHAREDNS (long) 217
180 #define SET_DISABLEAUTOSHAREDNS (long) 218
181 #define GET_MAILSUBDIR 219
182 #define SET_MAILSUBDIR 220
183 #define GET_DISABLE822TZTEXT 221
184 #define SET_DISABLE822TZTEXT 222
185 #define GET_LIMITEDADVERTISE (long) 223
186 #define SET_LIMITEDADVERTISE (long) 224
187 #define GET_LOGOUTHOOK (long) 225
188 #define SET_LOGOUTHOOK (long) 226
189 #define GET_LOGOUTDATA (long) 227
190 #define SET_LOGOUTDATA (long) 228
191 #define GET_EXTERNALAUTHID (long) 229
192 #define SET_EXTERNALAUTHID (long) 230
193 #define GET_SSLCAPATH (long) 231
194 #define SET_SSLCAPATH (long) 232
195 #define GET_SSLCAFILE (long) 233
196 #define SET_SSLCAFILE (long) 234
197 #define GET_RESTRICTIONS (long) 235
198 #define SET_RESTRICTIONS (long) 236
201 #define GET_OPENTIMEOUT (long) 300
202 #define SET_OPENTIMEOUT (long) 301
203 #define GET_READTIMEOUT (long) 302
204 #define SET_READTIMEOUT (long) 303
205 #define GET_WRITETIMEOUT (long) 304
206 #define SET_WRITETIMEOUT (long) 305
207 #define GET_CLOSETIMEOUT (long) 306
208 #define SET_CLOSETIMEOUT (long) 307
209 #define GET_TIMEOUT (long) 308
210 #define SET_TIMEOUT (long) 309
211 #define GET_RSHTIMEOUT (long) 310
212 #define SET_RSHTIMEOUT (long) 311
213 #define GET_ALLOWREVERSEDNS (long) 312
214 #define SET_ALLOWREVERSEDNS (long) 313
215 #define GET_RSHCOMMAND (long) 314
216 #define SET_RSHCOMMAND (long) 315
217 #define GET_RSHPATH (long) 316
218 #define SET_RSHPATH (long) 317
219 #define GET_SSHTIMEOUT (long) 318
220 #define SET_SSHTIMEOUT (long) 319
221 #define GET_SSHCOMMAND (long) 320
222 #define SET_SSHCOMMAND (long) 321
223 #define GET_SSHPATH (long) 322
224 #define SET_SSHPATH (long) 323
225 #define GET_SSLCERTIFICATEQUERY (long) 324
226 #define SET_SSLCERTIFICATEQUERY (long) 325
227 #define GET_SSLFAILURE (long) 326
228 #define SET_SSLFAILURE (long) 327
229 #define GET_NEWSRCCANONHOST (long) 328
230 #define SET_NEWSRCCANONHOST (long) 329
231 #define GET_KINIT (long) 330
232 #define SET_KINIT (long) 331
233 #define GET_SSLCLIENTCERT (long) 332
234 #define SET_SSLCLIENTCERT (long) 333
235 #define GET_SSLCLIENTKEY (long) 334
236 #define SET_SSLCLIENTKEY (long) 335
237 #define GET_KERBEROS_CP_SVR_NAME (long) 336
238 #define SET_KERBEROS_CP_SVR_NAME (long) 337
239 #define GET_ENCRYPTION_RANGE_MIN (long) 338
240 #define SET_ENCRYPTION_RANGE_MIN (long) 339
241 #define GET_ENCRYPTION_RANGE_MAX (long) 340
242 #define SET_ENCRYPTION_RANGE_MAX (long) 341
244 /* 4xx: network drivers */
245 #define GET_MAXLOGINTRIALS (long) 400
246 #define SET_MAXLOGINTRIALS (long) 401
247 #define GET_LOOKAHEAD (long) 402
248 #define SET_LOOKAHEAD (long) 403
249 #define GET_IMAPPORT (long) 404
250 #define SET_IMAPPORT (long) 405
251 #define GET_PREFETCH (long) 406
252 #define SET_PREFETCH (long) 407
253 #define GET_CLOSEONERROR (long) 408
254 #define SET_CLOSEONERROR (long) 409
255 #define GET_POP3PORT (long) 410
256 #define SET_POP3PORT (long) 411
257 #define GET_UIDLOOKAHEAD (long) 412
258 #define SET_UIDLOOKAHEAD (long) 413
259 #define GET_NNTPPORT (long) 414
260 #define SET_NNTPPORT (long) 415
261 #define GET_IMAPENVELOPE (long) 416
262 #define SET_IMAPENVELOPE (long) 417
263 #define GET_IMAPREFERRAL (long) 418
264 #define SET_IMAPREFERRAL (long) 419
265 #define GET_SSLIMAPPORT (long) 420
266 #define SET_SSLIMAPPORT (long) 421
267 #define GET_SSLPOPPORT (long) 422
268 #define SET_SSLPOPPORT (long) 423
269 #define GET_SSLNNTPPORT (long) 424
270 #define SET_SSLNNTPPORT (long) 425
271 #define GET_SSLSMTPPORT (long) 426
272 #define SET_SSLSMTPPORT (long) 427
273 #define GET_SMTPPORT (long) 428
274 #define SET_SMTPPORT (long) 429
275 #define GET_IMAPEXTRAHEADERS (long) 430
276 #define SET_IMAPEXTRAHEADERS (long) 431
277 #define GET_ACL (long) 432
278 #define SET_ACL (long) 433
279 #define GET_LISTRIGHTS (long) 434
280 #define SET_LISTRIGHTS (long) 435
281 #define GET_MYRIGHTS (long) 436
282 #define SET_MYRIGHTS (long) 437
283 #define GET_QUOTA (long) 438
284 #define SET_QUOTA (long) 439
285 #define GET_QUOTAROOT (long) 440
286 #define SET_QUOTAROOT (long) 441
287 #define GET_IMAPTRYSSL (long) 442
288 #define SET_IMAPTRYSSL (long) 443
289 #define GET_FETCHLOOKAHEAD (long) 444
290 #define SET_FETCHLOOKAHEAD (long) 445
291 #define GET_NNTPRANGE (long) 446
292 #define SET_NNTPRANGE (long) 447
293 #define GET_NNTPHIDEPATH (long) 448
294 #define SET_NNTPHIDEPATH (long) 449
295 #define GET_SENDCOMMAND (long) 450
296 #define SET_SENDCOMMAND (long) 451
297 #define GET_IDLETIMEOUT (long) 452
298 #define SET_IDLETIMEOUT (long) 453
299 #define GET_FETCHLOOKAHEADLIMIT (long) 454
300 #define SET_FETCHLOOKAHEADLIMIT (long) 455
302 /* 5xx: local file drivers */
303 #define GET_MBXPROTECTION (long) 500
304 #define SET_MBXPROTECTION (long) 501
305 #define GET_DIRPROTECTION (long) 502
306 #define SET_DIRPROTECTION (long) 503
307 #define GET_LOCKPROTECTION (long) 504
308 #define SET_LOCKPROTECTION (long) 505
309 #define GET_FROMWIDGET (long) 506
310 #define SET_FROMWIDGET (long) 507
311 #define GET_NEWSACTIVE (long) 508
312 #define SET_NEWSACTIVE (long) 509
313 #define GET_NEWSSPOOL (long) 510
314 #define SET_NEWSSPOOL (long) 511
315 #define GET_NEWSRC (long) 512
316 #define SET_NEWSRC (long) 513
317 #define GET_EXTENSION (long) 514
318 #define SET_EXTENSION (long) 515
319 #define GET_DISABLEFCNTLLOCK (long) 516
320 #define SET_DISABLEFCNTLLOCK (long) 517
321 #define GET_LOCKEACCESERROR (long) 518
322 #define SET_LOCKEACCESERROR (long) 519
323 #define GET_LISTMAXLEVEL (long) 520
324 #define SET_LISTMAXLEVEL (long) 521
325 #define GET_ANONYMOUSHOME (long) 522
326 #define SET_ANONYMOUSHOME (long) 523
327 #define GET_FTPHOME (long) 524
328 #define SET_FTPHOME (long) 525
329 #define GET_PUBLICHOME (long) 526
330 #define SET_PUBLICHOME (long) 527
331 #define GET_SHAREDHOME (long) 528
332 #define SET_SHAREDHOME (long) 529
333 #define GET_MHPROFILE (long) 530
334 #define SET_MHPROFILE (long) 531
335 #define GET_MHPATH (long) 532
336 #define SET_MHPATH (long) 533
337 #define GET_ONETIMEEXPUNGEATPING (long) 534
338 #define SET_ONETIMEEXPUNGEATPING (long) 535
339 #define GET_USERHASNOLIFE (long) 536
340 #define SET_USERHASNOLIFE (long) 537
341 #define GET_FTPPROTECTION (long) 538
342 #define SET_FTPPROTECTION (long) 539
343 #define GET_PUBLICPROTECTION (long) 540
344 #define SET_PUBLICPROTECTION (long) 541
345 #define GET_SHAREDPROTECTION (long) 542
346 #define SET_SHAREDPROTECTION (long) 543
347 #define GET_LOCKTIMEOUT (long) 544
348 #define SET_LOCKTIMEOUT (long) 545
349 #define GET_NOTIMEZONES (long) 546
350 #define SET_NOTIMEZONES (long) 547
351 #define GET_HIDEDOTFILES (long) 548
352 #define SET_HIDEDOTFILES (long) 549
353 #define GET_FTPDIRPROTECTION (long) 550
354 #define SET_FTPDIRPROTECTION (long) 551
355 #define GET_PUBLICDIRPROTECTION (long) 552
356 #define SET_PUBLICDIRPROTECTION (long) 553
357 #define GET_SHAREDDIRPROTECTION (long) 554
358 #define SET_SHAREDDIRPROTECTION (long) 555
359 #define GET_TRUSTDNS (long) 556
360 #define SET_TRUSTDNS (long) 557
361 #define GET_SASLUSESPTRNAME (long) 558
362 #define SET_SASLUSESPTRNAME (long) 559
363 #define GET_NETFSSTATBUG (long) 560
364 #define SET_NETFSSTATBUG (long) 561
365 #define GET_SNARFMAILBOXNAME (long) 562
366 #define SET_SNARFMAILBOXNAME (long) 563
367 #define GET_SNARFINTERVAL (long) 564
368 #define SET_SNARFINTERVAL (long) 565
369 #define GET_SNARFPRESERVE (long) 566
370 #define SET_SNARFPRESERVE (long) 567
371 #define GET_INBOXPATH (long) 568
372 #define SET_INBOXPATH (long) 569
373 #define GET_DIRFMTTEST (long) 570
374 #define SET_DIRFMTTEST (long) 571
375 #define GET_SCANCONTENTS (long) 572
376 #define SET_SCANCONTENTS (long) 573
377 #define GET_MHALLOWINBOX (long) 574
378 #define SET_MHALLOWINBOX (long) 575
382 #define DR_DISABLE (long) 0x1 /* driver is disabled */
383 #define DR_LOCAL (long) 0x2 /* local file driver */
384 #define DR_MAIL (long) 0x4 /* supports mail */
385 #define DR_NEWS (long) 0x8 /* supports news */
386 #define DR_READONLY (long) 0x10 /* driver only allows readonly access */
387 #define DR_NOFAST (long) 0x20 /* "fast" data is slow (whole msg fetch) */
388 #define DR_NAMESPACE (long) 0x40/* driver has a special namespace */
389 #define DR_LOWMEM (long) 0x80 /* low amounts of memory available */
390 #define DR_LOCKING (long) 0x100 /* driver does locking */
391 #define DR_CRLF (long) 0x200 /* driver internal form uses CRLF newlines */
392 #define DR_NOSTICKY (long) 0x400/* driver does not support sticky UIDs */
393 #define DR_RECYCLE (long) 0x800 /* driver does stream recycling */
394 #define DR_XPOINT (long) 0x1000 /* needs to be checkpointed */
395 /* driver has no real internal date */
396 #define DR_NOINTDATE (long) 0x2000
397 /* driver does not announce new mail */
398 #define DR_NONEWMAIL (long) 0x4000
399 /* driver does not announce new mail when RO */
400 #define DR_NONEWMAILRONLY (long) 0x8000
401 /* driver can be halfopen */
402 #define DR_HALFOPEN (long) 0x10000
403 #define DR_DIRFMT (long) 0x20000/* driver is a directory-format */
404 #define DR_MODSEQ (long) 0x40000/* driver supports modseqs */
405 #define DR_SHORTLIVED (long) 0x80000/* assume server disconnects after sending command */
407 /* Cache management function codes */
409 #define CH_INIT (long) 10 /* initialize cache */
410 #define CH_SIZE (long) 11 /* (re-)size the cache */
411 #define CH_MAKEELT (long) 30 /* return elt, make if needed */
412 #define CH_ELT (long) 31 /* return elt if exists */
413 #define CH_SORTCACHE (long) 35 /* return sortcache entry, make if needed */
414 #define CH_FREE (long) 40 /* free space used by elt */
415 /* free space used by sortcache */
416 #define CH_FREESORTCACHE (long) 43
417 #define CH_EXPUNGE (long) 45 /* delete elt pointer from list */
420 /* Mailbox open options
421 * For compatibility with the past, OP_DEBUG must always be 1.
424 #define OP_DEBUG (long) 0x1 /* debug protocol negotiations */
425 #define OP_READONLY (long) 0x2 /* read-only open */
426 #define OP_ANONYMOUS (long) 0x4 /* anonymous open of newsgroup */
427 #define OP_SHORTCACHE (long) 0x8/* short (elt-only) caching */
428 #define OP_SILENT (long) 0x10 /* don't pass up events (internal use) */
429 #define OP_PROTOTYPE (long) 0x20/* return driver prototype */
430 #define OP_HALFOPEN (long) 0x40 /* half-open (IMAP connect but no select) */
431 #define OP_EXPUNGE (long) 0x80 /* silently expunge recycle stream */
432 #define OP_SECURE (long) 0x100 /* don't do non-secure authentication */
433 #define OP_TRYSSL (long) 0x200 /* try SSL first */
434 /* use multiple newsrc files */
435 #define OP_MULNEWSRC (long) 0x400
436 #define OP_NOKOD (long) 0x800 /* suppress kiss-of-death */
437 #define OP_SNIFF (long) 0x1000 /* metadata only open */
438 /* reserved for application use */
439 #define OP_RESERVED (unsigned long) 0xff000000
442 /* Net open options */
444 /* no error messages */
445 #define NET_SILENT ((unsigned long) 0x80000000)
446 /* no validation of SSL certificates */
447 #define NET_NOVALIDATECERT ((unsigned long) 0x40000000)
448 /* no open timeout */
449 #define NET_NOOPENTIMEOUT ((unsigned long) 0x20000000)
451 #define NET_TLSCLIENT ((unsigned long) 0x10000000)
453 #define NET_TRYSSL ((unsigned long) 0x8000000)
455 #define NET_TRYTLS1 ((unsigned long) 0x4000000)
456 /* try TLS1_1 mode */
457 #define NET_TRYTLS1_1 ((unsigned long) 0x2000000)
458 /* try TLS1_2 mode */
459 #define NET_TRYTLS1_2 ((unsigned long) 0x1000000)
460 /* try TLS1_3 mode */
461 #define NET_TRYTLS1_3 ((unsigned long) 0x800000)
465 #define CL_EXPUNGE (long) 1 /* expunge silently */
470 #define FT_UID (long) 0x1 /* argument is a UID */
471 #define FT_PEEK (long) 0x2 /* peek at data */
472 #define FT_NOT (long) 0x4 /* NOT flag for header lines fetch */
473 #define FT_INTERNAL (long) 0x8 /* text can be internal strings */
474 /* IMAP prefetch text when fetching header */
475 #define FT_PREFETCHTEXT (long) 0x20
476 #define FT_NOHDRS (long) 0x40 /* suppress fetching extra headers (note that
477 this breaks news handling) */
478 #define FT_NEEDENV (long) 0x80 /* (internal use) include envelope */
479 #define FT_NEEDBODY (long) 0x100/* (internal use) include body structure */
480 /* no fetch lookahead */
481 #define FT_NOLOOKAHEAD (long) 0x200
482 /* (internal use) lookahead in hdr searching */
483 #define FT_SEARCHLOOKAHEAD (long) 0x400
484 /* stringstruct return hack */
485 #define FT_RETURNSTRINGSTRUCT (long) 0x800
488 /* Flagging options */
490 #define ST_UID (long) 0x1 /* argument is a UID sequence */
491 #define ST_SILENT (long) 0x2 /* don't return results */
492 #define ST_SET (long) 0x4 /* set vs. clear */
495 /* Expunge options */
497 #define EX_UID (long) 0x1 /* argument is a UID sequence */
502 #define CP_UID (long) 0x1 /* argument is a UID sequence */
503 #define CP_MOVE (long) 0x2 /* delete from source after copying */
504 /* set debug in any created stream */
505 #define CP_DEBUG (long) 0x20000000
507 /* Search/sort/thread options */
509 #define SE_UID (long) 0x1 /* return UID */
510 #define SE_FREE (long) 0x2 /* free search program after finished */
511 #define SE_NOPREFETCH (long) 0x4/* no search prefetching */
512 #define SO_FREE (long) 0x8 /* free sort program after finished */
513 #define SE_NOSERVER (long) 0x10 /* don't do server-based search/sort/thread */
514 #define SE_RETAIN (long) 0x20 /* retain previous search results */
515 #define SO_OVERVIEW (long) 0x40 /* use overviews in searching (NNTP only) */
516 #define SE_NEEDBODY (long) 0x80 /* include body structure in prefetch */
517 #define SE_NOHDRS (long) 0x100 /* suppress prefetching extra headers (note
518 that this breaks news handling) */
519 #define SE_NOLOCAL (long) 0x200 /* no local retry (IMAP only) */
521 #define SO_NOSERVER SE_NOSERVER /* compatibility name */
522 #define SE_SILLYOK (long) 0x400 /* allow silly searches */
527 #define SA_MESSAGES (long) 0x1 /* number of messages */
528 #define SA_RECENT (long) 0x2 /* number of recent messages */
529 #define SA_UNSEEN (long) 0x4 /* number of unseen messages */
530 #define SA_UIDNEXT (long) 0x8 /* next UID to be assigned */
531 /* UID validity value */
532 #define SA_UIDVALIDITY (long) 0x10
533 /* set OP_DEBUG on any created stream */
534 #define SA_DEBUG (long) 0x10000000
535 /* use multiple newsrcs */
536 #define SA_MULNEWSRC (long) 0x20000000
540 #define MG_UID (long) 0x1 /* message number is a UID */
541 #define MG_COPY (long) 0x2 /* must return copy of argument */
543 /* SASL authenticator categories */
545 #define AU_SECURE (long) 0x1 /* /secure allowed */
546 #define AU_AUTHUSER (long) 0x2 /* /authuser=xxx allowed */
547 /* authenticator hidden */
548 #define AU_HIDE (long) 0x10000000
549 /* authenticator disabled */
550 #define AU_DISABLE (long) 0x20000000
551 /* can do single trip */
552 #define AU_SINGLE (long) 0x40000000
555 /* Garbage collection flags */
557 #define GC_ELT (long) 0x1 /* message cache elements */
558 #define GC_ENV (long) 0x2 /* envelopes and bodies */
559 #define GC_TEXTS (long) 0x4 /* cached texts */
562 /* mm_log()/mm_notify() condition codes */
564 #define WARN (long) 1 /* mm_log warning type */
565 #define ERROR (long) 2 /* mm_log error type */
566 #define PARSE (long) 3 /* mm_log parse error type */
567 #define BYE (long) 4 /* mm_notify stream dying */
568 #define TCPDEBUG (long) 5 /* mm_log TCP debug babble */
571 /* Bits from mail_parse_flags(). Don't change these, since the header format
572 * used by tenex, mtx, and mbx corresponds to these bits.
578 #define fANSWERED 0x8
582 #define fEXPUNGED 0x8000 /* internal flag */
584 /* Bits for mm_list() and mm_lsub() */
586 /* Note that (LATT_NOINFERIORS LATT_HASCHILDREN LATT_HASNOCHILDREN) and
587 * (LATT_NOSELECT LATT_MARKED LATT_UNMARKED) each have eight possible states,
588 * but only four of these are valid. The other four are silly states which
589 * while invalid can unfortunately be expressed in the IMAP protocol.
592 /* terminal node in hierarchy */
593 #define LATT_NOINFERIORS (long) 0x1
594 /* name can not be selected */
595 #define LATT_NOSELECT (long) 0x2
596 /* changed since last accessed */
597 #define LATT_MARKED (long) 0x4
598 /* accessed since last changed */
599 #define LATT_UNMARKED (long) 0x8
600 /* name has referral to remote mailbox */
601 #define LATT_REFERRAL (long) 0x10
602 /* has selectable inferiors */
603 #define LATT_HASCHILDREN (long) 0x20
604 /* has no selectable inferiors */
605 #define LATT_HASNOCHILDREN (long) 0x40
606 /* folder contains all messages */
607 #define LATT_ALL (long) 0x80
608 /* folder contains archived messages */
609 #define LATT_ARCHIVE (long) 0x100
610 /* folder contains drafts */
611 #define LATT_DRAFTS (long) 0x200
612 /* folder contains Flagged messages */
613 #define LATT_FLAGGED (long) 0x400
614 /* folder contains junk messages */
615 #define LATT_JUNK (long) 0x800
616 /* folder contains Sent mail */
617 #define LATT_SENT (long) 0x1000
618 /* folder contains deleted messages */
619 #define LATT_TRASH (long) 0x2000
623 #define SORTDATE 0 /* date */
624 #define SORTARRIVAL 1 /* arrival date */
625 #define SORTFROM 2 /* from */
626 #define SORTSUBJECT 3 /* subject */
627 #define SORTTO 4 /* to */
628 #define SORTCC 5 /* cc */
629 #define SORTSIZE 6 /* size */
632 /* imapreferral_t codes */
634 #define REFAUTHFAILED (long) 0 /* authentication referral -- not logged in */
635 #define REFAUTH (long) 1 /* authentication referral -- logged in */
636 #define REFSELECT (long) 2 /* select referral */
637 #define REFCREATE (long) 3
638 #define REFDELETE (long) 4
639 #define REFRENAME (long) 5
640 #define REFSUBSCRIBE (long) 6
641 #define REFUNSUBSCRIBE (long) 7
642 #define REFSTATUS (long) 8
643 #define REFCOPY (long) 9
644 #define REFAPPEND (long) 10
647 /* sendcommand_t codes */
649 /* expunge response deferred */
650 #define SC_EXPUNGEDEFERRED (long) 1
652 /* Block notification codes */
654 #define BLOCK_NONE 0 /* not blocked */
655 #define BLOCK_SENSITIVE 1 /* sensitive code, disallow alarms */
656 #define BLOCK_NONSENSITIVE 2 /* non-sensitive code, allow alarms */
657 #define BLOCK_DNSLOOKUP 10 /* blocked on DNS lookup */
658 #define BLOCK_TCPOPEN 11 /* blocked on TCP open */
659 #define BLOCK_TCPREAD 12 /* blocked on TCP read */
660 #define BLOCK_TCPWRITE 13 /* blocked on TCP write */
661 #define BLOCK_TCPCLOSE 14 /* blocked on TCP close */
662 #define BLOCK_FILELOCK 20 /* blocked on file locking */
665 /* In-memory sized-text */
667 #define SIZEDTEXT struct mail_sizedtext
670 unsigned char *data
; /* text */
671 unsigned long size
; /* size of text in octets */
677 #define STRINGLIST struct string_list
680 SIZEDTEXT text
; /* string text */
685 /* Parse results from mail_valid_net_parse */
687 #define NETMAXHOST 256
688 #define NETMAXUSER 65
689 #define NETMAXMBX (MAILTMPLEN/4)
691 #define NETMAXAUTH 16
692 typedef struct net_mailbox
{
693 char host
[NETMAXHOST
]; /* host name (may be canonicalized) */
694 char orighost
[NETMAXHOST
]; /* host name before canonicalization */
695 char user
[NETMAXUSER
]; /* user name */
696 char auth
[NETMAXAUTH
]; /* authenticator name (PLAIN, etc.) */
697 char authuser
[NETMAXUSER
]; /* authentication user name */
698 char mailbox
[NETMAXMBX
]; /* mailbox name */
699 char service
[NETMAXSRV
]; /* service name */
700 unsigned long port
; /* TCP port number */
701 unsigned int anoflag
: 1; /* anonymous */
702 unsigned int dbgflag
: 1; /* debug flag */
703 unsigned int secflag
: 1; /* secure flag */
704 unsigned int sslflag
: 1; /* SSL driver flag */
705 unsigned int tls1
: 1; /* Use TLSv1 */
706 unsigned int tls1_1
: 1; /* Use TLSv1.1 */
707 unsigned int tls1_2
: 1; /* Use TLSV1.2 */
708 unsigned int tls1_3
: 1; /* Use TLSV1.3 */
709 unsigned int trysslflag
: 1; /* try SSL driver first flag */
710 unsigned int novalidate
: 1; /* don't validate certificates */
711 unsigned int tlsflag
: 1; /* TLS flag */
712 unsigned int notlsflag
: 1; /* do not do TLS flag */
713 unsigned int readonlyflag
: 1;/* want readonly */
714 unsigned int norsh
: 1; /* don't use rsh/ssh */
715 unsigned int loser
: 1; /* server is a loser */
716 unsigned int tlssslv23
: 1; /* force SSLv23 client method over TLS */
719 #define SSL_MTHD(M) ((M).tlssslv23 ? NIL \
720 : (M).tls1 ? NET_TRYTLS1 \
721 : (M).tls1_1 ? NET_TRYTLS1_1 \
722 : (M).tls1_2 ? NET_TRYTLS1_2 \
723 : (M).tls1_3 ? NET_TRYTLS1_3 \
727 /* Item in an address list */
729 #define ADDRESS struct mail_address
732 char *personal
; /* personal name phrase */
733 char *adl
; /* at-domain-list source route */
734 char *mailbox
; /* mailbox name */
735 char *host
; /* domain name of mailbox's host */
736 char *error
; /* error in address from SMTP module */
738 char *type
; /* address type (default "rfc822") */
739 char *addr
; /* address as xtext */
741 ADDRESS
*next
; /* pointer to next address in list */
745 /* Message envelope */
747 typedef struct mail_envelope
{
748 unsigned int ngpathexists
: 1; /* newsgroups may be bogus */
749 unsigned int incomplete
: 1; /* envelope may be incomplete */
750 unsigned int imapenvonly
: 1; /* envelope only has IMAP envelope */
751 char *remail
; /* remail header if any */
752 ADDRESS
*return_path
; /* error return address */
753 unsigned char *date
; /* message composition date string */
754 ADDRESS
*from
; /* originator address list */
755 ADDRESS
*sender
; /* sender address list */
756 ADDRESS
*reply_to
; /* reply address list */
757 char *subject
; /* message subject string */
758 ADDRESS
*to
; /* primary recipient list */
759 ADDRESS
*cc
; /* secondary recipient list */
760 ADDRESS
*bcc
; /* blind secondary recipient list */
761 char *in_reply_to
; /* replied message ID */
762 char *message_id
; /* message ID */
763 char *newsgroups
; /* USENET newsgroups */
764 char *followup_to
; /* USENET reply newsgroups */
765 char *references
; /* USENET references */
766 void *sparep
; /* spare pointer reserved for main program */
769 /* Primary body types */
770 /* If you change any of these you must also change body_types in rfc822.c */
772 #define TYPETEXT 0 /* unformatted text */
773 #define TYPEMULTIPART 1 /* multiple part */
774 #define TYPEMESSAGE 2 /* encapsulated message */
775 #define TYPEAPPLICATION 3 /* application data */
776 #define TYPEAUDIO 4 /* audio */
777 #define TYPEIMAGE 5 /* static image */
778 #define TYPEVIDEO 6 /* video */
779 #define TYPEMODEL 7 /* model */
780 #define TYPEALL 8 /* type "*" */
781 #define TYPEOTHER 9 /* unknown */
782 #define TYPEMAX 15 /* maximum type code */
786 /* If you change any of these you must also change body_encodings in rfc822.c
789 #define ENC7BIT 0 /* 7 bit SMTP semantic data */
790 #define ENC8BIT 1 /* 8 bit SMTP semantic data */
791 #define ENCBINARY 2 /* 8 bit binary data */
792 #define ENCBASE64 3 /* base-64 encoded data */
793 #define ENCQUOTEDPRINTABLE 4 /* human-readable 8-as-7 bit data */
794 #define ENCOTHER 5 /* unknown */
795 #define ENCMAX 10 /* maximum encoding code */
800 #define BODY struct mail_bodystruct
801 #define MESSAGE struct mail_body_message
802 #define PARAMETER struct mail_body_parameter
803 #define PART struct mail_body_part
804 #define PARTTEXT struct mail_body_text
806 /* Message body text */
809 unsigned long offset
; /* offset from body origin */
810 SIZEDTEXT text
; /* text */
814 /* Message body structure */
817 unsigned short type
; /* body primary type */
818 unsigned short encoding
; /* body transfer encoding */
819 char *subtype
; /* subtype string */
820 PARAMETER
*parameter
; /* parameter list */
821 char *id
; /* body identifier */
822 char *description
; /* body description */
823 struct { /* body disposition */
824 char *type
; /* disposition type */
825 PARAMETER
*parameter
; /* disposition parameters */
827 STRINGLIST
*language
; /* body language */
828 char *location
; /* body content URI */
829 PARTTEXT mime
; /* MIME header */
830 PARTTEXT contents
; /* body part contents */
831 union { /* different ways of accessing contents */
832 PART
*part
; /* body part list */
833 MESSAGE
*msg
; /* body encapsulated message */
836 unsigned long lines
; /* size of text in lines */
837 unsigned long bytes
; /* size of text in octets */
839 char *md5
; /* MD5 checksum */
840 void *sparep
; /* spare pointer reserved for main program */
847 char *attribute
; /* parameter attribute name */
848 char *value
; /* parameter value */
849 PARAMETER
*next
; /* next parameter in list */
853 /* Multipart content list */
856 BODY body
; /* body information for this part */
857 PART
*next
; /* next body part */
861 /* RFC-822 Message */
864 ENVELOPE
*env
; /* message envelope */
865 BODY
*body
; /* message body */
866 PARTTEXT full
; /* full message */
867 STRINGLIST
*lines
; /* lines used to filter header */
868 PARTTEXT header
; /* header text */
869 PARTTEXT text
; /* body text */
872 /* Entry in the message cache array */
874 typedef struct message_cache
{
875 unsigned long msgno
; /* message number */
876 unsigned int lockcount
: 8; /* non-zero if multiple references */
877 unsigned long rfc822_size
; /* # of bytes of message as raw RFC822 */
878 struct { /* c-client internal use only */
879 unsigned long uid
; /* message unique ID */
880 unsigned long mod
; /* modseq */
881 PARTTEXT special
; /* special text pointers */
882 MESSAGE msg
; /* internal message pointers */
883 union { /* driver internal use */
887 unsigned int sequence
: 1; /* saved sequence bit */
888 unsigned int dirty
: 1; /* driver internal use */
889 unsigned int filter
: 1; /* driver internal use */
890 unsigned int ghost
: 1; /* driver internal use */
893 unsigned int day
: 5; /* day of month (1-31) */
894 unsigned int month
: 4; /* month of year (1-12) */
895 unsigned int year
: 7; /* year since BASEYEAR (expires in 127 yrs) */
896 unsigned int hours
: 5; /* hours (0-23) */
897 unsigned int minutes
: 6; /* minutes (0-59) */
898 unsigned int seconds
: 6; /* seconds (0-59) */
899 unsigned int zoccident
: 1; /* non-zero if west of UTC */
900 unsigned int zhours
: 4; /* hours from UTC (0-12) */
901 unsigned int zminutes
: 6; /* minutes (0-59) */
903 unsigned int seen
: 1; /* system Seen flag */
904 unsigned int deleted
: 1; /* system Deleted flag */
905 unsigned int flagged
: 1; /* system Flagged flag */
906 unsigned int answered
: 1; /* system Answered flag */
907 unsigned int draft
: 1; /* system Draft flag */
908 unsigned int recent
: 1; /* system Recent flag */
910 unsigned int valid
: 1; /* elt has valid flags */
911 unsigned int searched
: 1; /* message was searched */
912 unsigned int sequence
: 1; /* message is in sequence */
913 /* reserved for use by main program */
914 unsigned int spare
: 1; /* first spare bit */
915 unsigned int spare2
: 1; /* second spare bit */
916 unsigned int spare3
: 1; /* third spare bit */
917 unsigned int spare4
: 1; /* fourth spare bit */
918 unsigned int spare5
: 1; /* fifth spare bit */
919 unsigned int spare6
: 1; /* sixth spare bit */
920 unsigned int spare7
: 1; /* seventh spare bit */
921 unsigned int spare8
: 1; /* eighth spare bit */
922 void *sparep
; /* spare pointer */
923 unsigned long user_flags
; /* user-assignable flags */
926 /* String structure */
928 #define STRINGDRIVER struct string_driver
930 typedef struct mailstring
{
931 void *data
; /* driver-dependent data */
932 unsigned long data1
; /* driver-dependent data */
933 unsigned long size
; /* total length of string */
934 char *chunk
; /* base address of chunk */
935 unsigned long chunksize
; /* size of chunk */
936 unsigned long offset
; /* offset of this chunk in base */
937 char *curpos
; /* current position in chunk */
938 unsigned long cursize
; /* number of bytes remaining in chunk */
939 STRINGDRIVER
*dtb
; /* driver that handles this type of string */
943 /* Dispatch table for string driver */
946 /* initialize string driver */
947 void (*init
) (STRING
*s
,void *data
,unsigned long size
);
948 /* get next character in string */
949 char (*next
) (STRING
*s
);
950 /* set position in string */
951 void (*setpos
) (STRING
*s
,unsigned long i
);
955 /* Stringstruct access routines */
957 #define INIT(s,d,data,size) ((*((s)->dtb = &d)->init) (s,data,size))
958 #define SIZE(s) ((s)->size - GETPOS (s))
959 #define CHR(s) (*(s)->curpos)
960 #define SNX(s) (--(s)->cursize ? *(s)->curpos++ : (*(s)->dtb->next) (s))
961 #define GETPOS(s) ((s)->offset + ((s)->curpos - (s)->chunk))
962 #define SETPOS(s,i) (*(s)->dtb->setpos) (s,i)
966 #define SEARCHPGM struct search_program
967 #define SEARCHHEADER struct search_header
968 #define SEARCHSET struct search_set
969 #define SEARCHOR struct search_or
970 #define SEARCHPGMLIST struct search_pgm_list
973 SEARCHHEADER
{ /* header search */
974 SIZEDTEXT line
; /* header line */
975 SIZEDTEXT text
; /* text in header */
976 SEARCHHEADER
*next
; /* next in list */
980 SEARCHSET
{ /* message set */
981 unsigned long first
; /* sequence number */
982 unsigned long last
; /* last value, if a range */
983 SEARCHSET
*next
; /* next in list */
988 SEARCHPGM
*first
; /* first program */
989 SEARCHPGM
*second
; /* second program */
990 SEARCHOR
*next
; /* next in list */
995 SEARCHPGM
*pgm
; /* search program */
996 SEARCHPGMLIST
*next
; /* next in list */
999 SEARCHPGM
{ /* search program */
1000 SEARCHSET
*msgno
; /* message numbers */
1001 SEARCHSET
*uid
; /* unique identifiers */
1002 SEARCHOR
*or; /* or'ed in programs */
1003 SEARCHPGMLIST
*not; /* and'ed not program */
1004 SEARCHHEADER
*header
; /* list of headers */
1005 STRINGLIST
*bcc
; /* bcc recipients */
1006 STRINGLIST
*body
; /* text in message body */
1007 STRINGLIST
*cc
; /* cc recipients */
1008 STRINGLIST
*from
; /* originator */
1009 STRINGLIST
*keyword
; /* keywords */
1010 STRINGLIST
*unkeyword
; /* unkeywords */
1011 STRINGLIST
*subject
; /* text in subject */
1012 STRINGLIST
*text
; /* text in headers and body */
1013 STRINGLIST
*to
; /* to recipients */
1014 STRINGLIST
*x_gm_ext1
; /* use X-GM-EXT-1 extension */
1015 unsigned long larger
; /* larger than this size */
1016 unsigned long smaller
; /* smaller than this size */
1017 unsigned long older
; /* older than this interval */
1018 unsigned long younger
; /* younger than this interval */
1019 unsigned short sentbefore
; /* sent before this date */
1020 unsigned short senton
; /* sent on this date */
1021 unsigned short sentsince
; /* sent since this date */
1022 unsigned short before
; /* before this date */
1023 unsigned short on
; /* on this date */
1024 unsigned short since
; /* since this date */
1025 unsigned int answered
: 1; /* answered messages */
1026 unsigned int unanswered
: 1; /* unanswered messages */
1027 unsigned int deleted
: 1; /* deleted messages */
1028 unsigned int undeleted
: 1; /* undeleted messages */
1029 unsigned int draft
: 1; /* message draft */
1030 unsigned int undraft
: 1; /* message undraft */
1031 unsigned int flagged
: 1; /* flagged messages */
1032 unsigned int unflagged
: 1; /* unflagged messages */
1033 unsigned int recent
: 1; /* recent messages */
1034 unsigned int old
: 1; /* old messages */
1035 unsigned int seen
: 1; /* seen messages */
1036 unsigned int unseen
: 1; /* unseen messages */
1037 /* These must be simulated in IMAP */
1038 STRINGLIST
*return_path
; /* error return address */
1039 STRINGLIST
*sender
; /* sender address list */
1040 STRINGLIST
*reply_to
; /* reply address list */
1041 STRINGLIST
*in_reply_to
; /* replied message ID */
1042 STRINGLIST
*message_id
; /* message ID */
1043 STRINGLIST
*newsgroups
; /* USENET newsgroups */
1044 STRINGLIST
*followup_to
; /* USENET reply newsgroups */
1045 STRINGLIST
*references
; /* USENET references */
1049 /* Mailbox status */
1051 typedef struct mbx_status
{
1052 long flags
; /* validity flags */
1053 unsigned long messages
; /* number of messages */
1054 unsigned long recent
; /* number of recent messages */
1055 unsigned long unseen
; /* number of unseen messages */
1056 unsigned long uidnext
; /* next UID to be assigned */
1057 unsigned long uidvalidity
; /* UID validity value */
1062 typedef void (*postsort_t
) (void *sc
);
1064 #define SORTPGM struct sort_program
1067 unsigned int reverse
: 1; /* sort function is to be reversed */
1068 unsigned int abort
: 1; /* abort sorting */
1069 short function
; /* sort function */
1070 unsigned long nmsgs
; /* number of messages being sorted */
1072 unsigned long cached
; /* number of messages cached so far */
1073 unsigned long sorted
; /* number of messages sorted so far */
1074 unsigned long postsorted
; /* number of postsorted messages so far */
1076 postsort_t postsort
; /* post sorter */
1077 SORTPGM
*next
; /* next function */
1083 #define SORTCACHE struct sort_cache
1086 unsigned int sorted
: 1; /* message has been sorted */
1087 unsigned int postsorted
: 1; /* message has been postsorted */
1088 unsigned int refwd
: 1; /* subject is a re or fwd */
1089 unsigned int dirty
: 1; /* has data not written to backup */
1090 SORTPGM
*pgm
; /* sort program */
1091 unsigned long num
; /* message number (sequence or UID) */
1092 unsigned long date
; /* sent date */
1093 unsigned long arrival
; /* arrival date */
1094 unsigned long size
; /* message size */
1095 char *from
; /* from string */
1096 char *to
; /* to string */
1097 char *cc
; /* cc string */
1098 char *subject
; /* extracted subject string */
1099 char *message_id
; /* message-id string */
1100 char *unique
; /* unique string, normally message-id */
1101 STRINGLIST
*references
; /* references string */
1106 #define ACLLIST struct acl_list
1109 char *identifier
; /* authentication identifier */
1110 char *rights
; /* access rights */
1114 /* Quota resource list */
1116 #define QUOTALIST struct quota_list
1119 char *name
; /* resource name */
1120 unsigned long usage
; /* resource usage */
1121 unsigned long limit
; /* resource limit */
1122 QUOTALIST
*next
; /* next resource */
1127 #define IDLIST struct id_list
1130 char *name
; /* name of field */
1131 char *value
; /* value of the field */
1132 IDLIST
*next
; /* next value in the list */
1135 /* Mail Access I/O stream */
1138 /* Structure for mail driver dispatch */
1140 #define DRIVER struct driver
1143 /* Mail I/O stream */
1145 typedef struct mail_stream
{
1146 DRIVER
*dtb
; /* dispatch table for this driver */
1147 void *local
; /* pointer to driver local data */
1148 char *mailbox
; /* mailbox name (canonicalized) */
1149 char *original_mailbox
; /* mailbox name (non-canonicalized) */
1150 unsigned short use
; /* stream use count */
1151 unsigned short sequence
; /* stream sequence */
1152 unsigned int inbox
: 1; /* stream open on an INBOX */
1153 unsigned int lock
: 1; /* stream lock flag */
1154 unsigned int debug
: 1; /* stream debug flag */
1155 unsigned int silent
: 1; /* don't pass events to main program */
1156 unsigned int rdonly
: 1; /* stream read-only flag */
1157 unsigned int anonymous
: 1; /* stream anonymous access flag */
1158 unsigned int scache
: 1; /* stream short cache flag */
1159 unsigned int halfopen
: 1; /* stream half-open flag */
1160 unsigned int secure
: 1; /* stream secure flag */
1161 unsigned int tryssl
: 1; /* stream tryssl flag */
1162 unsigned int mulnewsrc
: 1; /* stream use multiple newsrc files */
1163 unsigned int perm_seen
: 1; /* permanent Seen flag */
1164 unsigned int perm_deleted
: 1;/* permanent Deleted flag */
1165 unsigned int perm_flagged
: 1;/* permanent Flagged flag */
1166 unsigned int perm_answered
:1;/* permanent Answered flag */
1167 unsigned int perm_draft
: 1; /* permanent Draft flag */
1168 unsigned int kwd_create
: 1; /* can create new keywords */
1169 unsigned int uid_nosticky
: 1;/* UIDs are not preserved */
1170 unsigned int unhealthy
: 1; /* unhealthy protocol negotiations */
1171 unsigned int nokod
: 1; /* suppress kiss-of-death */
1172 unsigned int sniff
: 1; /* metadata only */
1173 unsigned long perm_user_flags
;/* mask of permanent user flags */
1174 unsigned long gensym
; /* generated tag */
1175 unsigned long nmsgs
; /* # of associated msgs */
1176 unsigned long recent
; /* # of recent msgs */
1177 unsigned long uid_validity
; /* UID validity sequence */
1178 unsigned long uid_last
; /* last assigned UID */
1179 char *user_flags
[NUSERFLAGS
]; /* pointers to user flags in bit order */
1180 unsigned long cachesize
; /* size of message cache */
1181 MESSAGECACHE
**cache
; /* message cache array */
1182 SORTCACHE
**sc
; /* sort cache array */
1183 unsigned long msgno
; /* message number of `current' message */
1184 ENVELOPE
*env
; /* scratch buffer for envelope */
1185 BODY
*body
; /* scratch buffer for body */
1186 SIZEDTEXT text
; /* scratch buffer for text */
1188 char *name
; /* mailbox name to snarf from */
1189 unsigned long time
; /* last snarf time */
1190 long options
; /* snarf open options */
1192 struct { /* internal use only */
1193 struct { /* search temporaries */
1194 STRINGLIST
*string
; /* string(s) to search */
1195 long result
; /* search result */
1196 char *text
; /* cache of fetched text */
1198 STRING string
; /* stringstruct return hack */
1200 /* reserved for use by main program */
1201 void *sparep
; /* spare pointer */
1202 unsigned int spare
: 1; /* first spare bit */
1203 unsigned int spare2
: 1; /* second spare bit */
1204 unsigned int spare3
: 1; /* third spare bit */
1205 unsigned int spare4
: 1; /* fourth spare bit */
1206 unsigned int spare5
: 1; /* fifth spare bit */
1207 unsigned int spare6
: 1; /* sixth spare bit */
1208 unsigned int spare7
: 1; /* seventh spare bit */
1209 unsigned int spare8
: 1; /* eighth spare bit */
1212 /* Mail I/O stream handle */
1214 typedef struct mail_stream_handle
{
1215 MAILSTREAM
*stream
; /* pointer to mail stream */
1216 unsigned short sequence
; /* sequence of what we expect stream to be */
1220 /* Message overview */
1222 typedef struct mail_overview
{
1223 char *subject
; /* message subject string */
1224 ADDRESS
*from
; /* originator address list */
1225 char *date
; /* message composition date string */
1226 char *message_id
; /* message ID */
1227 char *references
; /* USENET references */
1228 struct { /* may be 0 or NUL if unknown/undefined */
1229 unsigned long octets
; /* message octets (probably LF-newline form) */
1230 unsigned long lines
; /* message lines */
1231 char *xref
; /* cross references */
1235 /* Network access I/O stream */
1238 /* Structure for network driver dispatch */
1240 #define NETDRIVER struct net_driver
1243 /* Network transport I/O stream */
1245 typedef struct net_stream
{
1246 void *stream
; /* driver's I/O stream */
1247 NETDRIVER
*dtb
; /* network driver */
1251 /* Network transport driver dispatch */
1254 void *(*open
) (char *host
,char *service
,unsigned long port
);
1255 void *(*aopen
) (NETMBX
*mb
,char *service
,char *usrbuf
);
1256 char *(*getline
) (void *stream
);
1257 long (*getbuffer
) (void *stream
,unsigned long size
,char *buffer
);
1258 long (*soutr
) (void *stream
,char *string
);
1259 long (*sout
) (void *stream
,char *string
,unsigned long size
);
1260 void (*close
) (void *stream
);
1261 char *(*host
) (void *stream
);
1262 char *(*remotehost
) (void *stream
);
1263 unsigned long (*port
) (void *stream
);
1264 char *(*localhost
) (void *stream
);
1265 char *(*getsize
) (void *stream
, unsigned long size
);
1269 /* Mailgets data identifier */
1271 typedef struct getsdata
{
1273 unsigned long msgno
;
1276 unsigned long first
;
1282 #define INIT_GETS(md,s,m,w,f,l) \
1283 md.stream = s, md.msgno = m, md.what = w, md.first = f, md.last = l, \
1284 md.stl = NIL, md.flags = NIL;
1286 /* Mail delivery I/O stream */
1288 typedef struct send_stream
{
1289 NETSTREAM
*netstream
; /* network I/O stream */
1290 char *host
; /* SMTP service host */
1291 char *reply
; /* last reply string */
1292 long replycode
; /* last reply code */
1293 unsigned int debug
: 1; /* stream debug flag */
1294 unsigned int sensitive
: 1; /* sensitive data in progress */
1295 unsigned int loser
: 1; /* server is a loser */
1296 unsigned int saslcancel
: 1; /* SASL cancelled by protocol */
1297 union { /* protocol specific */
1298 struct { /* SMTP specific */
1299 unsigned int ok
: 1; /* supports ESMTP */
1300 struct { /* service extensions */
1301 unsigned int send
: 1; /* supports SEND */
1302 unsigned int soml
: 1; /* supports SOML */
1303 unsigned int saml
: 1; /* supports SAML */
1304 unsigned int expn
: 1; /* supports EXPN */
1305 unsigned int help
: 1; /* supports HELP */
1306 unsigned int turn
: 1; /* supports TURN */
1307 unsigned int etrn
: 1; /* supports ETRN */
1308 unsigned int starttls
:1;/* supports STARTTLS */
1309 unsigned int relay
: 1; /* supports relaying */
1310 unsigned int pipe
: 1; /* supports pipelining */
1311 unsigned int ensc
: 1; /* supports enhanced status codes */
1312 unsigned int bmime
: 1; /* supports BINARYMIME */
1313 unsigned int chunk
: 1; /* supports CHUNKING */
1315 struct { /* 8-bit MIME transport */
1316 unsigned int ok
: 1; /* supports 8-bit MIME */
1317 unsigned int want
: 1; /* want 8-bit MIME */
1319 struct { /* delivery status notification */
1320 unsigned int ok
: 1; /* supports DSN */
1321 unsigned int want
: 1; /* want DSN */
1322 struct { /* notification options */
1323 /* notify on failure */
1324 unsigned int failure
: 1;
1325 /* notify on delay */
1326 unsigned int delay
: 1;
1327 /* notify on success */
1328 unsigned int success
: 1;
1330 unsigned int full
: 1; /* return full headers */
1331 char *envid
; /* envelope identifier as xtext */
1333 struct { /* size declaration */
1334 unsigned int ok
: 1; /* supports SIZE */
1335 unsigned long limit
; /* maximum size supported */
1337 struct { /* deliverby declaration */
1338 unsigned int ok
: 1; /* supports DELIVERBY */
1339 unsigned long minby
; /* minimum by-time */
1341 struct { /* authenticated turn */
1342 unsigned int ok
: 1; /* supports ATRN */
1343 char *domains
; /* domains */
1345 /* supported SASL authenticators */
1346 unsigned int auth
: MAXAUTHENTICATORS
;
1348 struct { /* NNTP specific */
1349 unsigned int post
: 1; /* supports POST */
1350 struct { /* NNTP extensions */
1351 unsigned int ok
: 1; /* supports extensions */
1352 /* supports LISTGROUP */
1353 unsigned int listgroup
: 1;
1354 unsigned int over
: 1; /* supports OVER */
1355 unsigned int hdr
: 1; /* supports HDR */
1356 unsigned int pat
: 1; /* supports PAT */
1357 /* supports STARTTLS */
1358 unsigned int starttls
: 1;
1359 /* server has MULTIDOMAIN */
1360 unsigned int multidomain
: 1;
1361 /* supports AUTHINFO USER */
1362 unsigned int authuser
: 1;
1363 /* supported authenticators */
1364 unsigned int sasl
: MAXAUTHENTICATORS
;
1370 /* Jacket into external interfaces */
1372 typedef long (*readfn_t
) (void *stream
,unsigned long size
,char *buffer
);
1373 typedef char *(*mailgets_t
) (readfn_t f
,void *stream
,unsigned long size
,
1375 typedef char *(*readprogress_t
) (GETS_DATA
*md
,unsigned long octets
);
1376 typedef void *(*mailcache_t
) (MAILSTREAM
*stream
,unsigned long msgno
,long op
);
1377 typedef long (*mailproxycopy_t
) (MAILSTREAM
*stream
,char *sequence
,
1378 char *mailbox
,long options
);
1379 typedef long (*tcptimeout_t
) (long overall
,long last
, char *host
);
1380 typedef long (*ucs4width_t
) (unsigned long c
);
1381 typedef void *(*authchallenge_t
) (void *stream
,unsigned long *len
);
1382 typedef long (*authrespond_t
) (void *stream
,char *base
,char *s
,unsigned long size
);
1383 typedef long (*authcheck_t
) (void);
1384 typedef long (*authclient_t
) (authchallenge_t challenger
,
1385 authrespond_t responder
, char *base
, char *service
,NETMBX
*mb
,
1386 void *s
, unsigned long port
, unsigned long *trial
,char *user
);
1387 typedef char *(*authresponse_t
) (void *challenge
,unsigned long clen
,
1388 unsigned long *rlen
);
1389 typedef char *(*authserver_t
) (authresponse_t responder
,int argc
,char *argv
[]);
1390 typedef void (*smtpverbose_t
) (char *buffer
);
1391 typedef void (*imapenvelope_t
) (MAILSTREAM
*stream
,unsigned long msgno
,
1393 typedef char *(*imapreferral_t
) (MAILSTREAM
*stream
,char *url
,long code
);
1394 typedef void (*overview_t
) (MAILSTREAM
*stream
,unsigned long uid
,OVERVIEW
*ov
,
1395 unsigned long msgno
);
1396 typedef unsigned long *(*sorter_t
) (MAILSTREAM
*stream
,char *charset
,
1397 SEARCHPGM
*spg
,SORTPGM
*pgm
,long flags
);
1398 typedef void (*parseline_t
) (ENVELOPE
*env
,char *hdr
,char *data
,char *host
);
1399 typedef ADDRESS
*(*parsephrase_t
) (char *phrase
,char *end
,char *host
);
1400 typedef void *(*blocknotify_t
) (int reason
,void *data
);
1401 typedef long (*kinit_t
) (char *host
,char *reason
);
1402 typedef void (*sendcommand_t
) (MAILSTREAM
*stream
,char *cmd
,long flags
);
1403 typedef char *(*newsrcquery_t
) (MAILSTREAM
*stream
,char *mulname
,char *name
);
1404 typedef void (*getacl_t
) (MAILSTREAM
*stream
,char *mailbox
,ACLLIST
*acl
);
1405 typedef void (*listrights_t
) (MAILSTREAM
*stream
,char *mailbox
,char *id
,
1406 char *alwaysrights
,STRINGLIST
*possiblerights
);
1407 typedef void (*myrights_t
) (MAILSTREAM
*stream
,char *mailbox
,char *rights
);
1408 typedef void (*quota_t
) (MAILSTREAM
*stream
,char *qroot
,QUOTALIST
*qlist
);
1409 typedef void (*quotaroot_t
) (MAILSTREAM
*stream
,char *mbx
,STRINGLIST
*qroot
);
1410 typedef void (*sortresults_t
) (MAILSTREAM
*stream
,unsigned long *list
,
1411 unsigned long size
);
1412 typedef char *(*userprompt_t
) (void);
1413 typedef long (*append_t
) (MAILSTREAM
*stream
,void *data
,char **flags
,
1414 char **date
,STRING
**message
);
1415 typedef void (*copyuid_t
) (MAILSTREAM
*stream
,char *mailbox
,
1416 unsigned long uidvalidity
,SEARCHSET
*sourceset
,
1417 SEARCHSET
*destset
);
1418 typedef void (*appenduid_t
) (char *mailbox
,unsigned long uidvalidity
,
1420 typedef long (*dirfmttest_t
) (char *name
);
1421 typedef long (*scancontents_t
) (char *name
,char *contents
,unsigned long csiz
,
1422 unsigned long fsiz
);
1424 typedef void (*freeeltsparep_t
) (void **sparep
);
1425 typedef void (*freeenvelopesparep_t
) (void **sparep
);
1426 typedef void (*freebodysparep_t
) (void **sparep
);
1427 typedef void (*freestreamsparep_t
) (void **sparep
);
1428 typedef void *(*sslstart_t
) (void *stream
,char *host
,unsigned long flags
);
1429 typedef long (*sslcertificatequery_t
) (char *reason
,char *host
,char *cert
);
1430 typedef void (*sslfailure_t
) (char *host
,char *reason
,unsigned long flags
);
1431 typedef void (*logouthook_t
) (void *data
);
1432 typedef char *(*sslclientcert_t
) (void);
1433 typedef char *(*sslclientkey_t
) (void);
1437 extern char *body_types
[]; /* defined body type strings */
1438 extern char *body_encodings
[]; /* defined body encoding strings */
1439 extern const char *days
[]; /* day name strings */
1440 extern const char *months
[]; /* month name strings */
1446 #define THREADNODE struct thread_node
1449 unsigned long num
; /* message number */
1450 SORTCACHE
*sc
; /* (internal use) sortcache entry */
1451 THREADNODE
*branch
; /* branch at this point in tree */
1452 THREADNODE
*next
; /* next node */
1455 typedef void (*threadresults_t
) (MAILSTREAM
*stream
,THREADNODE
*tree
);
1458 /* Thread dispatch */
1460 #define THREADER struct threader_list
1463 char *name
; /* name of threader */
1464 THREADNODE
*(*dispatch
) (MAILSTREAM
*stream
,char *charset
,SEARCHPGM
*spg
,
1465 long flags
,sorter_t sorter
);
1470 /* Container for references threading */
1472 typedef void ** container_t
;
1476 #define NAMESPACE struct mail_namespace
1479 char *name
; /* name of this namespace */
1480 int delimiter
; /* hierarchy delimiter */
1481 PARAMETER
*param
; /* namespace parameters */
1482 NAMESPACE
*next
; /* next namespace */
1486 /* Authentication */
1488 #define AUTHENTICATOR struct mail_authenticator
1491 long flags
; /* authenticator flags */
1492 char *name
; /* name of this authenticator */
1493 authcheck_t valid
; /* authenticator valid on this system */
1494 authclient_t client
; /* client function that supports it */
1495 authserver_t server
; /* server function that supports it */
1496 AUTHENTICATOR
*next
; /* next authenticator */
1499 /* Mail driver dispatch */
1502 char *name
; /* driver name */
1503 unsigned long flags
; /* driver flags */
1504 DRIVER
*next
; /* next driver */
1505 /* mailbox is valid for us */
1506 DRIVER
*(*valid
) (char *mailbox
);
1507 /* manipulate driver parameters */
1508 void *(*parameters
) (long function
,void *value
);
1509 /* scan mailboxes */
1510 void (*scan
) (MAILSTREAM
*stream
,char *ref
,char *pat
,char *contents
);
1511 /* list mailboxes */
1512 void (*list
) (MAILSTREAM
*stream
,char *ref
,char *pat
);
1513 /* list subscribed mailboxes */
1514 void (*lsub
) (MAILSTREAM
*stream
,char *ref
,char *pat
);
1515 /* subscribe to mailbox */
1516 long (*subscribe
) (MAILSTREAM
*stream
,char *mailbox
);
1517 /* unsubscribe from mailbox */
1518 long (*unsubscribe
) (MAILSTREAM
*stream
,char *mailbox
);
1519 /* create mailbox */
1520 long (*create
) (MAILSTREAM
*stream
,char *mailbox
);
1521 /* delete mailbox */
1522 long (*mbxdel
) (MAILSTREAM
*stream
,char *mailbox
);
1523 /* rename mailbox */
1524 long (*mbxren
) (MAILSTREAM
*stream
,char *old
,char *newname
);
1525 /* status of mailbox */
1526 long (*status
) (MAILSTREAM
*stream
,char *mbx
,long flags
);
1529 MAILSTREAM
*(*open
) (MAILSTREAM
*stream
);
1531 void (*close
) (MAILSTREAM
*stream
,long options
);
1532 /* fetch message "fast" attributes */
1533 void (*fast
) (MAILSTREAM
*stream
,char *sequence
,long flags
);
1534 /* fetch message flags */
1535 void (*msgflags
) (MAILSTREAM
*stream
,char *sequence
,long flags
);
1536 /* fetch message overview */
1537 long (*overview
) (MAILSTREAM
*stream
,overview_t ofn
);
1538 /* fetch message envelopes */
1539 ENVELOPE
*(*structure
) (MAILSTREAM
*stream
,unsigned long msgno
,BODY
**body
,
1541 /* return RFC-822 header */
1542 char *(*header
) (MAILSTREAM
*stream
,unsigned long msgno
,
1543 unsigned long *length
,long flags
);
1544 /* return RFC-822 text */
1545 long (*text
) (MAILSTREAM
*stream
,unsigned long msgno
,STRING
*bs
,long flags
);
1547 long (*msgdata
) (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1548 unsigned long first
,unsigned long last
,STRINGLIST
*lines
,
1550 /* return UID for message */
1551 unsigned long (*uid
) (MAILSTREAM
*stream
,unsigned long msgno
);
1552 /* return message number from UID */
1553 unsigned long (*msgno
) (MAILSTREAM
*stream
,unsigned long uid
);
1555 void (*flag
) (MAILSTREAM
*stream
,char *sequence
,char *flag
,long flags
);
1556 /* per-message modify flags */
1557 void (*flagmsg
) (MAILSTREAM
*stream
,MESSAGECACHE
*elt
);
1558 /* search for message based on criteria */
1559 long (*search
) (MAILSTREAM
*stream
,char *charset
,SEARCHPGM
*pgm
,long flags
);
1561 unsigned long *(*sort
) (MAILSTREAM
*stream
,char *charset
,SEARCHPGM
*spg
,
1562 SORTPGM
*pgm
,long flags
);
1563 /* thread messages */
1564 THREADNODE
*(*thread
) (MAILSTREAM
*stream
,char *type
,char *charset
,
1565 SEARCHPGM
*spg
,long flag
);
1566 /* ping mailbox to see if still alive */
1567 long (*ping
) (MAILSTREAM
*stream
);
1568 /* check for new messages */
1569 void (*check
) (MAILSTREAM
*stream
);
1570 /* expunge deleted messages */
1571 long (*expunge
) (MAILSTREAM
*stream
,char *sequence
,long options
);
1572 /* copy messages to another mailbox */
1573 long (*copy
) (MAILSTREAM
*stream
,char *sequence
,char *mailbox
,long options
);
1574 /* append string message to mailbox */
1575 long (*append
) (MAILSTREAM
*stream
,char *mailbox
,append_t af
,void *data
);
1576 /* garbage collect stream */
1577 void (*gc
) (MAILSTREAM
*stream
,long gcflags
);
1581 #include "linkage.h"
1583 /* Compatibility support names for old interfaces */
1585 #define GET_TRYALTFIRST GET_TRYSSLFIRST
1586 #define SET_TRYALTFIRST SET_TRYSSLFIRST
1587 #define GET_IMAPTRYALT GET_IMAPTRYSSL
1588 #define SET_IMAPTRYALT SET_IMAPTRYSSL
1589 #define OP_TRYALT OP_TRYSSL
1590 #define altflag sslflag
1592 #define mail_close(stream) \
1593 mail_close_full (stream,NIL)
1594 #define mail_fetchfast(stream,sequence) \
1595 mail_fetch_fast (stream,sequence,NIL)
1596 #define mail_fetchfast_full mail_fetch_fast
1597 #define mail_fetchflags(stream,sequence) \
1598 mail_fetch_flags (stream,sequence,NIL)
1599 #define mail_fetchflags_full mail_fetch_flags
1600 #define mail_fetchenvelope(stream,msgno) \
1601 mail_fetch_structure (stream,msgno,NIL,NIL)
1602 #define mail_fetchstructure(stream,msgno,body) \
1603 mail_fetch_structure (stream,msgno,body,NIL)
1604 #define mail_fetchstructure_full mail_fetch_structure
1605 #define mail_fetchheader(stream,msgno) \
1606 mail_fetch_header (stream,msgno,NIL,NIL,NIL,FT_PEEK)
1607 #define mail_fetchheader_full(stream,msgno,lines,len,flags) \
1608 mail_fetch_header (stream,msgno,NIL,lines,len,FT_PEEK | (flags))
1609 #define mail_fetchtext(stream,msgno) \
1610 mail_fetch_text (stream,msgno,NIL,NIL,NIL)
1611 #define mail_fetchtext_full(stream,msgno,length,flags) \
1612 mail_fetch_text (stream,msgno,NIL,length,flags)
1613 #define mail_fetchbody(stream,msgno,section,length) \
1614 mail_fetch_body (stream,msgno,section,length,NIL)
1615 #define mail_fetchbody_full mail_fetch_body
1616 #define mail_setflag(stream,sequence,flag) \
1617 mail_flag (stream,sequence,flag,ST_SET)
1618 #define mail_setflag_full(stream,sequence,flag,flags) \
1619 mail_flag (stream,sequence,flag,ST_SET | (flags))
1620 #define mail_clearflag(stream,sequence,flag) \
1621 mail_flag (stream,sequence,flag,NIL)
1622 #define mail_clearflag_full mail_flag
1623 #define mail_search(stream,criteria) \
1624 mail_search_full (stream,NIL,mail_criteria (criteria),SE_FREE);
1625 #define mail_expunge(stream) \
1626 mail_expunge_full (stream,NIL,NIL)
1627 #define mail_copy(stream,sequence,mailbox) \
1628 mail_copy_full (stream,sequence,mailbox,NIL)
1629 #define mail_move(stream,sequence,mailbox) \
1630 mail_copy_full (stream,sequence,mailbox,CP_MOVE)
1631 #define mail_append(stream,mailbox,message) \
1632 mail_append_full (stream,mailbox,NIL,NIL,message)
1634 /* Interfaces for SVR4 locking brain-damage workaround */
1636 /* Driver dispatching */
1638 #define SAFE_DELETE(dtb,stream,mailbox) (*dtb->mbxdel) (stream,mailbox)
1639 #define SAFE_RENAME(dtb,stream,old,newname) (*dtb->mbxren) (stream,old,newname)
1640 #define SAFE_STATUS(dtb,stream,mbx,flags) (*dtb->status) (stream,mbx,flags)
1641 #define SAFE_COPY(dtb,stream,sequence,mailbox,options) \
1642 (*dtb->copy) (stream,sequence,mailbox,options)
1643 #define SAFE_APPEND(dtb,stream,mailbox,af,data) \
1644 (*dtb->append) (stream,mailbox,af,data)
1645 #define SAFE_SCAN_CONTENTS(dtb,name,contents,csiz,fsiz) \
1646 scan_contents (dtb,name,contents,csiz,fsiz)
1649 /* Driver callbacks */
1651 #define MM_EXISTS mm_exists
1652 #define MM_EXPUNGED mm_expunged
1653 #define MM_FLAGS mm_flags
1654 #define MM_NOTIFY mm_notify
1655 #define MM_STATUS mm_status
1656 #define MM_LOG mm_log
1657 #define MM_CRITICAL mm_critical
1658 #define MM_NOCRITICAL mm_nocritical
1659 #define MM_DISKERROR mm_diskerror
1660 #define MM_FATAL mm_fatal
1661 #define MM_APPEND(af) (*af)
1663 /* Function prototypes */
1665 void mm_searched (MAILSTREAM
*stream
,unsigned long number
);
1666 void mm_exists (MAILSTREAM
*stream
,unsigned long number
);
1667 void mm_expunged (MAILSTREAM
*stream
,unsigned long number
);
1668 void mm_flags (MAILSTREAM
*stream
,unsigned long number
);
1669 void mm_notify (MAILSTREAM
*stream
,char *string
,long errflg
);
1670 void mm_list (MAILSTREAM
*stream
,int delimiter
,char *name
,long attributes
);
1671 void mm_lsub (MAILSTREAM
*stream
,int delimiter
,char *name
,long attributes
);
1672 void mm_status (MAILSTREAM
*stream
,char *mailbox
,MAILSTATUS
*status
);
1673 void mm_log (char *string
,long errflg
);
1674 void mm_dlog (char *string
);
1675 void mm_login (NETMBX
*mb
,char *user
,char **pwd
,long trial
);
1676 void mm_login_method (NETMBX
*mb
,char *user
, void *info
,long trial
, char *method
);
1677 void mm_critical (MAILSTREAM
*stream
);
1678 void mm_nocritical (MAILSTREAM
*stream
);
1679 long mm_diskerror (MAILSTREAM
*stream
,long errcode
,long serious
);
1680 void mm_fatal (char *string
);
1681 void *mm_cache (MAILSTREAM
*stream
,unsigned long msgno
,long op
);
1683 extern STRINGDRIVER mail_string
;
1684 void mail_versioncheck (char *version
);
1685 void mail_link (DRIVER
*driver
);
1686 void *mail_parameters (MAILSTREAM
*stream
,long function
,void *value
);
1687 DRIVER
*mail_valid (MAILSTREAM
*stream
,char *mailbox
,char *purpose
);
1688 DRIVER
*mail_valid_net (char *name
,DRIVER
*drv
,char *host
,char *mailbox
);
1689 long mail_valid_net_parse (char *name
,NETMBX
*mb
);
1690 long mail_valid_net_parse_work (char *name
,NETMBX
*mb
,char *service
);
1691 void mail_scan (MAILSTREAM
*stream
,char *ref
,char *pat
,char *contents
);
1692 void mail_list (MAILSTREAM
*stream
,char *ref
,char *pat
);
1693 void mail_lsub (MAILSTREAM
*stream
,char *ref
,char *pat
);
1694 long mail_subscribe (MAILSTREAM
*stream
,char *mailbox
);
1695 long mail_unsubscribe (MAILSTREAM
*stream
,char *mailbox
);
1696 long mail_create (MAILSTREAM
*stream
,char *mailbox
);
1697 long mail_delete (MAILSTREAM
*stream
,char *mailbox
);
1698 long mail_rename (MAILSTREAM
*stream
,char *old
,char *newname
);
1699 char *mail_utf7_valid (char *mailbox
);
1700 long mail_status (MAILSTREAM
*stream
,char *mbx
,long flags
);
1701 long mail_status_default (MAILSTREAM
*stream
,char *mbx
,long flags
);
1702 MAILSTREAM
*mail_open (MAILSTREAM
*stream
,char *name
,long options
);
1703 MAILSTREAM
*mail_open_work (DRIVER
*d
,MAILSTREAM
*stream
,char *name
,
1705 MAILSTREAM
*mail_close_full (MAILSTREAM
*stream
,long options
);
1706 MAILHANDLE
*mail_makehandle (MAILSTREAM
*stream
);
1707 void mail_free_handle (MAILHANDLE
**handle
);
1708 MAILSTREAM
*mail_stream (MAILHANDLE
*handle
);
1710 void mail_fetch_fast (MAILSTREAM
*stream
,char *sequence
,long flags
);
1711 void mail_fetch_flags (MAILSTREAM
*stream
,char *sequence
,long flags
);
1712 void mail_fetch_overview (MAILSTREAM
*stream
,char *sequence
,overview_t ofn
);
1713 void mail_fetch_overview_sequence (MAILSTREAM
*stream
,char *sequence
,
1715 void mail_fetch_overview_default (MAILSTREAM
*stream
,overview_t ofn
);
1716 ENVELOPE
*mail_fetch_structure (MAILSTREAM
*stream
,unsigned long msgno
,
1717 BODY
**body
,long flags
);
1718 char *mail_fetch_message (MAILSTREAM
*stream
,unsigned long msgno
,
1719 unsigned long *len
,long flags
);
1720 char *mail_fetch_header (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1721 STRINGLIST
*lines
,unsigned long *len
,long flags
);
1722 char *mail_fetch_text (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1723 unsigned long *len
,long flags
);
1724 char *mail_fetch_mime (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1725 unsigned long *len
,long flags
);
1726 char *mail_fetch_body (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1727 unsigned long *len
,long flags
);
1728 long mail_partial_text (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1729 unsigned long first
,unsigned long last
,long flags
);
1730 long mail_partial_body (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1731 unsigned long first
,unsigned long last
,long flags
);
1732 char *mail_fetch_text_return (GETS_DATA
*md
,SIZEDTEXT
*t
,unsigned long *len
);
1733 char *mail_fetch_string_return (GETS_DATA
*md
,STRING
*bs
,unsigned long i
,
1734 unsigned long *len
,long flags
);
1735 long mail_read (void *stream
,unsigned long size
,char *buffer
);
1736 unsigned long mail_uid (MAILSTREAM
*stream
,unsigned long msgno
);
1737 unsigned long mail_msgno (MAILSTREAM
*stream
,unsigned long uid
);
1738 void mail_fetchfrom (char *s
,MAILSTREAM
*stream
,unsigned long msgno
,
1740 void mail_fetchsubject (char *s
,MAILSTREAM
*stream
,unsigned long msgno
,
1742 MESSAGECACHE
*mail_elt (MAILSTREAM
*stream
,unsigned long msgno
);
1743 void mail_flag (MAILSTREAM
*stream
,char *sequence
,char *flag
,long flags
);
1744 long mail_search_full (MAILSTREAM
*stream
,char *charset
,SEARCHPGM
*pgm
,
1746 long mail_search_default (MAILSTREAM
*stream
,char *charset
,SEARCHPGM
*pgm
,
1748 long mail_ping (MAILSTREAM
*stream
);
1749 void mail_check (MAILSTREAM
*stream
);
1750 long mail_expunge_full (MAILSTREAM
*stream
,char *sequence
,long options
);
1751 long mail_copy_full (MAILSTREAM
*stream
,char *sequence
,char *mailbox
,
1753 long mail_append_full (MAILSTREAM
*stream
,char *mailbox
,char *flags
,char *date
,
1755 long mail_append_multiple (MAILSTREAM
*stream
,char *mailbox
,append_t af
,
1757 void mail_gc (MAILSTREAM
*stream
,long gcflags
);
1758 void mail_gc_msg (MESSAGE
*msg
,long gcflags
);
1759 void mail_gc_body (BODY
*body
);
1761 BODY
*mail_body_section (BODY
*b
, unsigned char *section
);
1762 BODY
*mail_body (MAILSTREAM
*stream
,unsigned long msgno
,
1763 unsigned char *section
);
1764 char *mail_date (char *string
,MESSAGECACHE
*elt
);
1765 char *mail_cdate (char *string
,MESSAGECACHE
*elt
);
1766 long mail_parse_date (MESSAGECACHE
*elt
,unsigned char *string
);
1767 void mail_exists (MAILSTREAM
*stream
,unsigned long nmsgs
);
1768 void mail_recent (MAILSTREAM
*stream
,unsigned long recent
);
1769 void mail_expunged (MAILSTREAM
*stream
,unsigned long msgno
);
1770 void mail_lock (MAILSTREAM
*stream
);
1771 void mail_unlock (MAILSTREAM
*stream
);
1772 void mail_debug (MAILSTREAM
*stream
);
1773 void mail_nodebug (MAILSTREAM
*stream
);
1774 void mail_dlog (char *string
,long flag
);
1775 long mail_match_lines (STRINGLIST
*lines
,STRINGLIST
*msglines
,long flags
);
1776 unsigned long mail_filter (char *text
,unsigned long len
,STRINGLIST
*lines
,
1778 long mail_search_msg (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1780 long mail_search_header_text (char *s
,STRINGLIST
*st
);
1781 long mail_search_header (SIZEDTEXT
*hdr
,STRINGLIST
*st
);
1782 long mail_search_text (MAILSTREAM
*stream
,unsigned long msgno
,char *section
,
1783 STRINGLIST
*st
,long flags
);
1784 long mail_search_body (MAILSTREAM
*stream
,unsigned long msgno
,BODY
*body
,
1785 char *prefix
,unsigned long section
,long flags
);
1786 long mail_search_string (SIZEDTEXT
*s
,char *charset
,STRINGLIST
**st
);
1787 long mail_search_string_work (SIZEDTEXT
*s
,STRINGLIST
**st
);
1788 long mail_search_keyword (MAILSTREAM
*stream
,MESSAGECACHE
*elt
,STRINGLIST
*st
,
1790 long mail_search_addr (ADDRESS
*adr
,STRINGLIST
*st
);
1791 char *mail_search_gets (readfn_t f
,void *stream
,unsigned long size
,
1793 SEARCHPGM
*mail_criteria (char *criteria
);
1794 int mail_criteria_date (unsigned short *date
,char **r
);
1795 int mail_criteria_string (STRINGLIST
**s
,char **r
);
1796 unsigned short mail_shortdate (unsigned int year
,unsigned int month
,
1798 SEARCHSET
*mail_parse_set (char *s
,char **ret
);
1799 SEARCHSET
*mail_append_set (SEARCHSET
*set
,unsigned long msgno
);
1800 unsigned long *mail_sort (MAILSTREAM
*stream
,char *charset
,SEARCHPGM
*spg
,
1801 SORTPGM
*pgm
,long flags
);
1802 unsigned long *mail_sort_cache (MAILSTREAM
*stream
,SORTPGM
*pgm
,SORTCACHE
**sc
,
1804 unsigned long *mail_sort_msgs (MAILSTREAM
*stream
,char *charset
,SEARCHPGM
*spg
,
1805 SORTPGM
*pgm
,long flags
);
1806 SORTCACHE
**mail_sort_loadcache (MAILSTREAM
*stream
,SORTPGM
*pgm
);
1807 unsigned int mail_strip_subject (char *t
,char **ret
);
1808 char *mail_strip_subject_wsp (char *s
);
1809 char *mail_strip_subject_blob (char *s
);
1810 int mail_sort_compare (const void *a1
,const void *a2
);
1811 unsigned long mail_longdate (MESSAGECACHE
*elt
);
1812 THREADNODE
*mail_thread (MAILSTREAM
*stream
,char *type
,char *charset
,
1813 SEARCHPGM
*spg
,long flags
);
1814 THREADNODE
*mail_thread_msgs (MAILSTREAM
*stream
,char *type
,char *charset
,
1815 SEARCHPGM
*spg
,long flags
,sorter_t sorter
);
1816 THREADNODE
*mail_thread_orderedsubject (MAILSTREAM
*stream
,char *charset
,
1817 SEARCHPGM
*spg
,long flags
,
1819 THREADNODE
*mail_thread_references (MAILSTREAM
*stream
,char *charset
,
1820 SEARCHPGM
*spg
,long flags
,
1822 void mail_thread_loadcache (MAILSTREAM
*stream
,unsigned long uid
,OVERVIEW
*ov
,
1823 unsigned long msgno
);
1824 char *mail_thread_parse_msgid (char *s
,char **ss
);
1825 STRINGLIST
*mail_thread_parse_references (char *s
,long flag
);
1826 long mail_thread_check_child (container_t mother
,container_t daughter
);
1827 container_t
mail_thread_prune_dummy (container_t msg
,container_t ane
);
1828 container_t
mail_thread_prune_dummy_work (container_t msg
,container_t ane
);
1829 THREADNODE
*mail_thread_c2node (MAILSTREAM
*stream
,container_t con
,long flags
);
1830 THREADNODE
*mail_thread_sort (THREADNODE
*thr
,THREADNODE
**tc
);
1831 int mail_thread_compare_date (const void *a1
,const void *a2
);
1832 long mail_sequence (MAILSTREAM
*stream
,unsigned char *sequence
);
1833 long mail_uid_sequence (MAILSTREAM
*stream
,unsigned char *sequence
);
1834 long mail_parse_flags (MAILSTREAM
*stream
,char *flag
,unsigned long *uf
);
1835 long mail_usable_network_stream (MAILSTREAM
*stream
,char *name
);
1837 MESSAGECACHE
*mail_new_cache_elt (unsigned long msgno
);
1838 ENVELOPE
*mail_newenvelope (void);
1839 ADDRESS
*mail_newaddr (void);
1840 BODY
*mail_newbody (void);
1841 BODY
*mail_initbody (BODY
*body
);
1842 PARAMETER
*mail_newbody_parameter (void);
1843 PART
*mail_newbody_part (void);
1844 MESSAGE
*mail_newmsg (void);
1845 STRINGLIST
*mail_newstringlist (void);
1846 SEARCHPGM
*mail_newsearchpgm (void);
1847 SEARCHHEADER
*mail_newsearchheader (char *line
,char *text
);
1848 SEARCHSET
*mail_newsearchset (void);
1849 SEARCHOR
*mail_newsearchor (void);
1850 SEARCHPGMLIST
*mail_newsearchpgmlist (void);
1851 SORTPGM
*mail_newsortpgm (void);
1852 THREADNODE
*mail_newthreadnode (SORTCACHE
*sc
);
1853 ACLLIST
*mail_newacllist (void);
1854 QUOTALIST
*mail_newquotalist (void);
1855 void mail_free_idlist (IDLIST
**idlist
);
1856 void mail_free_body (BODY
**body
);
1857 void mail_free_body_data (BODY
*body
);
1858 void mail_free_body_parameter (PARAMETER
**parameter
);
1859 void mail_free_body_part (PART
**part
);
1860 void mail_free_cache (MAILSTREAM
*stream
);
1861 void mail_free_elt (MESSAGECACHE
**elt
);
1862 void mail_free_envelope (ENVELOPE
**env
);
1863 void mail_free_address (ADDRESS
**address
);
1864 void mail_free_stringlist (STRINGLIST
**string
);
1865 void mail_free_searchpgm (SEARCHPGM
**pgm
);
1866 void mail_free_searchheader (SEARCHHEADER
**hdr
);
1867 void mail_free_searchset (SEARCHSET
**set
);
1868 void mail_free_searchor (SEARCHOR
**orl
);
1869 void mail_free_searchpgmlist (SEARCHPGMLIST
**pgl
);
1870 void mail_free_namespace (NAMESPACE
**n
);
1871 void mail_free_sortpgm (SORTPGM
**pgm
);
1872 void mail_free_threadnode (THREADNODE
**thr
);
1873 void mail_free_acllist (ACLLIST
**al
);
1874 void mail_free_quotalist (QUOTALIST
**ql
);
1875 void auth_link (AUTHENTICATOR
*auth
);
1876 char *mail_auth (char *mechanism
,authresponse_t resp
,int argc
,char *argv
[]);
1877 AUTHENTICATOR
*mail_lookup_auth (unsigned long i
);
1878 unsigned int mail_lookup_auth_name (char *mechanism
,long flags
);
1880 NETSTREAM
*net_open (NETMBX
*mb
,NETDRIVER
*dv
,unsigned long port
,
1881 NETDRIVER
*ssld
,char *ssls
,unsigned long sslp
);
1882 NETSTREAM
*net_open_work (NETDRIVER
*dv
,char *host
,char *service
,
1883 unsigned long port
,unsigned long portoverride
,
1884 unsigned long flags
);
1885 NETSTREAM
*net_aopen (NETDRIVER
*dv
,NETMBX
*mb
,char *service
,char *usrbuf
);
1886 char *net_getline (NETSTREAM
*stream
);
1887 /* stream must be void* for use as readfn_t */
1888 long net_getbuffer (void *stream
,unsigned long size
,char *buffer
);
1889 long net_soutr (NETSTREAM
*stream
,char *string
);
1890 long net_sout (NETSTREAM
*stream
,char *string
,unsigned long size
);
1891 void net_close (NETSTREAM
*stream
);
1892 char *net_host (NETSTREAM
*stream
);
1893 char *net_remotehost (NETSTREAM
*stream
);
1894 unsigned long net_port (NETSTREAM
*stream
);
1895 char *net_localhost (NETSTREAM
*stream
);
1896 char *net_getsize(NETSTREAM
*stream
, unsigned long size
);
1898 long sm_subscribe (char *mailbox
);
1899 long sm_unsubscribe (char *mailbox
);
1900 char *sm_read (char *sbname
,void **sdb
);
1902 void ssl_onceonlyinit (void);
1903 char *ssl_start_tls (char *s
);
1904 void ssl_server_init (char *server
);
1905 void free_c_client_module_globals(void);
1907 /* Server I/O functions */
1910 char *PSIN (char *s
,int n
);
1911 long PSINR (char *s
,unsigned long n
);
1913 long INWAIT (long seconds
);
1914 int PSOUT (char *s
);
1915 int PSOUTR (SIZEDTEXT
*s
);
1918 /* XOAUTH2 and AUTHBEARER Client-Side Support */
1920 #define OA2NAME "XOAUTH2"
1921 #define BEARERNAME "OAUTHBEARER"
1923 #define OAUTH2_MAX_EQUIV (2)
1924 #define OAUTH2_TOT_EQUIV (OAUTH2_MAX_EQUIV + 2)
1925 #define OAUTH2_PARAM_NUMBER (7)
1927 typedef enum {OA2_Id
= 0, OA2_Secret
, OA2_Code
, OA2_RefreshToken
,
1928 OA2_Scope
, OA2_Redirect
,
1929 OA2_GrantTypeforAccessToken
, OA2_GrantTypefromRefreshToken
,
1930 OA2_Response
, OA2_State
, OA2_Prompt
, OA2_End
} OA2_type
;
1932 typedef enum {OA2_GetAccessCode
= 0,
1933 OA2_GetAccessTokenFromAccessCode
,
1934 OA2_GetAccessTokenFromRefreshToken
,
1935 OA2_GetEnd
} OA2_function
;
1937 typedef struct OA2_param_s
{
1942 typedef struct OA2_serverparam_s
{
1943 char *name
; /* method name: GET or POST */
1944 unsigned char *urlserver
;
1945 OA2_type params
[OAUTH2_PARAM_NUMBER
];
1946 } OAUTH2_SERVER_METHOD_S
;
1948 typedef struct oauth2_s
{
1949 unsigned char *name
; /* provider name */
1950 char *host
[OAUTH2_TOT_EQUIV
]; /* servers for which this data applies */
1951 OAUTH2_PARAM_S param
[OA2_End
]; /* parameters name and values for this server */
1952 /* servers, methods and parameters to retrieve access code and tokens */
1953 OAUTH2_SERVER_METHOD_S server_mthd
[OA2_GetEnd
];
1955 unsigned long expiration
;
1958 typedef char *(*oauth2getaccesscode_t
) (unsigned char *, char *, OAUTH2_S
*, int *);
1959 typedef void (*oauth2clientinfo_t
)(unsigned char *name
, char **id
, char **secret
);