fix a segfault introduced by some nasty const /o\
[apps/madmutt.git] / mutt.h
1 /*
2  * Copyright notice from original mutt:
3  * Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>
4  * Copyright (C) 2004 g10 Code GmbH
5  *
6  * This file is part of mutt-ng, see http://www.muttng.org/.
7  * It's licensed under the GNU General Public License,
8  * please see the file GPL in the top level source directory.
9  */
10
11 #ifndef _MUTT_H
12 #define _MUTT_H
13
14 #include "config.h"
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #ifdef HAVE_UNISTD_H
19 # include <unistd.h>            /* needed for SEEK_SET */
20 #endif
21 #ifdef HAVE_UNIX_H
22 # include <unix.h>              /* needed for snprintf on QNX. */
23 #endif
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <time.h>
27 #include <limits.h>
28 #include <stdarg.h>
29 #include <signal.h>
30 #ifdef HAVE_WCHAR_H
31 # include <wchar.h>
32 #endif
33 #if defined(HAVE_WCTYPE_H) && defined(HAVE_WC_FUNCS)
34 # include <wctype.h>
35 #endif
36
37 #ifndef _POSIX_PATH_MAX
38 #include <posix1_lim.h>
39 #endif
40
41 #include <pwd.h>
42 #include <grp.h>
43
44 #include "rfc822.h"
45 #include "list.h"
46 #include "hash.h"
47 #include "charset.h"
48 #include "lib/rx.h"
49
50 #ifndef HAVE_WC_FUNCS
51 # ifdef MB_LEN_MAX
52 #  undef MB_LEN_MAX
53 # endif
54 # define MB_LEN_MAX 16
55 #endif
56
57 # define MUTT_VERSION (VERSION)
58
59 /* nifty trick I stole from ELM 2.5alpha. */
60 #ifdef MAIN_C
61 #define WHERE
62 #define INITVAL(x) = x
63 #else
64 #define WHERE extern
65 #define INITVAL(x)
66 #endif
67
68 /* flags for mutt_extract_token() */
69 #define M_TOKEN_EQUAL           1       /* treat '=' as a special */
70 #define M_TOKEN_CONDENSE        (1<<1)  /* ^(char) to control chars (macros) */
71 #define M_TOKEN_SPACE           (1<<2)  /* don't treat whitespace as a term */
72 #define M_TOKEN_QUOTE           (1<<3)  /* don't interpret quotes */
73 #define M_TOKEN_PATTERN         (1<<4)  /* !)|~ are terms (for patterns) */
74 #define M_TOKEN_COMMENT         (1<<5)  /* don't reap comments */
75 #define M_TOKEN_SEMICOLON       (1<<6)  /* don't treat ; as special */
76
77 typedef struct {
78   char *data;                   /* pointer to data */
79   char *dptr;                   /* current read/write position */
80   size_t dsize;                 /* length of data */
81   int destroy;                  /* destroy `data' when done? */
82 } BUFFER;
83
84 typedef struct {
85   int ch;                       /* raw key pressed */
86   int op;                       /* function op */
87 } event_t;
88
89 /* flags for _mutt_system() */
90 #define M_DETACH_PROCESS        1       /* detach subprocess from group */
91
92 /* flags for mutt_FormatString() */
93 typedef enum {
94   M_FORMAT_FORCESUBJ = (1 << 0),        /* print the subject even if unchanged */
95   M_FORMAT_TREE = (1 << 1),     /* draw the thread tree */
96   M_FORMAT_MAKEPRINT = (1 << 2),        /* make sure that all chars are printable */
97   M_FORMAT_OPTIONAL = (1 << 3),
98   M_FORMAT_STAT_FILE = (1 << 4),        /* used by mutt_attach_fmt */
99   M_FORMAT_ARROWCURSOR = (1 << 5),      /* reserve space for arrow_cursor */
100   M_FORMAT_INDEX = (1 << 6)     /* this is a main index entry */
101 } format_flag;
102
103 /* types for mutt_add_hook() */
104 #define M_FOLDERHOOK    1
105 #define M_MBOXHOOK      (1<<1)
106 #define M_SENDHOOK      (1<<2)
107 #define M_FCCHOOK       (1<<3)
108 #define M_SAVEHOOK      (1<<4)
109 #define M_CHARSETHOOK   (1<<5)
110 #define M_ICONVHOOK     (1<<6)
111 #define M_MESSAGEHOOK   (1<<7)
112 #define M_CRYPTHOOK     (1<<8)
113 #define M_ACCOUNTHOOK   (1<<9)
114 #define M_REPLYHOOK     (1<<10)
115 #define M_SEND2HOOK     (1<<11)
116
117 #ifdef USE_COMPRESSED
118 #define M_OPENHOOK      (1<<12)
119 #define M_APPENDHOOK    (1<<13)
120 #define M_CLOSEHOOK     (1<<14)
121 #endif
122
123 /* tree characters for linearize_tree and print_enriched_string */
124 #define M_TREE_LLCORNER         1
125 #define M_TREE_ULCORNER         2
126 #define M_TREE_LTEE             3
127 #define M_TREE_HLINE            4
128 #define M_TREE_VLINE            5
129 #define M_TREE_SPACE            6
130 #define M_TREE_RARROW           7
131 #define M_TREE_STAR             8
132 #define M_TREE_HIDDEN           9
133 #define M_TREE_EQUALS           10
134 #define M_TREE_TTEE             11
135 #define M_TREE_BTEE             12
136 #define M_TREE_MISSING          13
137 #define M_TREE_MAX              14
138
139 #define M_THREAD_COLLAPSE       (1<<0)
140 #define M_THREAD_UNCOLLAPSE     (1<<1)
141 #define M_THREAD_GET_HIDDEN     (1<<2)
142 #define M_THREAD_UNREAD         (1<<3)
143 #define M_THREAD_NEXT_UNREAD    (1<<4)
144
145 enum {
146   /* modes for mutt_view_attachment() */
147   M_REGULAR = 1,
148   M_MAILCAP,
149   M_AS_TEXT,
150
151   /* action codes used by mutt_set_flag() and mutt_pattern_function() */
152   M_ALL,
153   M_NONE,
154   M_NEW,
155   M_OLD,
156   M_REPLIED,
157   M_READ,
158   M_UNREAD,
159   M_DELETE,
160   M_UNDELETE,
161   M_DELETED,
162   M_APPENDED,
163   M_PURGED,
164   M_FLAG,
165   M_TAG,
166   M_UNTAG,
167   M_LIMIT,
168   M_EXPIRED,
169   M_SUPERSEDED,
170
171   /* actions for mutt_pattern_comp/mutt_pattern_exec */
172   M_AND,
173   M_OR,
174   M_TO,
175   M_CC,
176   M_COLLAPSED,
177   M_SUBJECT,
178   M_FROM,
179   M_DATE,
180   M_DATE_RECEIVED,
181   M_DUPLICATED,
182   M_UNREFERENCED,
183   M_ID,
184   M_BODY,
185   M_HEADER,
186   M_HORMEL,
187   M_WHOLE_MSG,
188   M_SENDER,
189   M_MESSAGE,
190   M_SCORE,
191   M_SIZE,
192   M_REFERENCE,
193   M_RECIPIENT,
194   M_LIST,
195   M_SUBSCRIBED_LIST,
196   M_PERSONAL_RECIP,
197   M_PERSONAL_FROM,
198   M_ADDRESS,
199   M_CRYPT_SIGN,
200   M_CRYPT_VERIFIED,
201   M_CRYPT_ENCRYPT,
202   M_PGP_KEY,
203   M_XLABEL,
204   M_MIMEATTACH,
205 #ifdef USE_NNTP
206   M_NEWSGROUPS,
207 #endif
208   M_REALNAME,
209   M_MULTIPART,
210
211   /* Options for Mailcap lookup */
212   M_EDIT,
213   M_COMPOSE,
214   M_PRINT,
215   M_AUTOVIEW,
216
217   /* options for socket code */
218   M_NEW_SOCKET,
219 #ifdef USE_SSL
220   M_NEW_SSL_SOCKET,
221 #endif
222
223   /* Options for mutt_save_attachment */
224   M_SAVE_APPEND,
225   M_SAVE_OVERWRITE
226 };
227
228 /* possible arguments to set_quadoption() */
229 enum {
230   M_NO,
231   M_YES,
232   M_ASKNO,
233   M_ASKYES
234 };
235
236 /* quad-option vars */
237 enum {
238   OPT_ABORT,
239   OPT_ATTACH,
240   OPT_BOUNCE,
241   OPT_COPY,
242   OPT_DELETE,
243   OPT_FORWEDIT,
244   OPT_INCLUDE,
245 #ifdef USE_IMAP
246   OPT_IMAPRECONNECT,
247 #endif
248   OPT_MFUPTO,
249   OPT_MIMEFWD,
250   OPT_MIMEFWDREST,
251   OPT_MOVE,
252   OPT_PGPMIMEAUTO,              /* ask to revert to PGP/MIME when inline fails */
253 #ifdef USE_POP
254   OPT_POPDELETE,
255   OPT_POPRECONNECT,
256 #endif
257   OPT_POSTPONE,
258   OPT_PRINT,
259   OPT_QUIT,
260   OPT_REPLYTO,
261   OPT_RECALL,
262 #if defined(USE_SSL) || defined(USE_GNUTLS)
263   OPT_SSLSTARTTLS,
264 #endif
265   OPT_SUBJECT,
266   OPT_VERIFYSIG,                /* verify PGP signatures */
267   OPT_LISTREPLY,
268 #ifdef USE_NNTP
269   OPT_TOMODERATED,
270   OPT_NNTPRECONNECT,
271   OPT_CATCHUP,
272   OPT_FOLLOWUPTOPOSTER,
273 #endif                          /* USE_NNTP */
274
275   /* THIS MUST BE THE LAST VALUE. */
276   OPT_MAX
277 };
278
279 /* flags to ci_send_message() */
280 #define SENDREPLY       (1<<0)
281 #define SENDGROUPREPLY  (1<<1)
282 #define SENDLISTREPLY   (1<<2)
283 #define SENDFORWARD     (1<<3)
284 #define SENDPOSTPONED   (1<<4)
285 #define SENDBATCH       (1<<5)
286 #define SENDMAILX       (1<<6)
287 #define SENDKEY         (1<<7)
288 #define SENDRESEND      (1<<8)
289 #define SENDNEWS        (1<<9)
290
291 /* flags to _mutt_select_file() */
292 #define M_SEL_BUFFY     (1<<0)
293 #define M_SEL_MULTI     (1<<1)
294 #define M_SEL_FOLDER    (1<<2)
295
296 /* flags for parse_spam_list */
297 #define M_SPAM          1
298 #define M_NOSPAM        2
299
300 /* boolean vars */
301 enum {
302   OPTALLOW8BIT,
303   OPTALLOWANSI,
304   OPTARROWCURSOR,
305   OPTASCIICHARS,
306   OPTASKBCC,
307   OPTASKCC,
308   OPTASKFOLLOWUP,
309   OPTASKXCOMMENTTO,
310   OPTATTACHSPLIT,
311   OPTAUTOEDIT,
312   OPTAUTOTAG,
313   OPTBEEP,
314   OPTBEEPNEW,
315   OPTBOUNCEDELIVERED,
316   OPTBRAILLEFRIENDLY,
317   OPTCHECKNEW,
318   OPTCOLLAPSEUNREAD,
319   OPTCONFIRMAPPEND,
320   OPTCONFIRMCREATE,
321   OPTCOUNTATTACH,
322   OPTDELETEUNTAG,
323   OPTDELSP,
324   OPTDIGESTCOLLAPSE,
325   OPTDUPTHREADS,
326   OPTEDITHDRS,
327   OPTENCODEFROM,
328   OPTENVFROM,
329   OPTFASTREPLY,
330   OPTFCCATTACH,
331   OPTFCCCLEAR,
332   OPTFOLLOWUPTO,
333   OPTFORCEBUFFYCHECK,
334   OPTFORCENAME,
335   OPTFORWDECODE,
336   OPTFORWQUOTE,
337 #ifdef USE_HCACHE
338   OPTHCACHEVERIFY,
339 #if HAVE_QDBM
340   OPTHCACHECOMPRESS,
341 #endif /* HAVE_QDBM */
342 #endif
343   OPTHDRS,
344   OPTHEADER,
345   OPTHELP,
346   OPTHIDDENHOST,
347   OPTHIDELIMITED,
348   OPTHIDEMISSING,
349   OPTHIDETHREADSUBJECT,
350   OPTHIDETOPLIMITED,
351   OPTHIDETOPMISSING,
352   OPTIGNORELISTREPLYTO,
353 #ifdef USE_IMAP
354   OPTIMAPCHECKSUBSCRIBED,
355   OPTIMAPLSUB,
356   OPTIMAPPASSIVE,
357   OPTIMAPPEEK,
358   OPTIMAPSERVERNOISE,
359 #endif
360 #if defined(USE_SSL) || defined(USE_GNUTLS)
361 # ifndef USE_GNUTLS
362   OPTSSLSYSTEMCERTS,
363   OPTSSLV2,
364 # endif /* !USE_GNUTLS */
365   OPTSSLV3,
366   OPTTLSV1,
367   OPTSSLFORCETLS,
368 #endif /* USE_SSL || USE_GNUTLS */
369   OPTIMPLICITAUTOVIEW,
370   OPTINCLUDEONLYFIRST,
371   OPTKEEPFLAGGED,
372   OPTMAILCAPSANITIZE,
373   OPTMAILDIRTRASH,
374   OPTMARKERS,
375   OPTMARKOLD,
376   OPTMBOXPANE,
377   OPTMENUSCROLL,                /* scroll menu instead of implicit next-page */
378   OPTMENUMOVEOFF,
379   OPTMETAKEY,                   /* interpret ALT-x as ESC-x */
380   OPTMETOO,
381   OPTMHPURGE,
382   OPTMIMEFORWDECODE,
383 #ifdef USE_NNTP
384   OPTMIMESUBJECT,               /* encode subject line with RFC2047 */
385 #endif
386   OPTNARROWTREE,
387   OPTPAGERSTOP,
388   OPTPIPEDECODE,
389   OPTPIPESPLIT,
390 #ifdef USE_POP
391   OPTPOPAUTHTRYALL,
392   OPTPOPLAST,
393 #endif
394   OPTPRINTDECODE,
395   OPTPRINTSPLIT,
396   OPTPROMPTAFTER,
397   OPTQUOTEEMPTY,
398   OPTQUOTEQUOTED,
399   OPTREADONLY,
400   OPTREPLYSELF,
401   OPTRESOLVE,
402   OPTREVALIAS,
403   OPTREVNAME,
404   OPTREVREAL,
405   OPTRFC2047PARAMS,
406   OPTSAVEADDRESS,
407   OPTSAVEEMPTY,
408   OPTSAVENAME,
409   OPTSCORE,
410   OPTSIGDASHES,
411   OPTSIGONTOP,
412   OPTSORTRE,
413   OPTSPAMSEP,
414   OPTSTATUSONTOP,
415   OPTSTRICTMAILTO,
416   OPTSTRICTMIME,
417   OPTSTRICTTHREADS,
418   OPTSTRIPWAS,
419   OPTSTUFFQUOTED,
420   OPTSUSPEND,
421   OPTTEXTFLOWED,
422   OPTTHOROUGHSRC,
423   OPTTHREADRECEIVED,
424   OPTTILDE,
425   OPTUNCOLLAPSEJUMP,
426   OPTUSE8BITMIME,
427   OPTUSEDOMAIN,
428   OPTUSEFROM,
429   OPTUSEGPGAGENT,
430 #ifdef HAVE_LIBIDN
431   OPTUSEIDN,
432 #endif
433 #ifdef HAVE_GETADDRINFO
434   OPTUSEIPV6,
435 #endif
436   OPTWAITKEY,
437   OPTWEED,
438   OPTWRAP,
439   OPTWRAPSEARCH,
440   OPTWRITEBCC,                  /* write out a bcc header? */
441   OPTXMAILER,
442   OPTXMAILTO,                   /* 1 if $edit_header is forcebly set */
443   OPTXTERMSETTITLES,
444
445   OPTCRYPTUSEGPGME,
446
447   /* PGP options */
448
449   OPTCRYPTAUTOSIGN,
450   OPTCRYPTAUTOENCRYPT,
451   OPTCRYPTAUTOPGP,
452   OPTCRYPTAUTOSMIME,
453   OPTCRYPTREPLYENCRYPT,
454   OPTCRYPTREPLYSIGN,
455   OPTCRYPTREPLYSIGNENCRYPTED,
456   OPTCRYPTTIMESTAMP,
457   OPTSMIMEISDEFAULT,
458   OPTASKCERTLABEL,
459   OPTSDEFAULTDECRYPTKEY,
460   OPTPGPIGNORESUB,
461   OPTPGPCHECKEXIT,
462   OPTPGPLONGIDS,
463   OPTPGPAUTODEC,
464 #if 0
465   OPTPGPENCRYPTSELF,
466 #endif
467   OPTPGPRETAINABLESIG,
468   OPTPGPSTRICTENC,
469   OPTFORWDECRYPT,
470   OPTPGPSHOWUNUSABLE,
471   OPTPGPAUTOINLINE,
472   OPTPGPREPLYINLINE,
473
474   /* news options */
475
476 #ifdef USE_NNTP
477   OPTSHOWNEWNEWS,
478   OPTSHOWONLYUNREAD,
479   OPTSAVEUNSUB,
480   OPTLOADDESC,
481   OPTXCOMMENTTO,
482 #endif                          /* USE_NNTP */
483
484   /* pseudo options */
485
486   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
487   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
488   OPTLOCALES,                   /* (pseudo) set if user has valid locale definition */
489   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
490   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
491   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
492   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
493   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
494   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
495   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
496   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
497   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
498   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
499   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
500   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
501   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
502   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
503   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
504   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
505   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
506                                  *          functions while we are executing an
507                                  *          external program.
508                                  */
509   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
510   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
511   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
512   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
513   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
514
515 #ifdef USE_NNTP
516   OPTNEWS,                      /* (pseudo) used to change reader mode */
517   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
518   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
519 #endif
520   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
521   OPTSIDEBARNEWMAILONLY,
522   OPTMAX
523 };
524
525 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
526 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
527 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
528 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
529 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
530
531 #define set_option(x) mutt_bit_set(Options,x)
532 #define unset_option(x) mutt_bit_unset(Options,x)
533 #define toggle_option(x) mutt_bit_toggle(Options,x)
534 #define option(x) mutt_bit_isset(Options,x)
535
536 typedef struct spam_list_t {
537   rx_t *rx;
538   int nmatch;
539   char *template;
540   struct spam_list_t *next;
541 } SPAM_LIST;
542
543
544 #define mutt_new_spam_list() mem_calloc (1, sizeof (SPAM_LIST))
545 void mutt_free_spam_list (SPAM_LIST **);
546
547 int mutt_matches_ignore (const char *, LIST *);
548
549 void mutt_init (int, LIST *);
550
551 typedef struct envelope {
552   ADDRESS *return_path;
553   ADDRESS *from;
554   ADDRESS *to;
555   ADDRESS *cc;
556   ADDRESS *bcc;
557   ADDRESS *sender;
558   ADDRESS *reply_to;
559   ADDRESS *mail_followup_to;
560   char *list_post;              /* this stores a mailto URL, or nothing */
561   char *subject;
562   char *real_subj;              /* offset of the real subject */
563   char *message_id;
564   char *supersedes;
565   char *date;
566   char *x_label;
567   char *organization;
568 #ifdef USE_NNTP
569   char *newsgroups;
570   char *xref;
571   char *followup_to;
572   char *x_comment_to;
573 #endif
574   BUFFER *spam;
575   LIST *references;             /* message references (in reverse order) */
576   LIST *in_reply_to;            /* in-reply-to header content */
577   LIST *userhdrs;               /* user defined headers */
578   unsigned int irt_changed:1;   /* In-Reply-To changed to link/break threads */
579   unsigned int refs_changed:1;  /* References changed to break thread */
580 } ENVELOPE;
581
582 typedef struct parameter {
583   char *attribute;
584   char *value;
585   struct parameter *next;
586 } PARAMETER;
587
588 /* Information that helps in determing the Content-* of an attachment */
589 typedef struct content {
590   long hibin;                   /* 8-bit characters */
591   long lobin;                   /* unprintable 7-bit chars (eg., control chars) */
592   long crlf;                    /* '\r' and '\n' characters */
593   long ascii;                   /* number of ascii chars */
594   long linemax;                 /* length of the longest line in the file */
595   unsigned int space:1;         /* whitespace at the end of lines? */
596   unsigned int binary:1;        /* long lines, or CR not in CRLF pair */
597   unsigned int from:1;          /* has a line beginning with "From "? */
598   unsigned int dot:1;           /* has a line consisting of a single dot? */
599   unsigned int cr:1;            /* has CR, even when in a CRLF pair */
600 } CONTENT;
601
602 typedef struct body {
603   char *xtype;                  /* content-type if x-unknown */
604   char *subtype;                /* content-type subtype */
605   PARAMETER *parameter;         /* parameters of the content-type */
606   char *description;            /* content-description */
607   char *form_name;              /* Content-Disposition form-data name param */
608   off_t hdr_offset;             /* offset in stream where the headers begin.
609                                  * this info is used when invoking metamail,
610                                  * where we need to send the headers of the
611                                  * attachment
612                                  */
613   off_t offset;                 /* offset where the actual data begins */
614   off_t length;                 /* length (in bytes) of attachment */
615   char *filename;               /* when sending a message, this is the file
616                                  * to which this structure refers
617                                  */
618   char *d_filename;             /* filename to be used for the 
619                                  * content-disposition header.
620                                  * If NULL, filename is used 
621                                  * instead.
622                                  */
623   char *file_charset;           /* charset of attached file */
624   CONTENT *content;             /* structure used to store detailed info about
625                                  * the content of the attachment.  this is used
626                                  * to determine what content-transfer-encoding
627                                  * is required when sending mail.
628                                  */
629   struct body *next;            /* next attachment in the list */
630   struct body *parts;           /* parts of a multipart or message/rfc822 */
631   struct header *hdr;           /* header information for message/rfc822 */
632
633   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
634
635   signed short attach_count;
636
637   time_t stamp;                 /* time stamp of last
638                                  * encoding update.
639                                  */
640
641   unsigned int type:4;          /* content-type primary type */
642   unsigned int encoding:3;      /* content-transfer-encoding */
643   unsigned int disposition:2;   /* content-disposition */
644   unsigned int use_disp:1;      /* Content-Disposition uses filename= ? */
645   unsigned int unlink:1;        /* flag to indicate the the file named by
646                                  * "filename" should be unlink()ed before
647                                  * free()ing this structure
648                                  */
649   unsigned int tagged:1;
650   unsigned int deleted:1;       /* attachment marked for deletion */
651
652   unsigned int noconv:1;        /* don't do character set conversion */
653   unsigned int force_charset:1;
654   /* send mode: don't adjust the character
655    * set when in send-mode.
656    */
657   unsigned int is_signed_data:1;        /* A lot of MUAs don't indicate
658                                            S/MIME signed-data correctly,
659                                            e.g. they use foo.p7m even for
660                                            the name of signed data.  This
661                                            flag is used to keep track of
662                                            the actual message type.  It
663                                            gets set during the verification
664                                            (which is done if the encryption
665                                            try failed) and check by the
666                                            function to figure the type of
667                                            the message. */
668
669   unsigned int goodsig:1;       /* good cryptographic signature */
670   unsigned int warnsig:1;       /* maybe good signature */
671   unsigned int badsig:1;        /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
672
673   unsigned int collapsed:1;     /* used by recvattach */
674   unsigned int attach_qualifies:1;
675
676 } BODY;
677
678 typedef struct header {
679   unsigned int security:11;     /* bit 0-6: flags, bit 7,8: application.
680                                    see: crypt.h pgplib.h, smime.h */
681
682   unsigned int mime:1;          /* has a MIME-Version header? */
683   unsigned int flagged:1;       /* marked important? */
684   unsigned int tagged:1;
685   unsigned int appended:1;      /* has been saved */
686   unsigned int purged:1;        /* bypassing the trash folder */
687   unsigned int deleted:1;
688   unsigned int changed:1;
689   unsigned int attach_del:1;    /* has an attachment marked for deletion */
690   unsigned int old:1;
691   unsigned int read:1;
692   unsigned int expired:1;       /* already expired? */
693   unsigned int superseded:1;    /* got superseded? */
694   unsigned int replied:1;
695   unsigned int subject_changed:1;       /* used for threading */
696   unsigned int threaded:1;      /* used for threading */
697   unsigned int display_subject:1;       /* used for threading */
698   unsigned int recip_valid:1;   /* is_recipient is valid */
699   unsigned int active:1;        /* message is not to be removed */
700   unsigned int trash:1;         /* message is marked as trashed on disk.
701                                  * This flag is used by the maildir_trash
702                                  * option.
703                                  */
704
705   /* timezone of the sender of this message */
706   unsigned int zhours:5;
707   unsigned int zminutes:6;
708   unsigned int zoccident:1;
709
710   /* bits used for caching when searching */
711   unsigned int searched:1;
712   unsigned int matched:1;
713
714   /* tells whether the attach count is valid */
715   unsigned int attach_valid:1;
716
717   /* the following are used to support collapsing threads  */
718   unsigned int collapsed:1;     /* is this message part of a collapsed thread? */
719   unsigned int limited:1;       /* is this message in a limited view?  */
720   size_t num_hidden;            /* number of hidden messages in this view */
721
722   short recipient;              /* user_is_recipient()'s return value, cached */
723
724   int pair;                     /* color-pair to use when displaying in the index */
725
726   time_t date_sent;             /* time when the message was sent (UTC) */
727   time_t received;              /* time when the message was placed in the mailbox */
728   off_t offset;                 /* where in the stream does this message begin? */
729   int lines;                    /* how many lines in the body of this message? */
730   int index;                    /* the absolute (unsorted) message number */
731   int msgno;                    /* number displayed to the user */
732   int virtual;                  /* virtual message number */
733   int score;
734   ENVELOPE *env;                /* envelope information */
735   BODY *content;                /* list of MIME parts */
736   char *path;
737 #ifdef USE_NNTP
738   int article_num;
739 #endif
740
741   char *tree;                   /* character string to print thread tree */
742   struct thread *thread;
743
744   short attach_total;
745
746 #ifdef MIXMASTER
747   LIST *chain;
748 #endif
749
750 #ifdef USE_POP
751   int refno;                    /* message number on server */
752 #endif
753
754 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
755   void *data;                   /* driver-specific data */
756 #endif
757
758   char *maildir_flags;          /* unknown maildir flags */
759 } HEADER;
760
761 typedef struct thread {
762   unsigned int fake_thread:1;
763   unsigned int duplicate_thread:1;
764   unsigned int sort_children:1;
765   unsigned int check_subject:1;
766   unsigned int visible:1;
767   unsigned int deep:1;
768   unsigned int subtree_visible:2;
769   unsigned int next_subtree_visible:1;
770   struct thread *parent;
771   struct thread *child;
772   struct thread *next;
773   struct thread *prev;
774   HEADER *message;
775   HEADER *sort_key;
776 } THREAD;
777
778
779 /* flag to mutt_pattern_comp() */
780 #define M_FULL_MSG      (1<<0)       /* enable body and header matching */
781
782 typedef enum {
783   M_MATCH_FULL_ADDRESS = 1
784 } pattern_exec_flag;
785
786 typedef struct pattern_t {
787   short op;
788   unsigned int not : 1;
789   unsigned int alladdr : 1;
790   unsigned int stringmatch : 1;
791   int min;
792   int max;
793   struct pattern_t *next;
794   struct pattern_t *child;      /* arguments to logical op */
795   char* str;
796   regex_t *rx;
797 } pattern_t;
798
799 typedef struct {
800   char *path;
801   FILE *fp;
802   time_t mtime;
803   time_t mtime_cur;             /* used with maildir folders */
804   off_t size;
805   off_t vsize;
806   char *pattern;                /* limit pattern string */
807   pattern_t *limit_pattern;     /* compiled limit pattern */
808   HEADER **hdrs;
809   HEADER *last_tag;             /* last tagged msg. used to link threads */
810   THREAD *tree;                 /* top of thread tree */
811   HASH *id_hash;                /* hash table by msg id */
812   HASH *subj_hash;              /* hash table by subject */
813   HASH *thread_hash;            /* hash table for threading */
814   int *v2r;                     /* mapping from virtual to real msgno */
815   int hdrmax;                   /* number of pointers in hdrs */
816   int msgcount;                 /* number of messages in the mailbox */
817   int vcount;                   /* the number of virtual messages */
818   int tagged;                   /* how many messages are tagged? */
819   int new;                      /* how many new messages? */
820   int unread;                   /* how many unread messages? */
821   int deleted;                  /* how many deleted messages */
822   int appended;                 /* how many saved messages? */
823   int flagged;                  /* how many flagged messages */
824   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
825 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
826   void *data;                   /* driver specific data */
827 #endif                          /* USE_IMAP */
828
829   short magic;                  /* mailbox type */
830
831 #ifdef USE_COMPRESSED
832   void *compressinfo;           /* compressed mbox module private data */
833   char *realpath;               /* path to compressed mailbox */
834 #endif                          /* USE_COMPRESSED */
835
836   unsigned int locked:1;        /* is the mailbox locked? */
837   unsigned int changed:1;       /* mailbox has been modified */
838   unsigned int readonly:1;      /* don't allow changes to the mailbox */
839   unsigned int dontwrite:1;     /* dont write the mailbox on close */
840   unsigned int append:1;        /* mailbox is opened in append mode */
841   unsigned int quiet:1;         /* inhibit status messages? */
842   unsigned int collapsed:1;     /* are all threads collapsed? */
843   unsigned int closing:1;       /* mailbox is being closed */
844   unsigned int counting:1;      /* do we just want to cound? */
845 } CONTEXT;
846
847 /* for attachment counter */
848 typedef struct {
849   char *major;
850   int major_int;
851   const char *minor;
852   regex_t minor_rx;
853 } ATTACH_MATCH;
854
855 /* Flags for mutt_count_body_parts() */
856 #define M_PARTS_TOPLEVEL (1<<0) /* is the top-level part */
857 #define M_PARTS_RECOUNT (1<<1) /* force recount */
858
859 #include "protos.h"
860 #include "lib.h"
861 #include "globals.h"
862
863 #endif /* !_MUTT_H */