/* $Id: elmlib.h,v 1.272.2.1 2007/08/25 06:35:47 hurtta Exp $ */ /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.272.2.1 $ $State: Exp $ * * Author: Kari Hurtta (was hurtta+elm@ozone.FMI.FI) *****************************************************************************/ /* declaration */ #if defined(USE_DLOPEN) || defined(REMOTE_MBX) typedef enum { IMAP_error = 0, IMAP_idle, IMAP_command, IMAP_command_ready_OK, IMAP_command_ready_NO, IMAP_command_ready_BAD, IMAP_closing } imap_states; enum CAPA_phase { capa_prelogin = 0, capa_prelogin_again = 1, capa_do_login = 2, capa_logged = 3, capa_logged_again = 4 }; #ifdef ANSI_C struct folder_info; /* Needed for prototype */ #endif typedef int f_pop_push_command P_((struct folder_info *folder, char *command, int simple)); typedef int f_pop_command_ok P_((struct folder_info *folder)); typedef void f_pop_clear_command P_((struct folder_info *folder)); struct pop_callbacks { f_pop_push_command * push_command; f_pop_command_ok * command_ok; f_pop_clear_command * clear_command; }; #ifdef ANSI_C struct IMAP_capa_libs; struct connection_cache; #endif typedef void f_imap_wait P_((struct connection_cache *con)); typedef void f_imap_idle_wait P_((struct connection_cache *con)); typedef int f_imap_command_ok P_((struct connection_cache *con, imap_states *cmd_result, char **extra_code)); typedef int f_start_imap_command P_((struct connection_cache *con, char * verb)); typedef void f_imap_command_push_atom P_((struct connection_cache *con, const char *st)); typedef void f_imap_command_push_literal P_((struct connection_cache *con, int len, const char *st)); typedef void f_imap_command_push_string P_((struct connection_cache *con, const char *st)); typedef void f_imap_command_push_astring P_((struct connection_cache *con, const char *st)); typedef void f_imap_command_push_aliteral P_((struct connection_cache *con, const char *st)); typedef void f_imap_command_push_range P_((struct connection_cache *con, int A, int B)); typedef void f_imap_command_push_number P_((struct connection_cache *con, int A)); typedef void f_imap_command_push_list P_((struct connection_cache *con, const char **l)); typedef void f_end_imap_command P_((struct connection_cache *con)); typedef void f_imap_clear_command P_((struct connection_cache *con)); struct imap_callbacks { f_imap_wait * wait; f_imap_idle_wait * idle_wait; f_imap_command_ok * command_ok; f_start_imap_command * start_command; f_imap_command_push_atom * command_push_atom; f_imap_command_push_literal * command_push_literal; f_imap_command_push_string * command_push_string; f_imap_command_push_astring * command_push_astring; f_imap_command_push_aliteral * command_push_aliteral; f_imap_command_push_range * command_push_range; f_imap_command_push_number * command_push_number; f_imap_command_push_list * command_push_list; f_end_imap_command * end_command; f_imap_clear_command * clear_command; }; #endif /* lib/strmcpy.c */ extern char *strmcpy P_((char *, const char *)); extern char *strmcat P_((char *, const char *)); /* safeopen.c */ extern FILE *safeopen P_((char *)); extern FILE *safeopen_rdwr P_((char *)); /* istrcmp.c */ extern int istrcmp P_((const char *, const char *)); /* add_site.c */ extern int add_site P_((char *, char *, char *, int)); /* atonum.c */ extern int atonum P_((char *)); /* mk_aliases.c */ extern int get_alias P_((FILE *,int)); extern int get_line P_((FILE *,char *,int, int)); extern void de_escape P_((char *)); extern int add_to_hash_table P_((char *,int32)); extern void add_to_table P_((FILE *,char *, char *, char *, char *, char *)); extern int check_alias P_((char *)); extern int check_address P_((char *)); extern void put_alias P_((FILE *)); extern int do_newalias P_((char *, char *,int, int)); /* aliasdb.c */ /* fetch_alias */ #if ANSI_C struct dbz; #endif extern char *next_addr_in_list P_((char **)); extern struct alias_rec *fetch_alias P_((struct dbz *db, char *alias)); /* can_access.c */ /* I don't understand this routine! access -system call uses * real uid / gid anyway!!!!!!!!!!!!!! * * - K E H */ extern int can_access P_((char *,int)); /* can_open.c */ extern int can_open P_((const char *, const char *)); /* chloc.c */ /* Is this really needed? This does same than strchr or index, except * that return type is different. * * - K E H */ /* Argument (second) can't be char because there is both prototype and * non-prototype declaration. */ extern int chloc P_((char *,int)); extern int qchloc P_((char *, int)); /* date_util.c */ extern int cvt_dayname_to_daynum P_((char *,int *)); extern int cvt_monthname_to_monthnum P_((char *,int *)); extern int cvt_yearstr_to_yearnum P_((char *,int *)); extern int cvt_mmddyy_to_dayofyear P_((int, int, int, int*)); extern int cvt_timezone_to_offset P_((char *str,int *, int)); extern int cvt_numtz_to_mins P_((char *)); extern int cvt_timestr_to_hhmmss P_((char *, int *, int *, int *)); extern long make_gmttime P_((int, int, int, int, int, int)); /* dispaddr.c */ #ifdef ANSI_C struct header_rec; /* Needed for prototype */ struct string; #endif typedef void decode_who P_((int class, char *ptr, int size)); extern int DisplayAddress P_((struct header_rec *h,struct string **f)); /* dynarray.c */ extern void ** DynamicArray P_((void **p, int record_size, int *max, int n)); extern void DestroyDynamicArray P_((void **p)); /* errno.c */ extern char *error_description P_((int)); /* expand.c */ extern int expand P_((char *, int)); extern int expand_env P_((char *dest, const char *src,unsigned destlen)); extern int expand_meta P_((char *dest, const char *src,unsigned destlen)); /* expand_path is subset of expand_env and expand_meta Returns 0 if no expansion done 1 if expansion done -1 on failure */ extern int expand_path P_((char *dest, const char *src, unsigned destlen)); /* gcos_name.c */ extern char * gcos_name P_((const char *gcos_field, const char *logname)); /* get_tz.c */ extern int get_tz_mins P_((time_t tval)); extern CONST char *get_tz_name P_((struct tm *)); /* getaddr.c */ extern void free_rfc822tokenized P_((char **res)); /* Removes comments from vector: */ extern void remove_space_tokenized P_((char ** tokenized)); extern char **rfc822_tokenize P_((const char *line)); typedef struct charcode_info * charset_t; extern int look_special_tokens P_((char **tokenized, const char *tok_chars, int start, int *ended, int demime, charset_t set, struct string **comments, char ***scanned)); extern struct string * scanned_to_phrase P_((char **scanned, int demime, charset_t set)); extern struct addr_item { char *addr; struct string *fullname; struct string *comment; } * break_down_address P_((const char *buffer, int demime, charset_t defcharset)); extern void free_addr_items P_((struct addr_item *list)); extern void append_addr_items P_((struct addr_item **list, struct addr_item *list1)); /* getaddrfrm.c */ extern void get_address_from P_((char *, char *, int size)); /* getarpdate.c */ extern char * get_arpa_date P_((void)); extern CONST char *arpa_dayname[8]; /* src/date.c uses this */ extern CONST char *arpa_monname[13]; /* src/date.c and IMAP code uses */ /* getfullnam.c */ #ifdef ANSI_C struct passwd; #endif extern char * get_fullname1 P_((struct passwd *P,const char *logname)); extern char * get_full_name P_((char *)); /* in_string.c */ /* Is that needed? This is almost same as strstr (except return type). * - K E H */ extern int in_string P_((char *, char *)); /* ldstate.c */ struct folder_view { int mailbox_number; int index; int thread_number; /* -1 if not defined or not generated */ }; extern void zero_folder_view P_((struct folder_view *X)); /* * Filled in by "load_folder_state_file()". This allows an external program * (e.g. "readmsg") to receive information on the current Elm state. */ struct folder_state { unsigned short magic; /* LDSTATE_magic */ struct folder_view *view; int view_len; struct storage_state { char *folder_name; /* full pathname to current folder */ int num_mssgs; /* number of messages in the folder */ struct storage_msg { long idx; /* index of seek offsets for messages */ long cl; } * mssgs; } * storage; int storage_len; int num_sel; /* number of messages selected */ int *sel_list; /* list of selected message numbers */ }; extern void zero_ldstate P_((struct folder_state *fst)); extern void clear_ldstate P_((struct folder_state *fst)); extern int load_folder_state_file P_((struct folder_state *fst)); /* len_next.c */ extern int len_next_part P_((const char *)); /* mail_gets.c */ extern int mail_gets P_((char *,int,FILE *)); /* malloc_gets added by Kari Hurtta Do not return \n reallocs *buffer return -1 if limit exceeded, buffer is still alloced return -2 if error or if feof() is true before reading anything limit == -1 no limit */ extern int malloc_gets P_((char **buffer, int limit, FILE *mailfile)); /* okay_address.c */ extern int addr_is_user P_((char *addr)); extern int okay_address_l P_((const struct addr_item *address, const struct addr_item *return_address)); /* opt_utils.c */ extern int gethostdomain P_((char *,int)); #ifndef STRTOK extern char *strtok P_((char *, char *)); #endif #ifndef STRPBRK extern char *strpbrk P_((char *, char *)); #endif #ifndef STRSPN extern int strspn P_((char *, char *)); #endif #ifndef STRCSPN extern int strcspn P_((char *, char *)); #endif #ifndef TEMPNAM extern char *tempnam P_((char *, char *)); #endif #ifndef GETOPT extern int getopt P_((int,char **, char *)); #endif /* posixsig.c */ #ifdef POSIX_SIGNALS extern SIGHAND_TYPE (*posig_signal P_((int, SIGHAND_TYPE (*fun)P_((int)) )) )P_((int)); #endif #if defined(BSD_TYPE) && !defined(WEXITSTATUS) typedef union wait S__; #else typedef int S__; #endif extern int my_wait P_((int pid, S__ *statptr)); extern int convert_status P_((S__ status,int *exit_code)); /* putenv.c */ #ifndef PUTENV extern int putenv P_((char *)); #endif /* qstrings.c */ extern char *qstrpbrk P_((char *, char *)); extern int qstrspn P_((char *, char *)); extern int qstrcspn P_((char *, char *)); /* reverse.c */ extern void reverse P_((char *)); /* safemalloc.c */ extern void dflt_safe_malloc_fail_handler P_((char *proc,unsigned)); extern void (*safe_malloc_fail_handler) P_((char *proc,unsigned)); extern malloc_t safe_malloc P_((unsigned)); extern malloc_t safe_realloc P_((malloc_t,unsigned)); extern char *safe_strdup P_((const char *)); #ifdef DEBUG #define free(x) safe_free(x) extern void safe_free P_((malloc_t x)); #endif /* shiftlower.c */ extern char *shift_lower P_((const char *)); /* strfcpy.c */ extern char *strfcpy P_((char *, const char *, int)); extern char *strfcat P_((char *, const char *, int)); extern char *strnfcpy P_((char *dest, const char *src, int len, int size, int *produced)); /* strincmp.c */ /* Is this needed? This is same than strncasecmp * - K E H */ extern int strincmp P_((const char *, const char *, int)); /* striparens.c */ extern char *strip_parens P_((const char *s)); extern char *get_parens P_((const char *s)); /* strstr.c */ /* Why there is both in_string and strstr???? * - K E H */ #ifndef STRSTR extern char *strstr P_((char *,char *)); #endif /* lib/cs_utf.c */ extern CONST charset_t IMAP_ENCODING; extern CONST charset_t UTF8_ENCODING; /* lib/charset.c */ extern charset_t display_charset; /* current terminal charset */ extern charset_t system_charset; /* character set used by ctype() routines */ extern CONST charset_t RAW_BUFFER; /* 'Raw' byte buffer !!!!!! */ extern CONST charset_t ASCII_SET; #define SET_valid 0x0001 /* make possible to 'clear' previous defination */ #define SET_mark 0x0002 /* mark used by charset_compatfunc and */ #define SET_printed 0x0004 #define SET_nodata 0x0008 #define SET_havealias 0x0010 struct charcode_info { unsigned short magic; /* CS_charset_magic */ struct charset_type * charset_type; struct map_info * map_info; uint16 flags; char * MIME_name; struct charcode_info * subtype; struct setlist * iso2022_info; /* From http://www.iana.org/assignments/character-sets */ uint16 MIBenum; /* (not used) */ char * codeset; /* Optionally codeset name -- official name */ }; #define CS_printable 1 /* Have printable information */ #define CS_mapping 2 /* Have some mapping information */ #define CS_universal_set 4 /* Consider that to be universal charset */ #define CS_printable_len 8 /* supports struct cs_printable_len */ extern int charset_properties P_((charset_t ptr)); #define CHARSET_create 1 #define CHARSET_noautodef 2 extern charset_t MIME_name_to_charset P_((const char *name,int flag)); extern charset_t codeset_name_to_charset P_((const char *name)); extern int charset_compatfunc P_((char **value, int enter, int lineno, char *filename)); extern int charset_iso646func P_((char **value, int enter, int lineno, char *filename)); extern int charset_ok_p P_((charset_t ptr)); extern int load_charset_map_info P_((charset_t *buffer, const char *data)); extern int charset_superset_of P_((charset_t charset, charset_t subset)); /* helper routines on charset.c */ extern char * mime_parse_content_opts P_((char *str, char **walk)); extern int mime_get_param P_((const char *name, char *value, const char *opts, int size)); extern void rfc822_reap_comments P_((char *, char *, int)); extern char * dequote_opt P_((const char *source, int len)); /* lib/charset.c */ extern char base64chars[64]; #define to64(c) (((c) >= 0) && ((c) < 64)) ? base64chars[(c)] : -1 /* lib/charset_input.c */ struct charset_state { charset_t charset; int caller_flags; /* Not used by lib/charset_input * but used by src/curses.c */ struct state_private_data * p; }; extern struct charset_state * new_state P_((charset_t set)); extern void free_state P_((struct charset_state **state)); extern int state_ready P_((struct charset_state *st)); extern int state_printable P_((struct charset_state *st)); extern int add_streambyte_to_state P_((struct charset_state *st, int ch)); extern void reset_state P_((struct charset_state *st, int hard)); extern uint16 give_unicode_from_state P_((struct charset_state *st)); extern int state_same_char P_((struct charset_state *A, struct charset_state *B, int ignore_case)); /* If character corresponds one byte on stream, returns it. * Otherwise returns 0. This is used implement ReadCh(). * It is assumed that returned character corresponds to * code characterter set (and perhaps also US-ASCII) */ extern int state_is_onebyte P_((struct charset_state *st)); /* lib/string.c */ struct string { charset_t string_type; struct str_private_data * p; }; extern struct string * new_string P_((charset_t set)); extern struct string * new_langstring P_((charset_t set, char *lang)); extern void free_string P_((struct string **str)); extern int verify_string P_((struct string *str)); extern CONST char * get_string_lang P_((const struct string *str)); extern CONST char * get_string_MIME_name P_((const struct string *str)); extern struct string * new_string2 P_((charset_t set, const unsigned char *data)); extern int add_streambyte_to_string P_((struct string *str, int ch)); extern int add_streambytes_to_string P_((struct string *str, int count, const unsigned char *data, int *errors)); extern void add_state_to_string P_((struct string *str, struct charset_state *ch)); extern struct string * cat_strings P_((const struct string *str1, const struct string *str2, int printind)); extern int string_len P_((const struct string *str)); extern int string_cmp P_((const struct string *str1, const struct string *str2, int unknown_val)); extern struct string * dup_string P_((const struct string *str)); extern struct string * convert_string P_((charset_t set, const struct string *str, int printind)); /* return 1 on succeed and 0 on failure */ extern int string_match P_((const struct string * name, const struct string * pat)); typedef struct display_settings * screen_info_p; /* result is malloced */ extern unsigned char *stream_from_string P_((const struct string *str, int printable, screen_info_p terminal)); /* result is malloced */ extern void bytestream_from_string P_((const struct string *str, char **res, int *reslen)); /* NOTE: struct cs_printable_len is only allowed if charset_properties() gives CS_printable_len and also terminal argument is given */ struct cs_printable_len { int max_len; /* Maximun printable len for streamclip_from_string() */ int ret_len; /* Printable len of result */ }; /* result is malloced, printable only */ extern unsigned char *streamclip_from_string P_((const struct string *str, int *pos, int len, screen_info_p terminal, struct cs_printable_len *printable_len)); /* Returns how many characters fits to given printable_len, from give pos (do not update pos as actual clip -- to update pos use pos += returned_value -- does not handle unknown characters -- if first character is unknown returns -1 */ extern int estimate_clip_string P_((const struct string *str,int pos, int len, screen_info_p terminal, struct cs_printable_len *printable_len)); extern struct string *ascify_string P_((const struct string *str)); extern int can_ascii_string P_((const struct string *str)); extern void add_ascii_to_string P_((struct string *str, const unsigned char *ascii)); #define UNICODE_BAD_CHAR 0xFFFF extern void add_unicode_to_string P_((struct string *str, int len, const uint16 *vector)); extern void fill_ascii_to_string P_((struct string *str, int count, unsigned int ascii)); extern struct string *clip_from_string P_((const struct string *str, int *pos, int len)); extern int find_pattern_from_string P_((const struct string *str, const struct string *pattern, int ignore_case)); extern uint16 give_unicode_from_string P_((const struct string *str, int pos)); extern struct string *collapse_spaces_from_string P_((const struct string *str)); extern struct string *skip_ascii_head_from_string P_((const struct string *str, const unsigned char *ascii, int ignore_case)); #define GWF_lowercase 1 #define GWF_trim_space 2 extern int get_word_from_string P_((const struct string *str, struct string **word, int *pos, int flags, const unsigned char *ascii_delim, uint16 *found_delim)); extern void remove_control P_((const struct string *str)); /* bad_pos is -1 if string is OK */ extern long string_to_long P_((const struct string *str, int *bad_pos)); /* Return 1 is matches, otherwise 0 */ extern int string_matches_ascii P_((const struct string *str, const unsigned char *ascii)); /* Returns -1 or index */ extern int locate_unicode_from_string P_((const struct string *str, int unicode)); /* lib/stringbuffer.c */ struct stringbuffer { struct sb_type * buffer_type; struct sb_private_data * p; }; extern struct stringbuffer * create_membuffer P_((void)); extern struct stringbuffer * create_filebuffer P_((void)); extern void free_stringbuffer P_((struct stringbuffer **ptr)); extern void add_line_to_stringbuffer P_((struct stringbuffer *buffer, const struct string *string)); extern int linecount_stringbuffer P_((const struct stringbuffer *ptr)); /* caller of get_line_from_stringbuffer is expected to free_string () resulting buffer */ extern struct string *get_line_from_stringbuffer P_((const struct stringbuffer *buffer, int ptr)); /* lib/rc_handle.c */ typedef struct dt_path_info PATH; extern char ** give_dt_path_as_elems P_((struct dt_path_info *ptr, char * fieldname)); extern char * give_dt_path_as_str P_((struct dt_path_info *ptr, char * fieldname)); typedef struct dt_estr_info ESTR; /* Retuns 1 if sepecial value "none" */ extern int dt_estr_is_disabled P_((struct dt_estr_info *ptr)); extern char * give_dt_estr_as_str P_((struct dt_estr_info *ptr, char * fieldname)); /* Set initial value */ extern void set_dt_estr P_((struct dt_estr_info *ptr, const char *const_val, char *def_env)); typedef struct dt_enumerate_info ENUMERATE; extern int give_dt_enumerate_as_int P_((struct dt_enumerate_info *ptr)); extern CONST char * give_dt_enumerate_as_str P_((struct dt_enumerate_info *ptr)); extern int set_dt_enumerate_as_str P_((struct dt_enumerate_info *ptr, char *str)); typedef struct dt_sort_info SORT; extern CONST char * give_dt_sort_as_str P_((struct dt_sort_info *ptr)); extern int give_dt_sort_as_int P_((struct dt_sort_info *ptr)); extern void set_dt_sort_as_int P_((struct dt_sort_info *ptr, int val)); /* lib/read_rc.c */ enum record_mode { SYSTEM_RC = 0, LOCAL_RC = 1, RC_MODE_COUNT }; extern struct elmrc_recorder * enable_recorder P_((enum record_mode mode)); extern int seed_history P_((FILE *F, char * filename, struct elmrc_recorder *recorder)); extern void print_history_changed P_((FILE *F, struct elmrc_recorder *recorder)); typedef int option_func P_((char **value, int enter, int lineno, char *filename)); extern void mark_local_changed P_((void *A)); extern void mark_flocal_changed P_((option_func *A)); #define SLEN 256 /* length for elmrc variables ... */ struct charset_map_item * load_charset_map P_((const char *filename, int *errors)); extern struct charset_map_item * system_charset_map; extern struct charset_map_item * user_charset_map; extern void locale_init P_((void)); /* sets locale and elm_msg_cat */ extern void user_init P_((void)); /* get username and home directory */ extern int init_defaults P_((void)); #define READ_FLAG_UNIDATA_INIT 1 /* Called from elmunidata routine */ #define READ_FLAG_BINDATA_INIT 2 /* Called from elmbindata routine */ extern int read_rc_file P_((int flags)); extern void post_init_check P_((int flag)); /* read_rc_file calls this */ extern int parse_elmrc P_((FILE *F,int global, char *filename)); extern void post_process_charset_options P_((void)); extern int matches_weedlist P_((char *buffer)); extern char system_text_file[SLEN]; /* $etc/aliases.text */ extern char system_data_file[SLEN]; /* $etc/aliases */ extern char system_rc_file[SLEN]; /* $etc/elm.rc */ extern char system_mime_types[SLEN]; /* $etc/elm.mimetypes */ extern char hostdomfile[SLEN]; /* $etc/domain */ extern char system_mime_charsets[SLEN]; /* $etc/elm.mimecharsets */ extern char system_iso2022_sets[SLEN]; /* $etc/elm.iso2022sets */ extern char system_terminal_info[SLEN]; /* $etc/elm.terminalinfo */ extern char system_mail_services[SLEN]; /* $etc/elm.mailservices */ extern ESTR map_txtdir_e; /* $lib/elm.map.txt */ extern ESTR map_bindir_e; /* $lib/elm.map.bin */ extern char unidata_path[SLEN]; /* $lib/elm.map.bin */ extern char raw_unidata_path[SLEN]; /* $lib/elm.map.bin */ extern int unstable_reverse_thread; extern char bindata_path[SLEN]; /* $lib/elm.map.bin */ extern char bindata_path_global[SLEN]; /* Used before user elm.rc is read */ extern char raw_bindata_path[SLEN]; /* $lib/elm.map.bin */ extern char user_rc_file[SLEN]; /* .elm/elmrc */ extern char user_text_file[SLEN]; /* .elm/aliases.text */ extern char user_data_file[SLEN]; /* .elm/aliases */ extern char user_mime_types[SLEN]; /* .elm/mime.types */ extern char user_mailheaders[SLEN]; /* .elm/elmheaders */ extern char user_mime_charsets[SLEN]; /* .elm/mime.charsets */ extern char user_iso2022_sets[SLEN]; /* .elm/iso2022.sets */ extern char user_terminal_info[SLEN]; /* .elm/terminal.info */ extern char user_mail_services[SLEN]; /* .elm/mail.services */ extern ESTR defaultfile_e; /* name of default folder */ extern ESTR calendar_file_e; /* name of file for clndr */ extern nl_catd elm_msg_cat; /* message catalog */ extern int title_messages; /* flag: title message display? */ extern char home[SLEN]; /* home directory of user */ extern char username[SLEN]; /* return address name! */ extern int userid; /* uid for current user */ extern int groupid; /* groupid for current user */ extern int mailgroupid; /* groupid for current user */ extern int have_saved_ids; /* sysconf _SC_SAVED_IDS */ /* *** Read from elmrc: */ extern SORT alias_sortby; /* how to sort aliases */ extern int add_irt_phrase; /* In-reply-to: Add phare to in-reply-to ? True = Do not follow RFC 2822 */ extern int add_sender_header; /* If set add Sender: header if user specifies From: -header */ extern char alternative_editor[SLEN];/* the 'other' editor */ extern PATH alternative_addresses; /* how else do we get mail? */ extern int always_del; /* flag: always delete marked msgs? */ extern int always_keep; /* flag: always keep unread msgs? */ extern int always_store; /* flag: always store read mail? */ extern int arrow_cursor; /* flag: use "->" regardless? */ extern int question_me; /* flag: ask questions as we leave? */ extern int prompt_for_cc; /* flag: prompt user for 'cc' value? */ #ifdef USE_PGP extern int pgp_askpgpsig; /* Should pgp ask userid to sign messages with? */ extern int pgp_interactive; /* Should pgp/gpg encryption/signing to be run always on interactive mode */ extern ENUMERATE pgp_sign_type; /* 0 = application/pgp 1 = text/plain 2 = text/x-pgp */ extern ENUMERATE pgp_encrypt_type; /* 0 = application/pgp 1 = text/plain 2 = text/x-pgp */ enum pgp_version { pgp_none = 0, pgp2 = 1, pgp5 = 2, gpg = 3, PGP_NUM }; extern ENUMERATE send_pgp_version; /* preferred pgp version*/ #endif extern char attribution[SLEN]; /* attribution string for replies */ extern ENUMERATE auto_attachment; /* 0 = none, 1 = application, 2 = non-text */ extern int auto_copy; /* flag: auto copy source into reply? */ extern int auto_iso_8859; /* flag: Should ISO-8859-X charsets defined on demand ? */ #ifdef BACKGROUD_PROCESSES extern int background_wait_time; /* If > 0 background mailer after * this number of seconds */ #endif extern int allow_charset_switching; /* flag: allow changing charset of terminal if terminal supports it */ /* extern int bounceback; */ /* flag: bounce copy off remote? */ extern int browser_wildcards; /* flag: do wildcard match? */ extern int builtin_lines; /* int use builtin pager? */ extern int charset_convert_ok; /* flag: no warning about conversion? */ extern int check_type_pattern; /* flag: check magic numbers when paging */ extern char raw_text_charset[SLEN]; /* name of character set */ extern charset_t text_charset; /* pointer to character set */ extern ESTR dead_letter_dir_e; /* Canceled.mail.dir */ extern char raw_default_mimetext_charset[SLEN]; /* name of character set */ extern charset_t default_mimetext_charset; /* pointer to character set */ extern char raw_default_nomime_charset[SLEN]; /* name of character set */ extern charset_t default_nomime_charset; /* pointer to character set */ extern ENUMERATE def_folder_status; /* 0 = Read 1 = Old 2 = New */ extern char config_options[SLEN]; /* which options are in o)ptions */ extern int confirm_append; /* flag: confirm append to folder? */ extern int confirm_create; /* flag: confirm create new folder? */ extern int confirm_files; /* flag: confirm files for append? */ extern int confirm_folders; /* flag: confirm folders for create? */ extern int convert_comment; /* flag: convert comment to fullname ? */ extern int convert_utf_header; /* flag: convert utf-8 mime encoded words to utf-7 when sending? */ extern int auto_copy_sent; /* flag: automatically copy sent mail? */ extern char display_locale[SLEN]; /* LC_CTYPE locale (character set) */ extern char display_codeset[SLEN]; /* nl_langinfo(CODESET) for current locale (character set) */ extern char raw_display_charset[SLEN]; extern charset_t wanted_display_charset; /* name of character set */ extern int DSN_success; /* flag: Ask successfull DSNes */ extern char e_editor[SLEN]; /* "~e" editor... */ extern ESTR editor_e; /* editor for outgoing mail*/ extern ENUMERATE mime_parameters; /* 0 == plain 1 == encoded 2 == ascii-and-encoded */ extern ENUMERATE env_from_source; /* 0 == forward-from, 1 == from, 2 == return-path */ extern char escape_char; /* '~' or something else... */ extern int force_name; /* flag: save by name forced? */ extern ENUMERATE fragment_handling; /* 0 == none, 1 == manual, 2 == auto */ extern int allow_forms; /* flag: are AT&T Mail forms okay? */ extern char full_username[SLEN];/* Full username - gecos */ extern ENUMERATE phrase_display_mode; /* 0 == plain, 1 = quoted */ extern char hostdomain[SLEN]; /* name of domain we're in */ extern char hostfullname[SLEN]; /* name of FQDN we're in */ extern char hostname[SLEN]; /* name of machine we're on*/ extern int menu_display_host; /* flag: Display host on mailbox menu* */ extern int keep_empty_files; /* flag: keep empty files?? */ #ifdef USE_PGP extern int pgp_keeppass; /* should Elm keep the passphrase? */ #endif enum { LD_NONE = 0, LD_NAME_SORT, LD_MTIME_SORT }; extern SORT local_dir_sortby; /* how to sort local directories */ extern int local_fast_lookup; /* flag: directory listing not needed for lookup */ extern char local_sessionlock_dir[SLEN]; extern ENUMERATE local_sessionlock_use_home; /* 0 == newer, 1 == spool 2 == always 3 == non-spool */ extern char raw_local_fs_charset[SLEN]; /* filesystem charset */ extern charset_t local_fs_charset; /* filesystem charset */ extern ESTR local_signature_e; /* local msg signature file */ extern int lockfolders; /* Lock folder when open */ extern int lock_in_copy; /* Lock folder when copied to it */ extern int long_encoded_headers; /* Produce over 80 character mime encoded headers */ #if defined(WCHAR) && defined(__STDC_ISO_10646__) extern PATH locale_charsets; /* Use type=unknown for these charsets * if system charset */ #endif extern ESTR folders_e; /* folder home directory */ extern ESTR extra_mailbox_dir_e; extern ESTR attachment_dir_e; extern int attachment_fix_extension; /* flag: fix extension of attashment when saving */ extern int mail_permissions; /* int: permissions for mailbox files */ extern int mini_menu; /* flag: display menu? */ extern ENUMERATE message_hide_hack; /* 0 == none */ /* 1 = FOLDER INTERNAL DATA */ extern ESTR metamail_path_e; /* Metamail path or "none" if no metamail */ extern PATH metamail_mailcaps; /* mailcaps for metamail */ extern PATH internal_mailcaps; /* mailcaps for internal handler */ extern PATH internal_mailcap_t_programs; /* Execute program without asking */ extern int internal_mailcap_t_prompt; /* ... really? */ extern int metoo; /* flag: copy me on mail to alias? */ extern int mimeforward; extern int askmimeforward; extern int mime_body_keywords; /* flag: if false the body is not parsed for keywords */ extern int move_when_paged; /* flag: move when '+' or '-' used? */ extern int names_only; /* flag: display names but no addrs? */ extern ENUMERATE allow_no_encoding; /* 1: Allow 8bit without -B8BITMIME * 2: Allow binary without -BBINARYMIME * and 8bit without -B8BITMIME */ extern int allow_no_hdrencoding; /* TRUE, if header encoding is * not required */ extern int noheader; /* flag: copy + header to file? */ extern int noheaderfwd; /* flag: copy + header to file?(fwd) */ extern int pagealternative; extern int page_known_charsets; extern int pagemultipart; extern int pagesigned; extern ESTR pager_e; /* what pager to use... */ #ifdef USE_PGP extern ESTR pgp2_path_e; /* Pgp2 path or "none" if no pgp2 */ extern ESTR pgp5_dir_e; /* pgp5 binary directory or "none" if no pgp5 */ extern ESTR gpg_path_e; #endif extern int point_to_new; /* flag: start pointing at new msgs? */ extern char allowed_precedences[SLEN]; /* list of precedences user may specify */ extern char prefixchars[SLEN]; /* prefix char(s) for msgs */ extern ESTR printout_e; /* how to print messages */ extern int prompt_after_pager; /* flag: prompt after pager exits */ extern int prompt_after_metamail; /* flag: prompt after metamail exits */ extern int prompt_metamail; /* flag: prompt for calling of metamil */ extern int quote_forward; /* flag: fwd'd msgs quoted like replies */ extern int readdatapercentinc; /* data percent increment during new mbox read */ extern ESTR readmsg_e; /* path to readmsg program */ extern int readmsginc; /* msg cnt increment during new mbox read */ extern ESTR recvd_mail_e; /* folder for storing received mail */ extern ESTR remote_signature_e;/* remote msg signature file */ extern int req_mime_bodyencoding; extern int req_mime_hdrencoding; extern int resolve_mode; /* flag: resolve before moving mode? */ extern int save_by_name; /* flag: save mail by login name? */ extern ESTR sent_mail_e; /* name of file to save copies to */ extern int set_window_title; /* flag: set (xterm?) window title and icon name */ extern ESTR shell_e; /* default system shell */ #ifdef USE_PGP extern int pgp_noarmor; /* Should Elm display text before PGP armor */ #endif extern int showto; extern ENUMERATE show_header_errors_e; /* How header errors should be reported */ extern int sig_dashes; /* flag: put dashes above signature? */ extern int sleepmsg; /* time to sleep for messages being overwritten on screen */ extern SORT sortby; /* how to sort messages (on folders) */ extern SORT thread_sortby; /* how to sort threads of messages */ extern long elm_timeout; /* seconds for main level timeout */ extern int sort_thread_max_time; /* Number of days which can considered be same thread */ extern ESTR temp_dir_e; /* name of temp directory */ #ifdef USE_PGP extern int pgp_keeppass; /* should Elm keep the passphrase in*/ #endif extern ENUMERATE user_level; /* flag: how knowledgable is user? */ extern int use_tite; /* flag: use termcap/terminfo ti/te? */ extern int utf7_encode_optional; /* flag: Should utf7 optional direct characters to be encoded? */ #ifdef I_NETDB extern int verify_domain; /* flag: Should we try check existence of mail domain */ #endif extern int verify_local_address; /* flag: Should we try check existence of local user */ extern char v_editor[SLEN]; /* "~v" editor... */ extern int elm_filter; /* flag: weed out header lines? */ extern int send_mime_plain; /* Send text/plain US-ASCII as MIME? */ extern PATH weedlist; #ifdef REMOTE_MBX extern char raw_imap_charset[SLEN]; /* IMAP foldername charset */ enum { ID_NONE = 0, ID_NAME_SORT }; extern SORT imap_dir_sortby; /* how to sort local directories */ extern int imap_fast_lookup; /* flag: skip directory listing */ extern int imap_max_dl_size; /* Maximum size of message to be downloaded */ extern charset_t imap_charset; /* IMAP foldername charset */ extern int IMAP_connection_cache; /* flag: call cache_connection() ? */ extern int IMAP_name_convention; /* flag: Should imap international folder convention be used? */ extern int IMAP_use_examine; /* flag: Should EXAMINE command to be used? */ extern int IMAP_show_greeting; /* flag: Should untagged OK messages be shown? */ extern int IMAP_show_warning; /* flag: Should untagged NO messages be shown? */ extern int IMAP_show_error; /* flag: Should untagged BAD messages be shown? */ extern int pop_max_dl_size; /* Maximum size of message to be downloaded */ extern int POP_show_greeting; /* flag: Should POP server greeting be shown? */ #endif typedef void init_default_hook P_((int *errors)); extern void add_init_default_hook P_((init_default_hook *hook)); extern void add_read_rc_file_hook P_((init_default_hook *hook)); /* lib/output.c */ #define FRM(format) format,format #define CATGETS(cat,set,def,format) format,catgets(cat,set,def,format) typedef int err_handler P_((const char *str)); extern int lib_error P_((const char * format, const char *msg, ...)); extern void set_error_handler P_((err_handler *h)); extern int lib_transient P_((const char * format, const char *msg, ...)); extern void set_transient_handler P_((err_handler *h)); extern char *elm_vmessage P_((int max_alloc, const char *format, const char *msg, va_list args)); extern struct string * elm_smessage P_((int max_alloc, const char *format, const char *msg, va_list args)); extern char *elm_message P_((const char * format, const char *msg, ...)); extern struct string *format_string P_((const char * format, const char *msg, ...)); extern int elm_sfprintf P_((char *buffer, int size, const char * format, const char *msg, ...)); extern int elm_fprintf P_((FILE *f,const char * format, const char *msg, ...)); /* result mast be malloced */ typedef char * prompt_handler P_((const char *str, int pass)); extern char * lib_prompt P_((int pass, const char * format, const char *msg, ...)); extern void set_prompt_handler P_((prompt_handler *h)); /* low level output routines: */ struct format_elem { int fill; int left; int plus; int val1, val2; int long_f; enum val_type { V_none, V_signed_val, V_unsigned_val, V_str_val, V_chr_val, V_string_val, V_cs_val, V_ptr_val, V_double_val } type; union val_value { long signed_val; unsigned long unsigned_val; char * str_val; int chr_val; struct string * string_val; struct charset_state * cs_val; void * ptr_val; double double_val; } value; char format_chr; }; /* Returns number of args parsed: -1 is parse error, - this routine can be called from interrupt handler, so this does not malloc anything or call charset routines ... - this routine is also part of debugging output routine, so do not call debugging output on here... */ extern int parse_format_args P_((struct format_elem *elems, int max_elems, const char * format, va_list args, char **format_error)); /* convert_number may be callled form signal handler, therefore it must not malloc annything ... */ extern int convert_number P_((char * buffer, int buffer_size, struct format_elem *elem)); /* lib/file_util.c */ extern long file_bytes P_((CONST char *name)); extern int save_file_stats P_((CONST char *fname)); extern int restore_file_stats P_((CONST char *fname)); extern FILE *open_or_create P_((CONST char *name)); extern int copy_to_fh P_((FILE *from, FILE *to)); extern int copy1 P_((FILE *from, char *to, int isspool)); extern int elm_chown P_((CONST char *file, int userid, int groupid)); /* lib/schedule.c */ /* if returns 0 -- action is removed from list */ typedef int action_routine P_((int fd, void * data)); extern int no_action_routine P_((int fd, void * data)); extern void change_action P_((int fd, int timeout_sec, action_routine * read_act, action_routine * write_act, action_routine * timeout_act, void *data)); extern void clear_action P_((int fd)); extern int have_actions P_((void)); typedef enum schedule_return { schedule_remove = 0, schedule_reconsider = 1, schedule_done = 2, schedule_have_action = 3 } schedule_routine P_((int fd, void * data)); extern enum schedule_return no_schedule_routine P_((int fd, void * data)); void set_schedule_action P_((int fd, schedule_routine *routine, void * data)); extern VOLATILE int wait_can_signal; #if POLL_METHOD /* Returns 1 if action occured */ extern int wait_for_action P_((action_routine * action)); extern int wait_for_any_action P_((void)); extern int wait_for_timeout P_((int seconds)); /* Returns 1 if action or timeout occured */ extern int wait_for_action_or_timeout P_((action_routine * action, int seconds)); extern int wait_for_any_action_or_timeout P_((int seconds)); #endif /* lib/panic.c */ typedef void panic_prepare P_((CONST int interrupt, CONST char * title, CONST char * ms)); extern void set_panic_prepare P_((panic_prepare *fn)); typedef void panic_exit P_((CONST int interrupt)); extern void set_panic_exit P_((panic_exit *fn)); extern void panic P_((CONST char * title, CONST char * f, CONST int ln, CONST char * pr, CONST char * ms, CONST int interrupt)); /* lib/hdrdecode.c */ extern char * blstrpbrk P_((char *string, CONST char *set)); extern void append_string P_((struct string ** res, const struct string *s)); extern struct string * hdr_to_string P_((int class,CONST char *buffer, charset_t defcharset, int demime)); extern int index_hex[128]; extern int index_64[128]; #define base64(c) ((((c) > 0) && ((c) < 127)) ? index_64[ (c) ] : -1) #define hex(c) ((((c) > 0) && ((c) < 127)) ? index_hex[ (c) ] : -1) /* lib/hdrencode.c */ extern char hexchars[16]; /* result is malloced */ /* *is_encoded = 1 ... mime encoded *is_encoded = -1 quoted phrase */ extern char * string_to_hdr P_((int class, const struct string *buffer, charset_t defcharset, int enmime, int *is_encoded)); /* lib/terminal.c */ extern int match_charset_name P_((charset_t cs1, charset_t cs2)); extern screen_info_p create_terminal_info P_((void)); /* lib/remote_mbx.c */ extern int set_transaction_file P_((const char *filename)); #ifdef REMOTE_MBX extern int close_cached_connections P_((void)); #endif /* rfc822tlen.c */ extern int rfc822_toklen P_((const char *str)); /* shared.c */ #ifdef USE_DLOPEN typedef struct dt_shared_info SHAREDLIB; extern SHAREDLIB use_shared_all; extern SHAREDLIB use_shared_base; extern SHAREDLIB use_shared_connect; extern void test_and_set_shared P_((char **argv, int will_write)); /* For elmlibregister.c */ extern int use_sharedfunc P_((char **value, int enter, int lineno, char *filename)); extern void seed_rand_bits P_((const char *buf, int size, int entropy_bits)); extern struct SE_option_type * get_option_type P_((const char *prefix)); #endif /* service_list.c */ extern int parse_service_entries P_((const char *filename, int system, int *errors)); extern void dump_service_entries P_((FILE *f, int system)); /* debug.c */ #if DEBUG /* Given arhument must be statically alloced */ extern void init_debugfile P_((const char *progname)); extern int set_debugging P_((const char *arg)); struct debug_struct { CONST char * class; CONST char * file; CONST char * ID; struct debug_target * target; int active; }; #define DEBUG_VAR(x,file,class) \ static struct debug_struct x = { class, file, rcsid, NULL, -1 } extern void debug_level_check P_((struct debug_struct *a)); extern void debug_action_call P_((struct debug_struct *a, const char * format, ...)); extern void debug_action_sigcall P_((struct debug_struct *a, const char * format, ...)); extern void debug_user_init P_((void)); #define DPRINT(x,level,action) do { \ if (x.active == -1) debug_level_check(&x); \ if (x.active >= level) debug_action_call action; \ } while(0) #define SIGDPRINT(x,level,action) do { \ if (x.active >= level) debug_action_sigcall action; \ } while(0) /* Called from signal handler, returns largest debug level */ extern int panic_dprint P_((const char * format, ...)); extern FILE * debug_to_FILE P_((struct debug_struct *a)); #else /* Dummy .... */ #define DPRINT(x,level,action) do { if (x >= level) { } } while(0) #define SIGDPRINT(x,level,action) do { if (x >= level) { } } while(0) #define DEBUG_VAR(x,file,class) static int x = 0 #endif /* state.c */ /** Definitions for state operations **/ #ifdef ANSI_C struct in_state; /* Needed for prototype */ struct out_state; /* Needed for prototype */ #endif /* can't be 'char' as argument because problems of default * promotion rules of arguments -- therefore 'int' is used * in functios: state_putc * * Notice also that we assumen here that char agument (as int) * is 'unsigned char' * * - K E H */ /* state magics */ #define STATE_in_file 0xEA01 /* _magic */ #define STATE_out_file 0xEB01 /* _magic */ #define STATE_out_buffer 0xEB03 /* _magic */ typedef struct { FILE *fpin; } in_state_file; typedef struct in_state { unsigned short magic; union { in_state_file file; } u; } in_state_t; typedef struct { FILE *fpout; } out_state_file; typedef struct out_state { unsigned short magic; unsigned int displaying : 1; unsigned int EOLN_is_CRLF : 1; /* 0 == \n is EOLN 1 == \r\n is EOLN */ charset_t * display_charset; /* output charset -- vector * of possible sets */ char *prefix; charset_t filter; struct string * filter_line; /* input charset */ union { void * dummy; out_state_file file; struct stringbuffer * buffer; struct dirstate_out * dir; } u; struct out_state_type * external_type; } out_state_t; #define state_add_prefix(x) if((x)->prefix)state_puts((x)->prefix,x) extern void in_state_clear P_((in_state_t *, int)); extern void in_state_destroy P_((in_state_t *)); extern void set_in_state_file P_((FILE *,in_state_t *)); /* STATE_in_file */ extern int in_state_seekable P_((in_state_t *)); extern int in_state_fseek P_((in_state_t *, long)); /* STATE_in_file */ extern long in_state_ftell P_((in_state_t *)); /* STATE_in_file */ extern char *state_gets P_((char *, int, in_state_t *)); extern int state_getl P_((char *dest, int len, in_state_t *s)); extern int state_getc P_((in_state_t *s)); extern int state_ungetc P_((int,in_state_t *)); extern void out_state_clear P_((out_state_t *, int)); extern void out_state_destroy P_((out_state_t *)); /* STATE_out_file */ extern void set_out_state_file P_((FILE *,out_state_t *)); /* STATE_out_buffer */ extern void set_out_state_sbuffer P_((struct stringbuffer *,out_state_t *)); extern int state_put P_((const char *, int, out_state_t *)); /* convert one line -- *len is assumed to point end of line */ extern void state_convert_EOLN P_((char *buffer, int *len, int buffer_size, out_state_t *st)); extern int state_puts P_((const char *, out_state_t *)); extern void state_nlputs P_((char *, out_state_t *)); extern int state_putc P_((int, out_state_t *)); extern int state_printf P_((out_state_t *s, const char * format, const char *msg, ...)); extern int out_state_seekable P_((out_state_t *)); extern int out_state_fseek P_((out_state_t *, long)); /* STATE_out_file */ extern long out_state_ftell P_((out_state_t *)); /* STATE_out_file */ /* Returns NULL if no available ... */ extern FILE *out_state_FILE P_((out_state_t *)); /* Return 1 if is copy succeed */ extern int state_copy P_((in_state_t *infile, out_state_t *outfile)); /* Return 1 if is copy succeed, return -1 on unexpected EOF */ extern int state_copy_range P_((in_state_t *infile, out_state_t *outfile, int bytes)); /* lib/headers.c */ #define RHL_MARK_FOLDING 1 #define RHL_CHECK_HEADER 2 extern int read_header_line P_((FILE *,char *,int,int)); extern int state_read_hdr_line P_((in_state_t *,char *, int, int)); typedef struct header_info * header_ptr; /* Returns pointer to static storage */ extern CONST char * give_header_name P_((header_ptr X)); extern int is_mailing_header P_((header_ptr X)); #ifdef ANSI_C struct mailing_headers; #endif extern int add_to_mailing_header P_((struct mailing_headers * headers, header_ptr X,const char *value, int demime, charset_t defcharset, int replace )); #define HEADER_magic 0xFC00 typedef struct header_list { unsigned short magic; header_ptr header_name; struct header_list * next_this_header; struct header_list * next_header; struct header_list * next_other_header; char * body; } * header_list_ptr; extern void update_header_list P_((header_list_ptr *list, header_list_ptr *last1, const char * name, const char * value)); extern header_ptr find_header P_((const char *name, int create_flag)); extern header_list_ptr locate_header P_((header_list_ptr,header_ptr)); #define locate_header_by_name(h,n) locate_header(h,find_header(n,0)) extern void delete_headers P_((header_list_ptr *hdr)); extern struct string * give_decoded_header P_((header_list_ptr tmphdr, int demime, charset_t defcharset)); /* syscall.c */ enum { OFF = 0, ON = 1 }; #ifdef BACKGROUD_PROCESSES extern VOLATILE int handle_sigchld; /* got SIGCHLD */ #endif /* options to the system_call() and start_run() procedure */ #define SY_USER_SHELL (1<<0) /* use user shell instead of /bin/sh */ #define SY_ENV_SHELL (1<<1) /* put SHELL=[shell] into environ */ #define SY_ENAB_SIGHUP (1<<2) /* pgm to exec can handle signals */ #define SY_ENAB_SIGINT (1<<3) /* ...and it can handle SIGINT too */ #define SY_DUMPSTATE (1<<4) /* create folder state dump file */ #define SY_ENV_METAMAIL (1<<5) /* put MM_CHARSET to environ */ #define SY_NOTTY (1<<6) /* no tty */ #define SY_CLRWAIT (1<<7) /* clr and wait 'any key' in end */ #define SY_RUN_STATE_ENV (1<<8) /* struct run_state have ext_env */ #define SY_RUN_STATE_INIT (1<<9) /* struct run_state have ext_init */ #define SY_RUN_STATE_OPIPE (1<<10) /* create {run_state}.pfd * pipe for output of command */ #define SY_RUN_STATE_EPIPE (1<<11) /* create {run_state}.pfd * pipe for error output of command */ extern int set_child_signals P_((int)); /* Prototype */ extern int set_child_env P_((int)); /* Prototype */ #ifdef BACKGROUD_PROCESSES extern void init_backgroud_handling P_((void)); #endif #ifdef BACKGROUD_PROCESSES #ifdef ANSI_C struct process_list; /* Needed for prototype */ #endif extern void sigchld_handler P_((void)); #endif struct run_state { int pid; int save_errno; int raw; int options; #ifdef BACKGROUD_PROCESSES struct process_list *listptr; #endif char ** ext_env; void (*ext_init) P_((struct run_state *rs)); void * ext_init_data; FILE *pfd; }; union any_fd { FILE * file_fd; in_state_t * state_in_fd; out_state_t * out_state_fd; void * void_fd; struct mail_send_state * mail_fd; }; typedef void end_handler P_((union any_fd fd, char * title, struct run_state *rs, int ret, int exit_stat)); #ifdef BACKGROUD_PROCESSES extern int maybe_background P_((struct run_state *rs, int *exit_code, union any_fd fd, char *title, end_handler *func)); #endif extern int start_run P_((struct run_state *rs, int options, const char * argv[], int infd, int outfd)); extern int run_already_done P_((struct run_state *rs, int *exit_code)); extern int wait_end P_((struct run_state *rs, int *exit_code)); extern CONST char ** join_argv P_((char * argv1[], char * argv2[])); typedef void SR_print_status P_((struct run_state *rs,int sig,int exit_code)); typedef int SR_RawState P_((void)); typedef void SR_Raw P_((int state)); typedef void SR_tty_init P_((void)); typedef void SR_ClearScreen P_((void)); typedef void SR_PutLineS P_((struct string *S)); void set_start_run_hooks P_((SR_print_status * print_status_func, SR_RawState * raw_query_func, SR_Raw * raw_set_func, SR_tty_init * run_tty_init, SR_ClearScreen * clear_screen_func, SR_PutLineS * put_line_function, SR_print_status * print_status_cooked_func )); extern void sr_call_ClearScreen P_((void)); extern void sr_call_Raw P_((int x)); extern int sr_call_RawState P_((void)); extern void sr_call_Write_to_screen P_((CONST char *format, CONST char *msg, ... )); extern void call_print_status_cooked P_((struct run_state *rs,int sig,int exit_code)); /* lib/id_phrase.c */ /* Encoding types */ #define ENCODING_ILLEGAL -1 #define ENCODING_NONE 0 #define ENCODING_7BIT 1 #define ENCODING_8BIT 2 #define ENCODING_BINARY 3 #define ENCODING_QUOTED 4 #define ENCODING_BASE64 5 #define ENCODING_EXPERIMENTAL 6 #define ENCODING_UUENCODED 7 struct id_phrase { char * id; struct string * text; }; extern void zero_id_phrase P_((struct id_phrase *P)); extern void free_id_phrase P_((struct id_phrase *P)); extern int check_8bit_id_phrase P_((struct id_phrase *P)); extern int check_8bit_string P_((struct string *P)); extern int check_8bit_str P_((char *str)); extern void write_id_phrase_header P_((out_state_t *mailer, const char *hdr_name, struct id_phrase * P, int top_encoding, int enmime, charset_t charset)); extern void write_string_header P_((out_state_t *mailer, const char *hdr_name, struct string * P, int top_encoding, int enmime, charset_t charset)); /* lib/outheaders.c */ struct textual { struct string *Textual; int pos; int len; }; struct expanded_address { unsigned short magic; /* EXP_ADDR_magic */ struct addr_item *addrs; int addrs_len; struct textual *surface; int surface_len; }; extern void dump_expanded_address P_((int debuglevel, const char *text, struct expanded_address expanded)); extern void expanded_address_from_items P_((struct expanded_address *result, struct addr_item *TMP)); struct mailing_headers { unsigned short magic; /* MAIL_HDR_magic */ struct string *subject; struct expanded_address from; struct id_phrase in_reply_to; char *expires; char *action; char *priority; char *sender; struct expanded_address reply_to; struct expanded_address to; struct expanded_address cc; struct user_header { header_ptr name; struct string *value; } * user_header; int user_header_count; struct expanded_address bcc; char *precedence; char *expires_days; struct mailer_env_from *env_from; }; extern void import_mailheaders P_((struct mailing_headers * headers)); extern int add_expanded_addr_ P_((struct expanded_address *x, const char *ADR, const struct string *FN, const struct string *COM)); int add_textual_addr_ P_((struct expanded_address *x, const struct string *TEXTUAL, int POS, int LEN)); #define ADD_EXPANDED(x,ADR,FN,COM) add_expanded_addr_(&x,ADR,FN,COM) #define ADD_TEXTUAL(x,TEXTUAL,POS,LEN) add_textual_addr_(&x,TEXTUAL,POS,LEN) extern void zero_expanded_address P_((struct expanded_address *x)); extern void free_expanded_address P_((struct expanded_address *x)); extern void copy_expanded_address P_((struct expanded_address *result, struct expanded_address source)); extern struct string * make_surface_addr P_((struct addr_item ITEM)); extern int check_8bit_str P_((char *str)); /* lib/write_hdr.c */ extern void print_EOLN P_((out_state_t *mailer, int encoding)); extern void write_addr_header P_((out_state_t *mailer, char *hdr_name, struct addr_item * addr, int top_encoding, int enmime, charset_t charset)); extern void write_text_header P_((out_state_t *mailer, const char *hdr_name, const char * text, int top_encoding)); /* iso2022.c */ enum map_list_mode { ml_none, ml_system, ml_global, ml_user }; extern int parse_iso2022_map P_((const char *filename, int *errors, enum map_list_mode mode)); extern void dump_iso2022_map P_((FILE *F, enum map_list_mode mode)); /* stringtok.c */ #define TOK_mail 1 #define TOK_mime 2 extern struct string_token { uint16 special; /* unicode of special or 0 */ struct string *token; } * string_tokenize P_((const struct string *line, int flags)); extern void free_string_tokenized P_((struct string_token **ptr)); /* cancel.c */ typedef void cancel_set_ttysig_f P_((void)); typedef void cancel_reset_ttysig_f P_((void)); typedef void cancel_transient_f P_((struct string *x)); typedef void cancel_clear_f P_((void)); extern void setup_cancel_cb P_((cancel_set_ttysig_f *cancel_set_ttysig, cancel_reset_ttysig_f *cancel_reset_ttysig, cancel_transient_f *cancel_transient, cancel_clear_f *cancel_clear)); extern struct chancel_data * new_cancel P_((const char * format, const char *msg, ...)); extern int is_canceled P_((struct chancel_data *cd)); extern void free_cancel P_((struct chancel_data **cd)); /* write_rc.c */ extern int write_rc P_((char *targetfile, FILE * commentfile, int global, char *actor,char *username)); /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */