/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 1999-2021 Free Software Foundation, Inc.
GNU Mailutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Mailutils is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Mailutils. If not, see . */
#ifndef _MAIL_H
#define _MAIL_H 1
#ifdef HAVE_CONFIG_H
#include
#endif
#ifdef DMALLOC
# include
#endif
#include
#include
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include
#include
#include
#include
#ifdef HAVE_STRINGS_H
# include
#endif
#include
#include
#include
#include
#include
#ifdef HAVE_READLINE_READLINE_H
# include
# include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef __cplusplus
extern "C" {
#endif
/* Type definitions */
#ifndef function_t
typedef int function_t (int, char **);
#endif
/* Values for mail_command_entry.flags */
#define EF_REG 0x00 /* Regular command */
#define EF_FLOW 0x01 /* Flow control command */
#define EF_SEND 0x02 /* Send command */
#define EF_HIDDEN 0x04 /* Hiddent command */
typedef struct compose_env
{
mu_header_t header; /* The message headers */
mu_stream_t compstr; /* Temporary compose stream */
char **outfiles; /* Names of the output files. The message is to be
saved in each of these. */
int nfiles; /* Number of output files */
int alt; /* Use multipart/alternative type */
mu_list_t attlist; /* Attachments */
mu_mime_t mime; /* Associated MIME object */
} compose_env_t;
#define MAIL_COMMAND_COMMON_MEMBERS \
const char *shortname;\
const char *longname;\
const char *synopsis
struct mail_command
{
MAIL_COMMAND_COMMON_MEMBERS;
};
struct mail_command_entry
{
MAIL_COMMAND_COMMON_MEMBERS;
int flags;
int (*func) (int, char **);
char **(*command_completion) (int argc, char **argv, int ws);
};
struct mail_escape_entry
{
const char *shortname;
const char *longname;
const char *synopsis;
int (*escfunc) (int, char **, compose_env_t *);
};
enum mailvar_type
{
mailvar_type_whatever,
mailvar_type_number,
mailvar_type_string,
mailvar_type_boolean
};
union mailvar_value
{
char *string;
int number;
int bool;
};
struct mailvar_variable
{
char *name;
enum mailvar_type type;
int set;
union mailvar_value value;
};
/* Internal variable names */
#define mailvar_name_allnet "allnet"
#define mailvar_name_append "append"
#define mailvar_name_appenddeadletter "appenddeadletter"
#define mailvar_name_askbcc "askbcc"
#define mailvar_name_askcc "askcc"
#define mailvar_name_ask "ask"
#define mailvar_name_asksub "asksub"
#define mailvar_name_autoinc "autoinc"
#define mailvar_name_autoprint "autoprint"
#define mailvar_name_bang "bang"
#define mailvar_name_charset "charset"
#define mailvar_name_cmd "cmd"
#define mailvar_name_columns "columns"
#define mailvar_name_crt "crt"
#define mailvar_name_datefield "datefield"
#define mailvar_name_debug "debug"
#define mailvar_name_decode_fallback "decode-fallback"
#define mailvar_name_dot "dot"
#define mailvar_name_editheaders "editheaders"
#define mailvar_name_emptystart "emptystart"
#define mailvar_name_escape "escape"
#define mailvar_name_flipr "flipr"
#define mailvar_name_folder "folder"
#define mailvar_name_fromfield "fromfield"
#define mailvar_name_fullnames "fullnames"
#define mailvar_name_gnu_last_command "gnu-last-command"
#define mailvar_name_header "header"
#define mailvar_name_headline "headline"
#define mailvar_name_hold "hold"
#define mailvar_name_ignore "ignore"
#define mailvar_name_ignoreeof "ignoreeof"
#define mailvar_name_indentprefix "indentprefix"
#define mailvar_name_inplacealiases "inplacealiases"
#define mailvar_name_keep "keep"
#define mailvar_name_keepsave "keepsave"
#define mailvar_name_mailx "mailx"
#define mailvar_name_metamail "metamail"
#define mailvar_name_metoo "metoo"
#define mailvar_name_mimenoask "mimenoask"
#define mailvar_name_mode "mode"
#define mailvar_name_nullbody "nullbody"
#define mailvar_name_nullbodymsg "nullbodymsg"
#define mailvar_name_outfilename "outfilename"
#define mailvar_name_outfolder "outfolder"
#define mailvar_name_page "page"
#define mailvar_name_prompt "prompt"
#define mailvar_name_quit "quit"
#define mailvar_name_rc "rc"
#define mailvar_name_readonly "readonly"
#define mailvar_name_record "record"
#define mailvar_name_recursivealiases "recursivealiases"
#define mailvar_name_regex "regex"
#define mailvar_name_replyprefix "replyprefix"
#define mailvar_name_replyregex "replyregex"
#define mailvar_name_return_address "return-address"
#define mailvar_name_save "save"
#define mailvar_name_screen "screen"
#define mailvar_name_sendmail "sendmail"
#define mailvar_name_sendwait "sendwait"
#define mailvar_name_sign "sign"
#define mailvar_name_Sign "Sign"
#define mailvar_name_showenvelope "showenvelope"
#define mailvar_name_showto "showto"
#define mailvar_name_toplines "toplines"
#define mailvar_name_variable_pretty_print "variable-pretty-print"
#define mailvar_name_varpp "varpp"
#define mailvar_name_variable_strict "variable-strict"
#define mailvar_name_varstrict "varstrict"
#define mailvar_name_verbose "verbose"
#define mailvar_name_xmailer "xmailer"
#define mailvar_name_mime "mime"
#define mailvar_name_onehop "onehop"
#define mailvar_name_quiet "quiet"
#define mailvar_name_PID "PID"
#define mailvar_name_useragent "useragent"
typedef struct message_set msgset_t;
struct message_set
{
msgset_t *next; /* Link to the next message set */
mu_coord_t crd;
};
typedef int (*msg_handler_t) (msgset_t *mp, mu_message_t mesg, void *data);
/* Global variables and constants*/
extern mu_mailbox_t mbox;
extern size_t total;
extern int interactive;
extern mu_url_t secondary_url;
extern const char *program_version;
extern char *default_encoding;
extern char *default_content_type;
extern int skip_empty_attachments;
extern int multipart_alternative;
/* Functions */
int mail_alias (int argc, char **argv);
int mail_alt (int argc, char **argv); /* command alternates */
int mail_cd (int argc, char **argv);
int mail_copy (int argc, char **argv);
int mail_decode (int argc, char **argv);
int mail_delete (int argc, char **argv);
int mail_discard (int argc, char **argv);
int mail_dp (int argc, char **argv);
int mail_echo (int argc, char **argv);
int mail_edit (int argc, char **argv);
int mail_else (int argc, char **argv);
int mail_endif (int argc, char **argv);
int mail_exit (int argc, char **argv);
int mail_file (int argc, char **argv);
int mail_folders (int argc, char **argv);
int mail_followup (int argc, char **argv);
int mail_from (int argc, char **argv);
int mail_from0 (msgset_t *mspec, mu_message_t msg, void *data);
void mail_compile_headline (char const *str);
int mail_headers (int argc, char **argv);
int mail_hold (int argc, char **argv);
int mail_help (int argc, char **argv);
int mail_if (int argc, char **argv);
int mail_inc (int argc, char **argv);
int mail_list (int argc, char **argv);
int mail_send (int argc, char **argv); /* command mail */
int mail_mbox (int argc, char **argv);
int mail_next (int argc, char **argv);
int mail_nounfold (int argc, char **argv);
int mail_variable (int argc, char **argv);
int mail_pipe (int argc, char **argv);
int mail_previous (int argc, char **argv);
int mail_print (int argc, char **argv);
int mail_quit (int argc, char **argv);
int mail_reply (int argc, char **argv);
int mail_retain (int argc, char **argv);
int mail_save (int argc, char **argv);
int mail_sendheader (int argc, char **argv);
int mail_set (int argc, char **argv);
int mail_shell (int argc, char **argv);
int mail_execute (int shell, char *progname, int argc, char **argv);
int mail_size (int argc, char **argv);
int mail_source (int argc, char **argv);
int mail_summary (int argc, char **argv);
int mail_tag (int argc, char **argv);
int mail_top (int argc, char **argv);
int mail_touch (int argc, char **argv);
int mail_unalias (int argc, char **argv);
int mail_undelete (int argc, char **argv);
int mail_unfold (int argc, char **argv);
int mail_unset (int argc, char **argv);
int mail_version (int argc, char **argv);
int mail_visual (int argc, char **argv);
int mail_warranty (int argc, char **argv);
int mail_write (int argc, char **argv);
int mail_z (int argc, char **argv);
int mail_eq (int argc, char **argv); /* command = */
int mail_setenv (int argc, char **argv);
int mail_envelope (int argc, char **argv);
int print_stream_envelope (mu_stream_t str, msgset_t *mspec, mu_message_t msg,
char const *pfx);
int mail_struct (int argc, char **argv);
int if_cond (void);
void mail_mainloop (char *(*input) (void *, int), void *closure, int do_history);
int mail_copy0 (int argc, char **argv, int mark);
int mail_compose_send (compose_env_t *env, int save_to);
void free_env_headers (compose_env_t *env);
/*extern void print_message (mu_message_t mesg, char *prefix, int all_headers, FILE *file);*/
int mail_mbox_commit (void);
int mail_is_my_name (const char *name);
void mail_set_my_name (char *name);
char *mail_whoami (void);
int mail_header_is_visible (const char *str);
int mail_header_is_unfoldable (const char *str);
int mail_mbox_close (void);
int mail_expand_name (const char *name, mu_url_t *purl);
void send_append_header (char const *text);
void send_append_header2 (char const *name, char const *value, int mode);
int send_attach_file (int fd,
const char *filename,
const char *content_filename,
const char *content_name,
const char *content_type, const char *encoding);
int escape_check_args (int argc, char **argv, int minargs, int maxargs);
int escape_shell (int argc, char **argv, compose_env_t *env);
int escape_command (int argc, char **argv, compose_env_t *env);
int escape_help (int argc, char **argv, compose_env_t *env);
int escape_sign (int argc, char **argv, compose_env_t *env);
int escape_bcc (int argc, char **argv, compose_env_t *env);
int escape_cc (int argc, char **argv, compose_env_t *env);
int escape_deadletter (int argc, char **argv, compose_env_t *env);
int escape_editor (int argc, char **argv, compose_env_t *env);
int escape_print (int argc, char **argv, compose_env_t *env);
int escape_headers (int argc, char **argv, compose_env_t *env);
int escape_insert (int argc, char **argv, compose_env_t *env);
int escape_quote (int argc, char **argv, compose_env_t *env);
int escape_type_input (int argc, char **argv, compose_env_t *env);
int escape_read (int argc, char **argv, compose_env_t *env);
int escape_subj (int argc, char **argv, compose_env_t *env);
int escape_to (int argc, char **argv, compose_env_t *env);
int escape_visual (int argc, char **argv, compose_env_t *env);
int escape_write (int argc, char **argv, compose_env_t *env);
int escape_exit (int argc, char **argv, compose_env_t *env);
int escape_pipe (int argc, char **argv, compose_env_t *env);
int escape_list_attachments (int argc, char **argv, compose_env_t *env);
int escape_attach (int argc, char **argv, compose_env_t *env);
int escape_remove_attachment (int argc, char **argv, compose_env_t *env);
int escape_toggle_multipart_type (int argc, char **argv, compose_env_t *env);
enum
{
parse_headers_ok,
parse_headers_error,
parse_headers_fatal
};
int parse_headers (mu_stream_t input, compose_env_t *env);
/* Cursor */
void set_cursor (unsigned value);
size_t get_cursor (void);
void page_invalidate (int hard);
void cond_page_invalidate (size_t value);
void page_do (msg_handler_t func, void *data);
size_t page_move (off_t offset);
int is_current_message (size_t n);
/* msgsets */
void msgset_free (msgset_t *msg_set);
msgset_t *msgset_make_1 (size_t number);
msgset_t *msgset_append (msgset_t *one, msgset_t *two);
void msgset_remove (msgset_t **pset, size_t n);
msgset_t *msgset_range (int low, int high);
msgset_t *msgset_expand (msgset_t *set, msgset_t *expand_by);
msgset_t *msgset_dup (const msgset_t *set);
int msgset_parse (const int argc, char **argv, int flags, msgset_t **mset);
int msgset_member (msgset_t *set, size_t n);
msgset_t *msgset_negate (msgset_t *set);
size_t msgset_count (msgset_t *set);
static inline size_t
msgset_length (msgset_t *set)
{
return mu_coord_length (set->crd);
}
static inline size_t
msgset_msgno (msgset_t *set)
{
return set->crd[1];
}
static inline char *
msgset_part_str (const msgset_t *set, size_t n)
{
return mu_coord_part_string (set->crd, n);
}
static inline char *
msgset_str (const msgset_t *set)
{
return mu_coord_string (set->crd);
}
/* Constants for naming outgoing mail files */
enum
{
outfilename_local, /* File is named by local part of the recipient email. */
outfilename_email, /* File is named by entire email. */
outfilename_domain /* File is named by domain part. */
};
extern int outfilename_mode;
#define MDHINT_SELECTED_HEADERS 0x1
struct mime_descend_closure
{
int hints;
const msgset_t *msgset;
mu_message_t message;
const char *type;
const char *encoding;
const struct mime_descend_closure *parent;
};
typedef int (*mime_descend_fn) (struct mime_descend_closure *closure,
void *data);
int mime_descend (struct mime_descend_closure *closure,
mime_descend_fn fun, void *data);
int util_do_command (const char *cmd, ...) MU_PRINTFLIKE(1,2);
int util_foreach_msg (int argc, char **argv, int flags,
msg_handler_t func, void *data);
size_t util_range_msg (size_t low, size_t high, int flags,
msg_handler_t func, void *data);
function_t *util_command_get (const char *cmd);
void *util_find_entry (void *table, size_t nmemb, size_t size,
const char *cmd);
int util_help (void *table, size_t nmemb, size_t size, const char *word);
int util_command_list (void *table, size_t nmemb, size_t size);
const struct mail_command_entry *mail_find_command (const char *cmd);
const struct mail_escape_entry *mail_find_escape (const char *cmd);
int mail_command_help (const char *command);
int mail_escape_help (const char *command);
void mail_command_list (void);
const struct mail_command *mail_command_name (int i);
int util_getcols (void);
int util_getlines (void);
int util_screen_lines (void);
int util_screen_columns (void);
int util_get_crt (void);
struct mailvar_variable *mailvar_find_variable (const char *var, int create);
int mailvar_get (void *ptr, const char *variable,
enum mailvar_type type, int warn);
int mailvar_is_true (char const *name);
void mailvar_print (int set);
void mailvar_variable_format (mu_stream_t,
const struct mailvar_variable *,
const char *defval);
#define MOPTF_OVERWRITE 0x001
#define MOPTF_QUIET 0x002
#define MOPTF_UNSET 0x004
int mailvar_set (const char *name, void *value,
enum mailvar_type type, int flags);
int util_isdeleted (size_t msgno);
char *util_get_homedir (void);
char *util_fullpath (const char *inpath);
char *util_folder_path (const char *name);
char *util_get_sender (int msgno, int strip);
char *util_message_sender (mu_message_t msg, int strip);
void util_slist_print (mu_list_t list, int nl);
int util_slist_lookup (mu_list_t list, const char *str);
void util_slist_add (mu_list_t *list, char *value);
void util_slist_remove (mu_list_t *list, char *value);
void util_slist_destroy (mu_list_t *list);
char *util_slist_to_string (mu_list_t list, const char *delim);
void util_strcat (char **dest, const char *str);
char *util_outfilename (mu_address_t addr);
char *util_outfolder_name (char *str);
void util_save_outgoing (mu_message_t msg, char *savefile);
int util_error_range (size_t msgno);
void util_noapp (void);
int util_tempfile (char **namep);
void util_msgset_iterate (msgset_t *msgset,
int (*fun) (mu_message_t, msgset_t *, void *),
void *closure);
void util_get_content_type (mu_header_t hdr, char **value, char **args);
void util_get_hdr_value (mu_header_t hdr, const char *name, char **value);
int util_merge_addresses (char **addr_str, const char *value);
void util_address_expand_aliases (mu_address_t *paddr);
int util_header_expand_aliases (mu_header_t *hdr);
int util_get_message (mu_mailbox_t mbox, size_t msgno, mu_message_t *msg);
int util_get_message_part (mu_mailbox_t mbox, msgset_t *msgset,
mu_message_t *ret_msg);
void util_cache_command (mu_list_t *list, const char *fmt, ...)
MU_PRINTFLIKE(2,3);
void util_run_cached_commands (mu_list_t *list);
const char *util_reply_prefix (void);
void util_rfc2047_decode (char **value);
char *util_get_charset (void);
void util_mark_read (mu_message_t msg);
const char *util_url_to_string (mu_url_t url);
mu_stream_t open_pager (size_t lines);
int print_message_body (mu_message_t msg, mu_stream_t out, size_t *stat);
char *sender_string (mu_message_t msg);
int is_address_field (const char *name);
int ml_got_interrupt (void);
void ml_clear_interrupt (void);
void ml_readline_init (void);
int ml_reread (const char *prompt, char **text);
char *ml_readline (const char *prompt);
char *ml_readline_with_intr (const char *prompt);
char *alias_expand (const char *name);
void alias_destroy (const char *name);
typedef struct alias_iterator *alias_iterator_t;
char *alias_find_first (const char *prefix, alias_iterator_t *itr);
const char *alias_iterate_next (alias_iterator_t itr);
const char *alias_iterate_first (const char *p, alias_iterator_t *itr);
void alias_iterate_end (alias_iterator_t *itr);
/* Auxiliary functions for accessing folders */
enum
{
any_folder,
local_folder
};
int util_get_folder (mu_folder_t *pfolder, mu_url_t url, int type);
int mail_sender (int argc, char **argv);
int mail_nosender (int argc, char **argv);
mu_address_t get_sender_address (mu_message_t msg);
#define COMPOSE_APPEND 0
#define COMPOSE_REPLACE 1
#define COMPOSE_SINGLE_LINE 2
void compose_init (compose_env_t *env);
int compose_header_set (compose_env_t *env, const char *name,
const char *value, int replace);
char const *compose_header_get (compose_env_t *env, char *name, char *defval);
void compose_destroy (compose_env_t *env);
#ifndef HAVE_READLINE_READLINE_H
char *readline (char *prompt);
#endif
/* Flags for util_get_message */
#define MSG_ALL 0
#define MSG_NODELETED 0x0001
#define MSG_SILENT 0x0002
#define MSG_COUNT 0x0004
/* Message attributes */
#define MAIL_ATTRIBUTE_MBOXED 0x0001
#define MAIL_ATTRIBUTE_PRESERVED 0x0002
#define MAIL_ATTRIBUTE_SAVED 0x0004
#define MAIL_ATTRIBUTE_TAGGED 0x0008
#define MAIL_ATTRIBUTE_SHOWN 0x0010
#define MAIL_ATTRIBUTE_TOUCHED 0x0020
void ml_attempted_completion_over (void);
void ml_set_completion_append_character (int);
/* Flags for per-command completion functions */
enum
{
COMPL_DFL = 0x0, /* Nothing special */
COMPL_WS = 0x1, /* Cursor pointing to a whitespace character
at the start of input or past another whitespace */
COMPL_LASTARG = 0x2 /* Cursor pointing at or past the last argument */
};
#ifdef WITH_READLINE
char **file_compl (int argc, char **argv, int ws);
char **no_compl (int argc, char **argv, int ws);
char **msglist_compl (int argc, char **argv, int ws);
char **msglist_file_compl (int argc, char **argv, int ws);
char **dir_compl (int argc, char **argv, int ws);
char **command_compl (int argc, char **argv, int ws);
char **alias_compl (int argc, char **argv, int ws);
char **mailvar_set_compl (int argc, char **argv, int ws);
char **exec_compl (int argc, char **argv, int ws);
char **shell_compl (int argc, char **argv, int ws);
char *msgtype_generator (const char *text, int state);
#else
# define file_compl NULL
# define no_compl NULL
# define msglist_compl NULL
# define msglist_file_compl NULL
# define dir_compl NULL
# define command_compl NULL
# define alias_compl NULL
# define var_compl NULL
# define exec_compl NULL
# define shell_compl NULL
# define mailvar_set_compl NULL
#endif
#ifdef __cplusplus
}
#endif
#endif /* _MAIL_H */