1023{
1025
1026 struct Email *e = NULL;
1028 int rc = 1;
1029 bool repeat_error = false;
1034
1035
1036 if (getegid() != getgid())
1037 {
1038 mutt_error(
"%s: I don't want to run with privileges!", (argc != 0) ? argv[0] :
"neomutt");
1039 goto done;
1040 }
1041
1043
1046 goto done;
1047
1049
1051 {
1052 rc = 0;
1053 goto done;
1054 }
1055
1057
1058#ifdef USE_DEBUG_NOTIFY
1060#endif
1061
1064 goto done;
1065
1067 goto done;
1068
1071
1072
1075 {
1080 }
1081
1082
1083 if (
OptGui && !isatty(STDOUT_FILENO))
1084 goto done;
1085
1086
1087
1089 {
1091 if (crc != 0)
1092 goto done;
1093 }
1094
1095
1096
1099
1100
1104 if (rc2 != 0)
1105 goto done;
1106
1109
1111
1112
1114
1117 {
1118 goto done;
1119 }
1120
1122 {
1123 rc = 0;
1124 goto done;
1125 }
1126
1127#ifdef USE_AUTOCRYPT
1128
1129
1131 if (c_autocrypt)
1133#endif
1134
1135
1138 {
1139 struct stat st = { 0 };
1141
1144 bool skip = false;
1145
1149 if (!skip && (stat(
buf_string(fpath), &st) == -1) && (errno == ENOENT))
1150 {
1151 char msg2[256] = { 0 };
1152 snprintf(msg2,
sizeof(msg2),
_(
"%s does not exist. Create it?"), c_folder);
1154 {
1155 if ((mkdir(
buf_string(fpath), 0700) == -1) && (errno != EEXIST))
1156 mutt_error(
_(
"Can't create %s: %s"), c_folder, strerror(errno));
1157 }
1158 }
1160 }
1161
1163
1167
1169 {
1173 rc = 0;
1174
1175
1177 repeat_error = true;
1178 goto done;
1179 }
1181 {
1182 FILE *fp_in = NULL;
1183 FILE *fp_out = NULL;
1184 const char *infile = NULL;
1185 char *bodytext = NULL;
1186 const char *bodyfile = NULL;
1187 int rv = 0;
1188
1191
1194
1197
1198 const char **cp = NULL;
1200 {
1202 }
1203
1205 {
1207 }
1208
1210 {
1212 {
1214 {
1217 goto done;
1218 }
1219 }
1220 else
1221 {
1223 }
1224 }
1225
1229 {
1232 goto done;
1233 }
1234
1236 {
1237
1240 }
1241
1243 {
1245 }
1247 {
1249 }
1250 else
1251 {
1253 }
1254
1255 if (infile || bodytext)
1256 {
1257
1258 if (infile)
1259 {
1261 {
1263 {
1266 goto done;
1267 }
1268 fp_in = stdin;
1269 }
1270 else
1271 {
1275 if (!fp_in)
1276 {
1279 goto done;
1280 }
1281 }
1282 }
1283
1285 {
1286
1287
1289 }
1290 else
1291 {
1292
1293
1294
1296
1298 if (!fp_out)
1299 {
1303 goto done;
1304 }
1305 if (fp_in)
1306 {
1308 if (fp_in == stdin)
1310 else
1312 }
1313 else if (bodytext)
1314 {
1315 fputs(bodytext, fp_out);
1316 }
1318
1320 if (!fp_in)
1321 {
1324 goto done;
1325 }
1326 }
1327
1328
1329
1330
1332 {
1334 struct stat st = { 0 };
1335
1337
1338
1339
1343 if (fstat(fileno(fp_in), &st) != 0)
1344 {
1348 goto done;
1349 }
1351
1353 {
1358 goto done;
1359 }
1360
1361
1366 {
1368 {
1369 if (c_resume_edited_draft_files)
1371
1375 }
1376 }
1377
1383
1386 }
1388 {
1389
1390
1392 }
1393 else
1394 {
1395
1397 }
1398
1400 }
1401
1403
1405 {
1407
1408 while (b && b->
next)
1410
1412 {
1413 if (b)
1414 {
1417 }
1418 else
1419 {
1422 }
1423 if (!b)
1424 {
1427 goto done;
1428 }
1429 }
1430 }
1431
1433
1437
1439 {
1441 {
1442 if (truncate(
buf_string(expanded_infile), 0) == -1)
1443 {
1446 goto done;
1447 }
1449 if (!fp_out)
1450 {
1453 goto done;
1454 }
1455
1456
1457
1458 if (rv < 0)
1459 {
1465 }
1466
1469 c_crypt_protected_headers_read &&
1473 if (c_resume_edited_draft_files)
1474 fprintf(fp_out, "X-Mutt-Resume-Draft: 1\n");
1475 fputc('\n', fp_out);
1477 {
1480 goto done;
1481 }
1483 }
1484
1486 }
1487
1488
1491
1493
1494 if (rv != 0)
1495 goto done;
1496 }
1498 {
1499
1500
1502 goto done;
1503 }
1504 else
1505 {
1508
1510 {
1515 {
1517 goto done;
1518 }
1522 }
1524 {
1526 {
1532 goto done;
1533 }
1535 {
1537 goto done;
1538 }
1542 {
1543 rc = 0;
1544 goto done;
1545 }
1546 }
1547
1549 {
1551 if (c_spool_file)
1552 {
1553
1555 if (m_desc)
1557 else
1559 }
1560 else if (c_folder)
1561 {
1563 }
1564
1565 }
1566
1568 {
1574 }
1575 else
1576 {
1578 }
1579
1582
1584 {
1585
1587 {
1588 case -1:
1590 goto done;
1591 case 1:
1593 goto done;
1594 }
1595 }
1596
1598
1605
1608
1609 repeat_error = true;
1613 {
1616
1619 repeat_error = false;
1620 }
1621 if (m || !explicit_folder)
1622 {
1625
1630
1634 repeat_error = false;
1635 }
1637
1638
1639 }
1640 rc = 0;
1641
1642done:
1644
1647
1649 {
1653 }
1654
1662
1664
1668
1677 return rc;
1678}
void mutt_addrlist_copy(struct AddressList *dst, const struct AddressList *src, bool prune)
Copy a list of addresses into another list.
int mutt_addrlist_parse(struct AddressList *al, const char *s)
Parse a list of email addresses.
int mutt_autocrypt_init(bool can_create)
Initialise Autocrypt.
@ MUTT_SEL_MAILBOX
Select a mailbox.
@ MUTT_SEL_FOLDER
Select a local directory.
void buf_alloc(struct Buffer *buf, size_t new_size)
Make sure a buffer can store at least new_size bytes.
bool cli_parse(int argc, char *const *argv, struct CommandLine *cli)
Parse the Command Line.
@ CMD_STARTUP_HOOK
:startup-hook
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
int cs_str_native_set(const struct ConfigSet *cs, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
bool StartupComplete
When the config has been read.
void config_cache_cleanup(void)
Cleanup the cache of charset config variables.
void account_mailbox_remove(struct Account *a, struct Mailbox *m)
Remove a Mailbox from an Account.
void mailbox_free(struct Mailbox **ptr)
Free a Mailbox.
struct Mailbox * mailbox_find_name(const char *name)
Find the mailbox with a given name.
struct Mailbox * mailbox_find(const char *path)
Find the mailbox with a given path.
@ MUTT_POP
'POP3' Mailbox type
@ MUTT_NNTP
'NNTP' (Usenet) Mailbox type
@ MUTT_IMAP
'IMAP' Mailbox type
bool mutt_should_hide_protected_subject(struct Email *e)
Should NeoMutt hide the protected subject?
void crypt_init(void)
Initialise the crypto backends.
int debug_all_observer(struct NotifyCallback *nc)
Debug observer for all notifications.
void dialog_push(struct MuttWindow *dlg)
Display a Window to the user.
void dialog_pop(void)
Hide a Window from the user.
struct MuttWindow * index_pager_init(void)
Allocate the Windows for the Index/Pager.
struct Body * mutt_body_new(void)
Create a new Body.
struct Email * email_new(void)
Create a new Email.
void email_free(struct Email **ptr)
Free an Email.
bool mutt_parse_mailto(struct Envelope *env, char **body, const char *src)
Parse a mailto:// url.
void mutt_filter_commandline_header_value(char *header)
Sanitise characters in a header value.
int mutt_env_to_intl(struct Envelope *env, const char **tag, char **err)
Convert an Envelope's Address fields to Punycode format.
void mutt_env_free(struct Envelope **ptr)
Free an Envelope.
struct Envelope * mutt_env_new(void)
Create a new Envelope.
void mutt_env_set_subject(struct Envelope *env, const char *subj)
Set both subject and real_subj to subj.
void envlist_free(char ***envp)
Free the private copy of the environment.
void external_cleanup(void)
Clean up commands globals.
int mutt_file_copy_stream(FILE *fp_in, FILE *fp_out)
Copy the contents of one file into another.
static const struct Module * Modules[]
All the library Modules.
void mutt_flushinp(void)
MacroEvents moved to KeyModuleData UngetKeyEvents moved to KeyModuleData.
bool OptNews
(pseudo) used to change reader mode
char * LastFolder
Previously selected mailbox.
char ErrorBuf[1024]
Copy of the last error message.
bool ErrorBufMessage
true if the last message was an error
char * CurrentFolder
Currently selected mailbox.
void dlg_browser(struct Buffer *file, SelectFileFlags flags, struct Mailbox *m, char ***files, int *numfiles)
Let the user select a file -.
struct Mailbox * dlg_index(struct MuttWindow *dlg, struct Mailbox *m_init)
Display a list of emails -.
int log_disp_queue(time_t stamp, const char *file, int line, const char *function, enum LogLevel level, const char *format,...)
Save a log line to an internal queue - Implements log_dispatcher_t -.
#define mutt_message(...)
enum MailboxType nntp_path_probe(const char *path, const struct stat *st)
Is this an NNTP Mailbox?
enum MailboxType pop_path_probe(const char *path, const struct stat *st)
Is this a POP Mailbox?
enum MailboxType imap_path_probe(const char *path, const struct stat *st)
Is this an IMAP Mailbox?
int main_hist_observer(struct NotifyCallback *nc)
Notification that a Config Variable has change - Implements observer_t -.
static int main_timeout_observer(struct NotifyCallback *nc)
Notification that a timeout has occurred - Implements observer_t -.
int main_log_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
void exec_startup_shutdown_hook(enum CommandId id)
Execute any startup/shutdown hooks.
void exec_folder_hook(const char *path, const char *desc)
Perform a folder hook.
void imap_logout_all(void)
Close all open connections.
int log_dispatcher_t MuttLogger
@ LL_NOTIFY
Log of notifications.
static bool init_logging(struct CliShared *shared, struct ConfigSet *cs)
Initialise the Logging.
static void log_translation(void)
Log the translation being used.
static void init_nntp(struct Buffer *server, struct ConfigSet *cs)
Initialise the NNTP config.
static bool show_help(struct CliHelp *help)
Show the Help.
static int start_curses(void)
Start the Curses UI.
static bool dump_info(struct CliInfo *ci, struct ConfigSet *cs)
Show config info.
static void init_keys(struct NeoMutt *n)
Initialise the Keybindings.
static bool get_user_info(struct ConfigSet *cs)
Find the user's name, home and shell.
static int mutt_init(struct ConfigSet *cs, struct Buffer *dlevel, struct Buffer *dfile, bool skip_sys_rc, struct StringArray *user_files, struct StringArray *commands)
Initialise NeoMutt.
@ MODULE_ID_GUI
ModuleGui, Graphical code
@ MODULE_ID_NNTP
ModuleNntp, Nntp
struct Body * mutt_make_multipart(struct Body *b)
Create a multipart email.
void mutt_ch_cache_cleanup(void)
Clean up the cached iconv handles and charset strings.
void log_queue_empty(void)
Free the contents of the queue.
bool notify_observer_remove(struct Notify *notify, const observer_t callback, const void *global_data)
Remove an observer from an object.
bool notify_observer_add(struct Notify *notify, enum NotifyType type, observer_t callback, void *global_data)
Add an observer to an object.
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
size_t mutt_istr_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix, ignoring case.
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
enum MuttCursorState mutt_curses_set_cursor(enum MuttCursorState state)
Set the cursor state.
@ MUTT_CURSOR_INVISIBLE
Hide the cursor.
@ MUTT_CURSOR_VISIBLE
Display a normal cursor.
void mutt_log_stop(void)
Close the log file.
void mutt_log_prep(void)
Prepare to log.
int mutt_mailbox_check(struct Mailbox *m_cur, CheckStatsFlags flags)
Check all all Mailboxes for new mail.
struct Mailbox * mutt_mailbox_next(struct Mailbox *m_cur, struct Buffer *s)
Incoming folders completion routine.
void window_redraw(struct MuttWindow *win)
Reflow, recalc and repaint a tree of Windows.
void mutt_window_free(struct MuttWindow **ptr)
Free a Window and its children.
bool mx_mbox_open(struct Mailbox *m, OpenMailboxFlags flags)
Open a mailbox and parse it.
struct Mailbox * mx_resolve(const char *path_or_name)
Get a Mailbox from either a path or name.
int mx_path_is_empty(struct Buffer *path)
Is the mailbox empty.
@ MUTT_READONLY
Open in read-only mode.
@ MUTT_OPEN_NONE
No flags are set.
@ MUTT_MAILBOX_CHECK_IMMEDIATE
Don't postpone the actual checking.
void neomutt_cleanup(struct NeoMutt *n)
Clean up NeoMutt and Modules.
bool neomutt_init(struct NeoMutt *n, char **envp, const struct Module **modules)
Initialise NeoMutt.
void neomutt_gui_cleanup(struct NeoMutt *n)
Clean up the GUI Modules.
struct NeoMutt * neomutt_new(void)
Create the main NeoMutt object.
void neomutt_free(struct NeoMutt **ptr)
Free a NeoMutt.
bool neomutt_gui_init(struct NeoMutt *n)
Initialise the GUI Modules.
@ NT_GLOBAL_STARTUP
NeoMutt is initialised.
void nntp_expand_path(char *buf, size_t buflen, struct ConnAccount *acct)
Make fully qualified url from newsgroup name.
struct NntpAccountData * nntp_select_server(struct Mailbox *m, const char *server, bool leave_lock)
Open a connection to an NNTP server.
@ NT_TIMEOUT
Timeout has occurred.
@ NT_CONFIG
Config has changed, NotifyConfig, EventConfig.
@ NT_ALL
Register for all notifications.
@ NT_GLOBAL
Not object-related, NotifyGlobal.
@ NT_RESIZE
Window has been resized.
struct CommandLine * command_line_new(void)
Create a new CommandLine.
void command_line_free(struct CommandLine **ptr)
Free a CommandLine.
void buf_pool_cleanup(void)
Release the Buffer pool.
int mutt_prepare_template(FILE *fp, struct Mailbox *m, struct Email *e_new, struct Email *e, bool resend)
Prepare a message template.
void mutt_prex_cleanup(void)
Cleanup heap memory allocated by compiled regexes.
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
enum QuadOption query_yesorno(const char *prompt, enum QuadOption def)
Ask the user a Yes/No question.
#define STAILQ_REMOVE(head, elm, type, field)
#define STAILQ_FOREACH_SAFE(var, head, field, tvar)
#define TAILQ_EMPTY(head)
void rootwin_new(struct GuiModuleData *mod_data)
Create the default Windows.
void rootwin_cleanup(struct GuiModuleData *mod_data)
Free all the default Windows.
int mutt_write_mime_body(struct Body *b, FILE *fp, struct ConfigSubset *sub)
Write a MIME part.
void mutt_encode_descriptions(struct Body *b, bool recurse, struct ConfigSubset *sub)
RFC2047 encode the content-descriptions.
int mutt_send_message(SendFlags flags, struct Email *e_templ, const char *tempfile, struct Mailbox *m, struct EmailArray *ea, struct ConfigSubset *sub)
Send an email.
@ SEND_CONSUMED_STDIN
stdin has been read; don't read it twice
@ SEND_NO_FREE_HEADER
Used by the -E flag.
@ SEND_NONE
No flags are set.
@ SEND_BATCH
Send email in batch mode (without user interaction)
@ SEND_CLI_CRYPTO
Enable message security in modes that by default don't enable it.
@ SEND_DRAFT_FILE
Used by the -H flag.
@ SEND_POSTPONED
Recall a postponed email.
struct Body * mutt_make_file_attach(const char *path, struct ConfigSubset *sub)
Create a file attachment.
void mutt_prepare_envelope(struct Envelope *env, bool final, struct ConfigSubset *sub)
Prepare an email header.
void source_stack_cleanup(void)
Free memory from the stack used for the source command.
bool unlink
If true, filename should be unlink()ed before free()ing this structure.
LOFF_T length
length (in bytes) of attachment
struct Body * next
next attachment in the list
size_t dsize
Length of data.
char * data
Pointer to data.
struct Buffer draft_file
-H Use this draft file
bool is_set
This struct has been used.
struct Buffer include_file
-i Use this include file
struct StringArray cc_list
-c Add a Cc:
struct StringArray attach
-a Attach a file
bool use_crypto
-C Use CLI crypto
bool edit_infile
-E Edit the draft/include
struct StringArray bcc_list
-b Add a Bcc:
struct StringArray addresses
Send to these addresses.
struct Buffer subject
-s Use this Subject:
struct StringArray commands
-e Run these commands
bool disable_system
-n Don't read the system config file
struct StringArray user_files
-F Use these user config files
struct Buffer mbox_type
-m Set the default Mailbox type
bool read_only
-R Open Mailbox read-only
bool start_any_mail
-z Check for Any Mail
bool start_nntp
-G Open an NNTP Mailbox
struct Buffer nntp_server
-g Open this NNTP Mailbox
struct Buffer folder
-f Open this Mailbox
bool start_postponed
-p Open Postponed emails
bool start_new_mail
-Z Check for New Mail
bool start_browser
-y Open the Mailbox Browser
struct CliSend send
Send Mode command line options.
struct CliShared shared
Shared command line options.
struct CliHelp help
Help Mode command line options.
struct CliInfo info
Info Mode command line options.
struct CliTui tui
Tui Mode command line options.
Container for lots of config items.
struct Notify * notify
Notifications: NotifyConfig, EventConfig.
struct ConfigSet * cs
Parent ConfigSet.
struct ConnAccount account
Account details: username, password, etc.
The envelope/body of an email.
struct Envelope * env
Envelope information.
struct Body * body
List of MIME parts.
LOFF_T offset
Where in the stream does this message begin?
struct ListHead userhdrs
user defined headers
char *const subject
Email's subject.
struct AddressList to
Email's 'To' list.
struct AddressList cc
Email's 'Cc' list.
struct AddressList bcc
Email's 'Bcc' list.
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
char * name
A short name for the Mailbox.
struct Account * account
Account that owns this Mailbox.
struct AccountArray accounts
All Accounts.
struct Notify * notify_resize
Window resize notifications handler.
char ** env
Private copy of the environment variables.
struct Notify * notify
Notifications handler.
struct Connection * conn
Connection to NNTP Server.
Nntp private Module data.
struct NntpAccountData * current_news_srv
Current NNTP news server.
int cs_subset_str_native_set(const struct ConfigSubset *sub, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
#define buf_mktemp_draft(buf)
enum UrlScheme url_check_scheme(const char *str)
Check the protocol of a URL.
@ U_MAILTO
Url is mailto://.