mutt stable branch with some hacks
1/*
2 * Copyright (C) 1996-2000,2007,2010,2013 Michael R. Elkins <me@mutt.org>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19
20#ifdef HAVE_INTTYPES_H
21# include <inttypes.h>
22#endif
23
24#include "mbyte.h"
25
26#define MoreArgs(p) (*p->dptr && *p->dptr != ';' && *p->dptr != '#')
27
28#define mutt_make_string(A,B,C,D,E) _mutt_make_string(A,B,C,D,E,0)
29void _mutt_make_string (char *, size_t, const char *, CONTEXT *,
30 HEADER *, format_flag);
31
32struct hdr_format_info
33{
34 CONTEXT *ctx;
35 HEADER *hdr;
36 const char *pager_progress;
37};
38
39void mutt_make_string_info (char *, size_t, int, const char *, struct hdr_format_info *, format_flag);
40
41int mutt_extract_token (BUFFER *, BUFFER *, int);
42BUFFER *mutt_buffer_new (void);
43BUFFER * mutt_buffer_init (BUFFER *);
44BUFFER * mutt_buffer_from (char *);
45void mutt_buffer_free(BUFFER **);
46int mutt_buffer_printf (BUFFER*, const char*, ...);
47void mutt_buffer_add (BUFFER*, const char*, size_t);
48void mutt_buffer_addstr (BUFFER*, const char*);
49void mutt_buffer_addch (BUFFER*, char);
50void mutt_free_opts (void);
51
52#define mutt_system(x) _mutt_system(x,0)
53int _mutt_system (const char *, int);
54
55#define mutt_next_thread(x) _mutt_aside_thread(x,1,0)
56#define mutt_previous_thread(x) _mutt_aside_thread(x,0,0)
57#define mutt_next_subthread(x) _mutt_aside_thread(x,1,1)
58#define mutt_previous_subthread(x) _mutt_aside_thread(x,0,1)
59int _mutt_aside_thread (HEADER *, short, short);
60
61#define mutt_collapse_thread(x,y) _mutt_traverse_thread (x,y,MUTT_THREAD_COLLAPSE)
62#define mutt_uncollapse_thread(x,y) _mutt_traverse_thread (x,y,MUTT_THREAD_UNCOLLAPSE)
63#define mutt_get_hidden(x,y)_mutt_traverse_thread (x,y,MUTT_THREAD_GET_HIDDEN)
64#define mutt_thread_contains_unread(x,y) _mutt_traverse_thread (x,y,MUTT_THREAD_UNREAD)
65#define mutt_thread_next_unread(x,y) _mutt_traverse_thread(x,y,MUTT_THREAD_NEXT_UNREAD)
66int _mutt_traverse_thread (CONTEXT *ctx, HEADER *hdr, int flag);
67
68
69#define mutt_new_parameter() safe_calloc (1, sizeof (PARAMETER))
70#define mutt_new_header() safe_calloc (1, sizeof (HEADER))
71#define mutt_new_envelope() safe_calloc (1, sizeof (ENVELOPE))
72#define mutt_new_enter_state() safe_calloc (1, sizeof (ENTER_STATE))
73
74typedef const char * format_t (char *, size_t, size_t, int, char, const char *, const char *, const char *, const char *, unsigned long, format_flag);
75
76void mutt_FormatString (char *, size_t, size_t, int, const char *, format_t *, unsigned long, format_flag);
77void mutt_parse_content_type (char *, BODY *);
78void mutt_generate_boundary (PARAMETER **);
79void mutt_delete_parameter (const char *attribute, PARAMETER **p);
80void mutt_set_parameter (const char *, const char *, PARAMETER **);
81
82
83FILE *mutt_open_read (const char *, pid_t *);
84
85void set_quadoption (int, int);
86int query_quadoption (int, const char *);
87int quadoption (int);
88
89char* mutt_extract_message_id (const char *, const char **);
90
91ADDRESS *mutt_default_from (void);
92ADDRESS *mutt_get_address (ENVELOPE *, char **);
93ADDRESS *mutt_lookup_alias (const char *s);
94ADDRESS *mutt_remove_duplicates (ADDRESS *);
95ADDRESS *mutt_remove_xrefs (ADDRESS *, ADDRESS *);
96ADDRESS *mutt_expand_aliases (ADDRESS *);
97ADDRESS *mutt_parse_adrlist (ADDRESS *, const char *);
98
99BODY *mutt_make_file_attach (const char *);
100BODY *mutt_make_message_attach (CONTEXT *, HEADER *, int);
101BODY *mutt_remove_multipart (BODY *);
102BODY *mutt_make_multipart (BODY *);
103BODY *mutt_new_body (void);
104BODY *mutt_parse_multipart (FILE *, const char *, LOFF_T, int);
105BODY *mutt_parse_messageRFC822 (FILE *, BODY *);
106BODY *mutt_read_mime_header (FILE *, int);
107
108CONTENT *mutt_get_content_info (const char *fname, BODY *b);
109
110HASH *mutt_make_id_hash (CONTEXT *);
111HASH *mutt_make_subj_hash (CONTEXT *);
112
113LIST *mutt_make_references(ENVELOPE *e);
114
115char *mutt_read_rfc822_line (FILE *, char *, size_t *);
116ENVELOPE *mutt_read_rfc822_header (FILE *, HEADER *, short, short);
117HEADER *mutt_dup_header (HEADER *);
118
119void mutt_set_mtime (const char *from, const char *to);
120time_t mutt_decrease_mtime (const char *, struct stat *);
121time_t mutt_local_tz (time_t);
122time_t mutt_mktime (struct tm *, int);
123time_t mutt_parse_date (const char *, HEADER *);
124int is_from (const char *, char *, size_t, time_t *);
125
126const char *mutt_attach_fmt (
127 char *dest,
128 size_t destlen,
129 size_t col,
130 int cols,
131 char op,
132 const char *src,
133 const char *prefix,
134 const char *ifstring,
135 const char *elsestring,
136 unsigned long data,
137 format_flag flags);
138
139
140char *mutt_charset_hook (const char *);
141char *mutt_iconv_hook (const char *);
142char *mutt_expand_path (char *, size_t);
143char *_mutt_expand_path (char *, size_t, int);
144char *mutt_find_hook (int, const char *);
145char *mutt_gecos_name (char *, size_t, struct passwd *);
146char *mutt_gen_msgid (void);
147char *mutt_get_body_charset (char *, size_t, BODY *);
148const char *mutt_get_name (ADDRESS *);
149char *mutt_get_parameter (const char *, PARAMETER *);
150LIST *mutt_crypt_hook (ADDRESS *);
151char *mutt_make_date (char *, size_t);
152
153const char *mutt_make_version (void);
154
155const char *mutt_fqdn(short);
156
157group_t *mutt_pattern_group (const char *);
158
159REGEXP *mutt_compile_regexp (const char *, int);
160
161void mutt_account_hook (const char* url);
162void mutt_add_to_reference_headers (ENVELOPE *env, ENVELOPE *curenv, LIST ***pp, LIST ***qq);
163void mutt_adv_mktemp (char *, size_t);
164void mutt_alias_menu (char *, size_t, ALIAS *);
165void mutt_allow_interrupt (int);
166void mutt_attach_init (BODY *);
167void mutt_block_signals (void);
168void mutt_block_signals_system (void);
169int mutt_body_handler (BODY *, STATE *);
170int mutt_bounce_message (FILE *fp, HEADER *, ADDRESS *);
171void mutt_break_thread (HEADER *);
172void mutt_buffy (char *, size_t);
173int mutt_buffy_list (void);
174void mutt_canonical_charset (char *, size_t, const char *);
175int mutt_count_body_parts (CONTEXT *, HEADER *);
176void mutt_check_rescore (CONTEXT *);
177void mutt_clear_error (void);
178void mutt_clear_pager_position (void);
179void mutt_create_alias (ENVELOPE *, ADDRESS *);
180void mutt_decode_attachment (BODY *, STATE *);
181void mutt_decode_base64 (STATE *s, long len, int istext, iconv_t cd);
182void mutt_default_save (char *, size_t, HEADER *);
183void mutt_display_address (ENVELOPE *);
184void mutt_display_sanitize (char *);
185void mutt_edit_content_type (HEADER *, BODY *, FILE *);
186void mutt_edit_file (const char *, const char *);
187void mutt_edit_headers (const char *, const char *, HEADER *, char *, size_t);
188int mutt_filter_unprintable (char **);
189void mutt_curses_error (const char *, ...);
190void mutt_curses_message (const char *, ...);
191void mutt_encode_descriptions (BODY *, short);
192void mutt_encode_path (char *, size_t, const char *);
193void mutt_enter_command (void);
194void mutt_expand_aliases_env (ENVELOPE *);
195void mutt_expand_file_fmt (char *, size_t, const char *, const char *);
196void mutt_expand_fmt (char *, size_t, const char *, const char *);
197void mutt_expand_link (char *, const char *, const char *);
198void mutt_fix_reply_recipients (ENVELOPE *env);
199void mutt_folder_hook (char *);
200void mutt_format_string (char *, size_t, int, int, int, char, const char *, size_t, int);
201void mutt_format_s (char *, size_t, const char *, const char *);
202void mutt_format_s_tree (char *, size_t, const char *, const char *);
203void mutt_forward_intro (FILE *fp, HEADER *cur);
204void mutt_forward_trailer (FILE *fp);
205void mutt_free_alias (ALIAS **);
206void mutt_free_body (BODY **);
207void mutt_free_color (int fg, int bg);
208void mutt_free_enter_state (ENTER_STATE **);
209void mutt_free_envelope (ENVELOPE **);
210void mutt_free_header (HEADER **);
211void mutt_free_parameter (PARAMETER **);
212void mutt_free_regexp (REGEXP **);
213void mutt_generate_header (char *, size_t, HEADER *, int);
214void mutt_help (int);
215void mutt_draw_tree (CONTEXT *);
216void mutt_check_lookup_list (BODY *, char *, int);
217void mutt_make_attribution (CONTEXT *ctx, HEADER *cur, FILE *out);
218void mutt_make_forward_subject (ENVELOPE *env, CONTEXT *ctx, HEADER *cur);
219void mutt_make_help (char *, size_t, const char *, int, int);
220void mutt_make_misc_reply_headers (ENVELOPE *env, CONTEXT *ctx, HEADER *cur, ENVELOPE *curenv);
221void mutt_make_post_indent (CONTEXT *ctx, HEADER *cur, FILE *out);
222void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra);
223void mutt_message_to_7bit (BODY *, FILE *);
224#define mutt_mktemp(a,b) mutt_mktemp_pfx_sfx (a, b, "mutt", NULL)
225#define mutt_mktemp_pfx_sfx(a,b,c,d) _mutt_mktemp (a, b, c, d, __FILE__, __LINE__)
226void _mutt_mktemp (char *, size_t, const char *, const char *, const char *, int);
227void mutt_normalize_time (struct tm *);
228void mutt_paddstr (int, const char *);
229void mutt_parse_mime_message (CONTEXT *ctx, HEADER *);
230void mutt_parse_part (FILE *, BODY *);
231void mutt_perror (const char *);
232void mutt_prepare_envelope (ENVELOPE *, int);
233void mutt_unprepare_envelope (ENVELOPE *);
234void mutt_pretty_mailbox (char *, size_t);
235void mutt_pretty_size (char *, size_t, LOFF_T);
236void mutt_pipe_message (HEADER *);
237void mutt_print_message (HEADER *);
238void mutt_print_patchlist (void);
239void mutt_query_exit (void);
240void mutt_query_menu (char *, size_t);
241void mutt_safe_path (char *s, size_t l, ADDRESS *a);
242void mutt_save_path (char *s, size_t l, ADDRESS *a);
243void mutt_score_message (CONTEXT *, HEADER *, int);
244void mutt_select_fcc (char *, size_t, HEADER *);
245#define mutt_select_file(A,B,C) _mutt_select_file(A,B,C,NULL,NULL)
246void _mutt_select_file (char *, size_t, int, char ***, int *);
247void mutt_message_hook (CONTEXT *, HEADER *, int);
248void _mutt_set_flag (CONTEXT *, HEADER *, int, int, int);
249#define mutt_set_flag(a,b,c,d) _mutt_set_flag(a,b,c,d,1)
250void mutt_set_followup_to (ENVELOPE *);
251void mutt_shell_escape (void);
252void mutt_show_error (void);
253void mutt_signal_init (void);
254void mutt_stamp_attachment (BODY *a);
255void mutt_tabs_to_spaces (char *);
256void mutt_tag_set_flag (int, int);
257short mutt_ts_capability (void);
258void mutt_unblock_signals (void);
259void mutt_unblock_signals_system (int);
260void mutt_update_encoding (BODY *a);
261void mutt_version (void);
262void mutt_view_attachments (HEADER *);
263void mutt_write_address_list (ADDRESS *adr, FILE *fp, int linelen, int display);
264void mutt_set_virtual (CONTEXT *);
265
266int mutt_add_to_rx_list (RX_LIST **list, const char *s, int flags, BUFFER *err);
267int mutt_addr_is_user (ADDRESS *);
268int mutt_addwch (wchar_t);
269int mutt_alias_complete (char *, size_t);
270void mutt_alias_add_reverse (ALIAS *t);
271void mutt_alias_delete_reverse (ALIAS *t);
272int mutt_alloc_color (int fg, int bg);
273int mutt_any_key_to_continue (const char *);
274int mutt_buffy_check (int);
275int mutt_buffy_notify (void);
276int mutt_builtin_editor (const char *, HEADER *, HEADER *);
277int mutt_can_decode (BODY *);
278int mutt_change_flag (HEADER *, int);
279int mutt_check_alias_name (const char *, char *, size_t);
280int mutt_check_encoding (const char *);
281int mutt_check_key (const char *);
282int mutt_check_menu (const char *);
283int mutt_check_mime_type (const char *);
284int mutt_check_month (const char *);
285int mutt_check_overwrite (const char *, const char *, char *, size_t, int *, char **);
286int mutt_check_traditional_pgp (HEADER *, int *);
287int mutt_command_complete (char *, size_t, int, int);
288int mutt_var_value_complete (char *, size_t, int);
289int mutt_complete (char *, size_t);
290int mutt_compose_attachment (BODY *a);
291int mutt_copy_body (FILE *, BODY **, BODY *);
292int mutt_decode_save_attachment (FILE *, BODY *, char *, int, int);
293int mutt_display_message (HEADER *h);
294int mutt_dump_variables (void);
295int mutt_edit_attachment(BODY *);
296int mutt_edit_message (CONTEXT *, HEADER *);
297int mutt_fetch_recips (ENVELOPE *out, ENVELOPE *in, int flags);
298int mutt_chscmp (const char *s, const char *chs);
299#define mutt_is_utf8(a) mutt_chscmp (a, "utf-8")
300#define mutt_is_us_ascii(a) mutt_chscmp (a, "us-ascii")
301int mutt_parent_message (CONTEXT *, HEADER *, int);
302int mutt_prepare_template(FILE*, CONTEXT *, HEADER *, HEADER *, short);
303int mutt_resend_message (FILE *, CONTEXT *, HEADER *);
304#define mutt_enter_fname(A,B,C,D,E) _mutt_enter_fname(A,B,C,D,E,0,NULL,NULL)
305int _mutt_enter_fname (const char *, char *, size_t, int *, int, int, char ***, int *);
306int mutt_enter_string (char *buf, size_t buflen, int col, int flags);
307int _mutt_enter_string (char *, size_t, int, int, int, char ***, int *, ENTER_STATE *);
308#define mutt_get_field(A,B,C,D) _mutt_get_field(A,B,C,D,0,NULL,NULL)
309int _mutt_get_field (const char *, char *, size_t, int, int, char ***, int *);
310int mutt_get_hook_type (const char *);
311int mutt_get_field_unbuffered (char *, char *, size_t, int);
312#define mutt_get_password(A,B,C) mutt_get_field_unbuffered(A,B,C,MUTT_PASS)
313int mutt_get_postponed (CONTEXT *, HEADER *, HEADER **, char *, size_t);
314int mutt_get_tmp_attachment (BODY *);
315int mutt_index_menu (void);
316int mutt_invoke_sendmail (ADDRESS *, ADDRESS *, ADDRESS *, ADDRESS *, const char *, int);
317int mutt_is_mail_list (ADDRESS *);
318int mutt_is_message_type(int, const char *);
319int mutt_is_list_cc (int, ADDRESS *, ADDRESS *);
320int mutt_is_list_recipient (int, ADDRESS *, ADDRESS *);
321int mutt_is_subscribed_list (ADDRESS *);
322int mutt_is_text_part (BODY *);
323int mutt_is_valid_mailbox (const char *);
324int mutt_link_threads (HEADER *, HEADER *, CONTEXT *);
325int mutt_lookup_mime_type (BODY *, const char *);
326int mutt_match_rx_list (const char *, RX_LIST *);
327int mutt_match_spam_list (const char *, SPAM_LIST *, char *, int);
328int mutt_messages_in_thread (CONTEXT *, HEADER *, int);
329int mutt_multi_choice (char *prompt, char *letters);
330int mutt_needs_mailcap (BODY *);
331int mutt_num_postponed (int);
332int mutt_parse_bind (BUFFER *, BUFFER *, unsigned long, BUFFER *);
333int mutt_parse_exec (BUFFER *, BUFFER *, unsigned long, BUFFER *);
334int mutt_parse_color (BUFFER *, BUFFER *, unsigned long, BUFFER *);
335int mutt_parse_uncolor (BUFFER *, BUFFER *, unsigned long, BUFFER *);
336int mutt_parse_hook (BUFFER *, BUFFER *, unsigned long, BUFFER *);
337int mutt_parse_macro (BUFFER *, BUFFER *, unsigned long, BUFFER *);
338int mutt_parse_mailboxes (BUFFER *, BUFFER *, unsigned long, BUFFER *);
339int mutt_parse_mono (BUFFER *, BUFFER *, unsigned long, BUFFER *);
340int mutt_parse_unmono (BUFFER *, BUFFER *, unsigned long, BUFFER *);
341int mutt_parse_push (BUFFER *, BUFFER *, unsigned long, BUFFER *);
342int mutt_parse_rc_line (/* const */ char *, BUFFER *, BUFFER *);
343int mutt_parse_rfc822_line (ENVELOPE *e, HEADER *hdr, char *line, char *p,
344 short user_hdrs, short weed, short do_2047, LIST **lastp);
345int mutt_parse_score (BUFFER *, BUFFER *, unsigned long, BUFFER *);
346int mutt_parse_unscore (BUFFER *, BUFFER *, unsigned long, BUFFER *);
347int mutt_parse_unhook (BUFFER *, BUFFER *, unsigned long, BUFFER *);
348int mutt_pattern_func (int, char *);
349int mutt_pipe_attachment (FILE *, BODY *, const char *, char *);
350int mutt_print_attachment (FILE *, BODY *);
351int mutt_query_complete (char *, size_t);
352int mutt_query_variables (LIST *queries);
353int mutt_save_attachment (FILE *, BODY *, char *, int, HEADER *);
354int _mutt_save_message (HEADER *, CONTEXT *, int, int, int);
355int mutt_save_message (HEADER *, int, int, int, int *);
356int mutt_search_command (int, int);
357#ifdef USE_SMTP
358int mutt_smtp_send (const ADDRESS *, const ADDRESS *, const ADDRESS *,
359 const ADDRESS *, const char *, int);
360#endif
361size_t mutt_wstr_trunc (const char *, size_t, size_t, size_t *);
362int mutt_charlen (const char *s, int *);
363int mutt_strwidth (const char *);
364int mutt_compose_menu (HEADER *, char *, size_t, HEADER *, int);
365int mutt_thread_set_flag (HEADER *, int, int, int);
366int mutt_user_is_recipient (HEADER *);
367void mutt_update_num_postponed (void);
368int mutt_wait_filter (pid_t);
369int mutt_which_case (const char *);
370int mutt_write_fcc (const char *path, HEADER *hdr, const char *msgid, int, char *);
371int mutt_write_mime_body (BODY *, FILE *);
372int mutt_write_mime_header (BODY *, FILE *);
373int mutt_write_one_header (FILE *fp, const char *tag, const char *value, const char *pfx, int wraplen, int flags);
374int mutt_write_rfc822_header (FILE *, ENVELOPE *, BODY *, int, int);
375void mutt_write_references (LIST *, FILE *, int);
376int mutt_yesorno (const char *, int);
377void mutt_set_header_color(CONTEXT *, HEADER *);
378void mutt_sleep (short);
379int mutt_save_confirm (const char *, struct stat *);
380
381int mh_valid_message (const char *);
382
383pid_t mutt_create_filter (const char *, FILE **, FILE **, FILE **);
384pid_t mutt_create_filter_fd (const char *, FILE **, FILE **, FILE **, int, int, int);
385
386ADDRESS *alias_reverse_lookup (ADDRESS *);
387
388/* base64.c */
389void mutt_to_base64 (unsigned char*, const unsigned char*, size_t, size_t);
390int mutt_from_base64 (char*, const char*);
391
392/* utf8.c */
393int mutt_wctoutf8 (char *s, unsigned int c, size_t buflen);
394
395#ifdef LOCALES_HACK
396#define IsPrint(c) (isprint((unsigned char)(c)) || \
397 ((unsigned char)(c) >= 0xa0))
398#define IsWPrint(wc) (iswprint(wc) || wc >= 0xa0)
399#else
400#define IsPrint(c) (isprint((unsigned char)(c)) || \
401 (option (OPTLOCALES) ? 0 : \
402 ((unsigned char)(c) >= 0xa0)))
403#define IsWPrint(wc) (iswprint(wc) || \
404 (option (OPTLOCALES) ? 0 : (wc >= 0xa0)))
405#endif
406
407#define new_pattern() safe_calloc(1, sizeof (pattern_t))
408
409int mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h, pattern_cache_t *);
410pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err);
411void mutt_check_simple (char *s, size_t len, const char *simple);
412void mutt_pattern_free (pattern_t **pat);
413
414/* ----------------------------------------------------------------------------
415 * Prototypes for broken systems
416 */
417
418#ifdef HAVE_LONG_LONG_INT
419#ifdef LONGLONG
420#error LONGLONG is already defined
421#endif
422#define LONGLONG long long
423#else
424#define LONGLONG long
425#endif
426
427#ifdef HAVE_SRAND48
428#define LRAND lrand48
429#define SRAND srand48
430#define DRAND drand48
431#else
432#define LRAND rand
433#define SRAND srand
434#define DRAND (double)rand
435#endif /* HAVE_SRAND48 */
436
437/* HP-UX, ConvexOS and UNIXware don't have this macro */
438#ifndef S_ISLNK
439#define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK ? 1 : 0)
440#endif
441
442int getdnsdomainname (char *, size_t);
443
444/* According to SCO support, this is how to detect SCO */
445#if defined (_M_UNIX) || defined (MUTT_OS)
446#define SCO
447#endif
448
449/* SCO Unix uses chsize() instead of ftruncate() */
450#ifndef HAVE_FTRUNCATE
451#define ftruncate chsize
452#endif
453
454#ifndef HAVE_SNPRINTF
455extern int snprintf (char *, size_t, const char *, ...);
456#endif
457
458#ifndef HAVE_VSNPRINTF
459extern int vsnprintf (char *, size_t, const char *, va_list);
460#endif
461
462#ifndef HAVE_STRERROR
463#ifndef STDC_HEADERS
464extern int sys_nerr;
465extern char *sys_errlist[];
466#endif
467
468#define strerror(x) ((x) > 0 && (x) < sys_nerr) ? sys_errlist[(x)] : 0
469#endif /* !HAVE_STRERROR */
470
471#ifndef HAVE_MEMMOVE
472#define memmove(d,s,n) bcopy((s),(d),(n))
473#endif
474
475/* AIX doesn't define these in any headers (sigh) */
476int strcasecmp (const char *, const char *);
477int strncasecmp (const char *, const char *, size_t);
478
479#ifdef _AIX
480int setegid (gid_t);
481#endif /* _AIX */
482
483#ifndef STDC_HEADERS
484extern FILE *fdopen ();
485extern int system ();
486extern int puts ();
487extern int fputs ();
488extern int fputc ();
489extern int fseek ();
490extern char *strchr ();
491extern int getopt ();
492extern int fputs ();
493extern int fputc ();
494extern int fclose ();
495extern int fprintf();
496extern int printf ();
497extern int fgetc ();
498extern int tolower ();
499extern int toupper ();
500extern int sscanf ();
501extern size_t fread ();
502extern size_t fwrite ();
503extern int system ();
504extern int rename ();
505extern time_t time ();
506extern struct tm *localtime ();
507extern char *asctime ();
508extern char *strpbrk ();
509extern int fflush ();
510extern long lrand48 ();
511extern void srand48 ();
512extern time_t mktime ();
513extern int vsprintf ();
514extern int ungetc ();
515extern int ftruncate ();
516extern void *memset ();
517extern int pclose ();
518extern int socket ();
519extern int connect ();
520extern size_t strftime ();
521extern int lstat ();
522extern void rewind ();
523extern int readlink ();
524
525/* IRIX barfs on empty var decls because the system include file uses elipsis
526 in the declaration. So declare all the args to avoid compiler errors. This
527 should be harmless on other systems. */
528int ioctl (int, int, ...);
529
530#endif
531
532/* unsorted */
533void ci_bounce_message (HEADER *, int *);
534int ci_send_message (int, HEADER *, char *, CONTEXT *, HEADER *);
535
536/* prototypes for compatibility functions */
537
538#ifndef HAVE_SETENV
539int setenv (const char *, const char *, int);
540#endif
541
542#ifndef HAVE_STRCASECMP
543int strcasecmp (char *, char *);
544int strncasecmp (char *, char *, size_t);
545#endif
546
547#ifndef HAVE_STRDUP
548char *strdup (const char *);
549#endif
550
551#ifndef HAVE_STRSEP
552char *strsep (char **, const char *);
553#endif
554
555#ifndef HAVE_STRTOK_R
556char *strtok_r (char *, const char *, char **);
557#endif
558
559#ifndef HAVE_WCSCASECMP
560int wcscasecmp (const wchar_t *a, const wchar_t *b);
561#endif
562
563#ifndef HAVE_STRCASESTR
564char *strcasestr (const char *, const char *);
565#endif
566
567#ifndef HAVE_MKDTEMP
568char *mkdtemp (char *tmpl);
569#endif