1053{
1054 struct Email *e = NULL;
1056 int rc = 1;
1057 bool repeat_error = false;
1062
1064
1065
1066 if (getegid() != getgid())
1067 {
1068 mutt_error(
"%s: I don't want to run with privileges!", (argc != 0) ? argv[0] :
"neomutt");
1069 goto main_exit;
1070 }
1071
1073
1076 goto main_curses;
1077
1079
1081 goto main_ok;
1082
1084
1085#ifdef USE_DEBUG_NOTIFY
1087#endif
1088
1091 goto main_exit;
1092
1094 goto main_exit;
1095
1099
1100
1103 {
1108 }
1109
1110
1111 if (
OptGui && !isatty(STDOUT_FILENO))
1112 goto main_curses;
1113
1114
1115
1117 {
1119 if (crc != 0)
1120 goto main_curses;
1121 }
1122
1123
1124
1126
1128 {
1129
1133 }
1134
1137
1138
1142 if (rc2 != 0)
1143 goto main_curses;
1144
1147
1148#ifdef USE_NOTMUCH
1150 if (c_virtual_spool_file)
1151 {
1152
1155 if (mp)
1158 }
1159#endif
1160
1162
1164
1165
1167
1170 {
1171 goto main_curses;
1172 }
1173
1175 goto main_ok;
1176
1178 {
1180 clear();
1184 }
1185
1186#ifdef USE_AUTOCRYPT
1187
1188
1190 if (c_autocrypt)
1192#endif
1193
1194
1197 {
1198 struct stat st = { 0 };
1200
1203 bool skip = false;
1204
1208 if (!skip && (stat(
buf_string(fpath), &st) == -1) && (errno == ENOENT))
1209 {
1210 char msg2[256] = { 0 };
1211 snprintf(msg2,
sizeof(msg2),
_(
"%s does not exist. Create it?"), c_folder);
1213 {
1214 if ((mkdir(
buf_string(fpath), 0700) == -1) && (errno != EEXIST))
1215 mutt_error(
_(
"Can't create %s: %s"), c_folder, strerror(errno));
1216 }
1217 }
1219 }
1220
1222
1226
1228 {
1232 rc = 0;
1233
1234
1236 repeat_error = true;
1237 goto main_curses;
1238 }
1240 {
1241 FILE *fp_in = NULL;
1242 FILE *fp_out = NULL;
1243 const char *infile = NULL;
1244 char *bodytext = NULL;
1245 const char *bodyfile = NULL;
1246 int rv = 0;
1247
1250
1253
1254 const char **cp = NULL;
1256 {
1258 }
1259
1261 {
1263 }
1264
1266 {
1268 {
1270 {
1273 goto main_curses;
1274 }
1275 }
1276 else
1277 {
1279 }
1280 }
1281
1285 {
1288 goto main_curses;
1289 }
1290
1292 {
1293
1296 }
1297
1299 {
1301 }
1303 {
1305 }
1306 else
1307 {
1309 }
1310
1311 if (infile || bodytext)
1312 {
1313
1314 if (infile)
1315 {
1317 {
1319 {
1322 goto main_curses;
1323 }
1324 fp_in = stdin;
1325 }
1326 else
1327 {
1331 if (!fp_in)
1332 {
1335 goto main_curses;
1336 }
1337 }
1338 }
1339
1341 {
1342
1343
1345 }
1346 else
1347 {
1348
1349
1350
1352
1354 if (!fp_out)
1355 {
1359 goto main_curses;
1360 }
1361 if (fp_in)
1362 {
1364 if (fp_in == stdin)
1366 else
1368 }
1369 else if (bodytext)
1370 {
1371 fputs(bodytext, fp_out);
1372 }
1374
1376 if (!fp_in)
1377 {
1380 goto main_curses;
1381 }
1382 }
1383
1384
1385
1386
1388 {
1390 struct stat st = { 0 };
1391
1393
1394
1395
1399 if (fstat(fileno(fp_in), &st) != 0)
1400 {
1404 goto main_curses;
1405 }
1407
1409 {
1414 goto main_curses;
1415 }
1416
1417
1422 {
1424 {
1425 if (c_resume_edited_draft_files)
1427
1431 }
1432 }
1433
1439
1442 }
1444 {
1445
1446
1448 }
1449 else
1450 {
1451
1453 }
1454
1456 }
1457
1459
1461 {
1463
1464 while (b && b->
next)
1466
1468 {
1469 if (b)
1470 {
1473 }
1474 else
1475 {
1478 }
1479 if (!b)
1480 {
1483 goto main_curses;
1484 }
1485 }
1486 }
1487
1489
1493
1495 {
1497 {
1498 if (truncate(
buf_string(expanded_infile), 0) == -1)
1499 {
1502 goto main_curses;
1503 }
1505 if (!fp_out)
1506 {
1509 goto main_curses;
1510 }
1511
1512
1513
1514 if (rv < 0)
1515 {
1521 }
1522
1525 c_crypt_protected_headers_read &&
1529 if (c_resume_edited_draft_files)
1530 fprintf(fp_out, "X-Mutt-Resume-Draft: 1\n");
1531 fputc('\n', fp_out);
1533 {
1536 goto main_curses;
1537 }
1539 }
1540
1542 }
1543
1544
1547
1549
1550 if (rv != 0)
1551 goto main_curses;
1552 }
1554 {
1555
1556
1558 goto main_curses;
1559 }
1560 else
1561 {
1564
1566 {
1571 {
1573 repeat_error = true;
1574 goto main_curses;
1575 }
1579 }
1581 {
1583 {
1588 goto main_curses;
1589 }
1591 {
1593 goto main_curses;
1594 }
1598 {
1599 goto main_ok;
1600 }
1601 }
1602
1604 {
1606 if (c_spool_file)
1607 {
1608
1610 if (m_desc)
1612 else
1614 }
1615 else if (c_folder)
1616 {
1618 }
1619
1620 }
1621
1623 {
1627 }
1628 else
1629 {
1631 }
1632
1635
1637 {
1638
1640 {
1641 case -1:
1643 goto main_curses;
1644 case 1:
1646 goto main_curses;
1647 }
1648 }
1649
1651
1658
1661
1662 repeat_error = true;
1666 {
1669
1672 repeat_error = false;
1673 }
1674 if (m || !explicit_folder)
1675 {
1678
1683
1687 repeat_error = false;
1688 }
1690#ifdef USE_SASL_CYRUS
1692#endif
1693#ifdef USE_SASL_GNU
1695#endif
1696#ifdef USE_AUTOCRYPT
1698#endif
1699
1700
1701 }
1702
1703main_ok:
1704 rc = 0;
1705main_curses:
1707
1710main_exit:
1712 {
1716 }
1717
1730
1732
1734
1736
1740
1742
1744
1755 return rc;
1756}
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.
#define ARRAY_FIRST(head)
Convenience method to get the first element.
void mutt_autocrypt_cleanup(void)
Shutdown Autocrypt.
int mutt_autocrypt_init(bool can_create)
Initialise Autocrypt.
#define MUTT_SEL_MAILBOX
Select a mailbox.
#define 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.
void colors_cleanup(void)
Cleanup all the colours.
@ MT_COLOR_NORMAL
Plain text.
@ 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.
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
@ MUTT_NOTMUCH
'Notmuch' (virtual) Mailbox type
@ 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 crypto_module_cleanup(void)
Clean up the crypto modules.
void crypt_cleanup(void)
Clean up backend.
void crypt_init(void)
Initialise the crypto backends.
void mutt_endwin(void)
Shutdown curses.
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.
void mutt_browser_cleanup(void)
Clean up working Buffers.
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 mutt_delete_hooks(enum CommandId id)
Delete matching hooks.
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)
Empty all the keyboard buffers.
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 -.
int log_disp_curses(time_t stamp, const char *file, int line, const char *function, enum LogLevel level, const char *format,...)
Display a log line in the message line - 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 mutt_gsasl_cleanup(void)
Shutdown GNU SASL library.
void mutt_hist_read_file(void)
Read the History from a file.
void mutt_hist_init(void)
Create a set of empty History ring buffers.
void mutt_hist_cleanup(void)
Free all the history lists.
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.
void km_cleanup(void)
Free the key maps.
void km_set_abort_key(void)
Parse the abort_key config string.
int log_dispatcher_t MuttLogger
@ LL_NOTIFY
Log of notifications.
void lua_cleanup(void)
Clean up Lua.
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 log_gui(void)
Log info about the GUI.
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 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.
static void init_keys(void)
Initialise the Keybindings.
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.
void log_queue_set_max_size(int size)
Set a upper limit for the queue length.
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.
const struct AttrColor * mutt_curses_set_color_by_id(enum ColorId cid)
Set the colour and attributes by the Colour ID.
void mutt_resize_screen(void)
Update NeoMutt's opinion about the window size.
@ 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.
#define MUTT_READONLY
Open in read-only mode.
#define MUTT_MAILBOX_CHECK_IMMEDIATE
Don't postpone the actual checking.
#define MUTT_OPEN_NO_FLAGS
No flags are set.
uint8_t CheckStatsFlags
Flags for mutt_mailbox_check.
struct MailboxArray neomutt_mailboxes_get(struct NeoMutt *n, enum MailboxType type)
Get an Array of matching Mailboxes.
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.
struct NeoMutt * neomutt_new(void)
Create the main NeoMutt object.
void neomutt_free(struct NeoMutt **ptr)
Free a NeoMutt.
@ 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 * CurrentNewsSrv
Current NNTP news server.
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_cleanup(void)
Free all the default Windows.
void rootwin_new(void)
Create the default Windows.
void mutt_sasl_cleanup(void)
Invoke when processing is complete.
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.
#define SEND_BATCH
Send email in batch mode (without user interaction)
#define SEND_NO_FREE_HEADER
Used by the -E flag.
#define SEND_DRAFT_FILE
Used by the -H flag.
uint32_t SendFlags
Flags for mutt_send_message(), e.g. SEND_REPLY.
#define SEND_POSTPONED
Recall a postponed email.
#define SEND_CONSUMED_STDIN
stdin has been read; don't read it twice
#define SEND_NO_FLAGS
No flags are set.
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 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.
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.
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.
bool TsSupported
Terminal Setting is supported.
bool mutt_ts_capability(void)
Check terminal capabilities.
#define buf_mktemp_draft(buf)
enum UrlScheme url_check_scheme(const char *str)
Check the protocol of a URL.
@ U_MAILTO
Url is mailto://.