mutt stable branch with some hacks
at master 569 lines 21 kB view raw
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