NeoMutt  2025-12-11-435-g4ac674
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
main.c File Reference

NeoMutt Email Client. More...

#include "config.h"
#include <errno.h>
#include <limits.h>
#include <pwd.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/utsname.h>
#include <time.h>
#include <unistd.h>
#include "mutt/lib.h"
#include "address/lib.h"
#include "config/lib.h"
#include "email/lib.h"
#include "core/lib.h"
#include "alias/lib.h"
#include "conn/lib.h"
#include "gui/lib.h"
#include "mutt.h"
#include "attach/lib.h"
#include "browser/lib.h"
#include "cli/lib.h"
#include "color/lib.h"
#include "commands/lib.h"
#include "compose/lib.h"
#include "editor/lib.h"
#include "history/lib.h"
#include "hooks/lib.h"
#include "imap/lib.h"
#include "index/lib.h"
#include "key/lib.h"
#include "lua/lib.h"
#include "menu/lib.h"
#include "ncrypt/lib.h"
#include "nntp/lib.h"
#include "pager/lib.h"
#include "parse/lib.h"
#include "pop/lib.h"
#include "postpone/lib.h"
#include "question/lib.h"
#include "send/lib.h"
#include "sidebar/lib.h"
#include "external.h"
#include "globals.h"
#include "mutt_logging.h"
#include "mutt_mailbox.h"
#include "muttlib.h"
#include "mx.h"
#include "nntp/adata.h"
#include "version.h"
#include <libintl.h>
#include "autocrypt/lib.h"

Go to the source code of this file.

Macros

#define GNULIB_defined_setlocale
 

Functions

void show_cli (enum HelpMode mode, bool use_color)
 Show Instructions on how to run NeoMutt.
 
static int execute_commands (struct StringArray *sa)
 Execute a set of NeoMutt commands.
 
static char * find_cfg (const char *home, const char *xdg_cfg_home)
 Find a config file.
 
static char * getmailname (void)
 Try to retrieve the FQDN from mailname files.
 
static bool get_hostname (struct ConfigSet *cs)
 Find the Fully-Qualified Domain Name.
 
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 int get_elem_queries (struct StringArray *queries, struct HashElemArray *hea)
 Lookup the HashElems for a set of queries.
 
static void init_keys (void)
 Initialise the Keybindings.
 
static int start_curses (void)
 Start the Curses UI.
 
static bool get_user_info (struct ConfigSet *cs)
 Find the user's name, home and shell.
 
static void log_translation (void)
 Log the translation being used.
 
static void log_gui (void)
 Log info about the GUI.
 
static int main_timeout_observer (struct NotifyCallback *nc)
 Notification that a timeout has occurred - Implements observer_t -.
 
static bool show_help (struct CliHelp *help)
 Show the Help.
 
static bool init_logging (struct CliShared *shared, struct ConfigSet *cs)
 Initialise the Logging.
 
static void init_nntp (struct Buffer *server, struct ConfigSet *cs)
 Initialise the NNTP config.
 
static bool dump_info (struct CliInfo *ci, struct ConfigSet *cs)
 Show config info.
 
int main (int argc, char *argv[], char *envp[])
 Start NeoMutt.
 

Variables

bool StartupComplete = false
 When the config has been read.
 
const struct Module ModuleMain
 Module for the Main library.
 
const struct Module ModuleAddress
 Module for the Address library.
 
const struct Module ModuleAlias
 Module for the Alias library.
 
const struct Module ModuleAttach
 Module for the Attach library.
 
const struct Module ModuleAutocrypt
 Module for the Autocrypt library.
 
const struct Module ModuleBcache
 Module for the Bcache library.
 
const struct Module ModuleBrowser
 Module for the Browser library.
 
const struct Module ModuleColor
 Module for the Color library.
 
const struct Module ModuleCommands
 Module for the Commands library.
 
const struct Module ModuleComplete
 Module for the Complete library.
 
const struct Module ModuleCompmbox
 Module for the Compmbox library.
 
const struct Module ModuleCompose
 Module for the Compose library.
 
const struct Module ModuleCompress
 Module for the Compress library.
 
const struct Module ModuleConfig
 Module for the Config library.
 
const struct Module ModuleConn
 Module for the Conn library.
 
const struct Module ModuleConvert
 Module for the Convert library.
 
const struct Module ModuleCore
 Module for the Core library.
 
const struct Module ModuleEditor
 Module for the Editor library.
 
const struct Module ModuleEmail
 Module for the Email library.
 
const struct Module ModuleEnvelope
 Module for the Envelope library.
 
const struct Module ModuleExpando
 Module for the Expando library.
 
const struct Module ModuleGui
 Module for the Gui library.
 
const struct Module ModuleHcache
 Module for the Hcache library.
 
const struct Module ModuleHelpbar
 Module for the Helpbar library.
 
const struct Module ModuleHistory
 Module for the History library.
 
const struct Module ModuleHooks
 Module for the Hooks library.
 
const struct Module ModuleImap
 Module for the Imap library.
 
const struct Module ModuleIndex
 Module for the Index library.
 
const struct Module ModuleKey
 Module for the Key library.
 
const struct Module ModuleLua
 Module for the Lua library.
 
const struct Module ModuleMaildir
 Module for the Maildir library.
 
const struct Module ModuleMbox
 Module for the Mbox library.
 
const struct Module ModuleMenu
 Module for the Menu library.
 
const struct Module ModuleMh
 Module for the Mh library.
 
const struct Module ModuleMutt
 Module for the Mutt library.
 
const struct Module ModuleNcrypt
 Module for the Ncrypt library.
 
const struct Module ModuleNntp
 Module for the Nntp library.
 
const struct Module ModuleNotmuch
 Module for the Notmuch library.
 
const struct Module ModulePager
 Module for the Pager library.
 
const struct Module ModuleParse
 Module for the Parse library.
 
const struct Module ModulePattern
 Module for the Pattern library.
 
const struct Module ModulePop
 Module for the Pop library.
 
const struct Module ModulePostpone
 Module for the Postpone library.
 
const struct Module ModuleProgress
 Module for the Progress library.
 
const struct Module ModuleQuestion
 Module for the Question library.
 
const struct Module ModuleSend
 Module for the Send library.
 
const struct Module ModuleSidebar
 Module for the Sidebar library.
 
const struct Module ModuleStore
 Module for the Store library.
 
static const struct ModuleModules []
 All the library Modules.
 

Detailed Description

NeoMutt Email Client.

Authors
  • Michael R. Elkins
  • Thomas Roessler
  • g10 Code GmbH
  • Richard Russon
  • Pietro Cerutti
  • R Primus
  • Dennis Schön
  • Alejandro Colomar

This program 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 this program. If not, see http://www.gnu.org/licenses/.

Definition in file main.c.

Macro Definition Documentation

◆ GNULIB_defined_setlocale

#define GNULIB_defined_setlocale

Definition at line 97 of file main.c.

Function Documentation

◆ show_cli()

void show_cli ( enum HelpMode mode,
bool use_color )

Show Instructions on how to run NeoMutt.

Parameters
modeDetails, e.g. HM_SHARED
use_colorHighlight parts of the text

Definition at line 336 of file usage.c.

337{
338 if (use_color)
339 printf("\033[38;5;255mNeoMutt %s\033[0m\n\n", mutt_make_version());
340 else
341 printf("NeoMutt %s\n\n", mutt_make_version());
342
343 switch (mode)
344 {
345 case HM_NONE:
346 {
347 show_cli_overview(use_color);
348 break;
349 }
350 case HM_SHARED:
351 {
352 show_cli_shared(use_color);
353 break;
354 }
355 case HM_HELP:
356 {
357 show_cli_help(use_color);
358 break;
359 }
360 case HM_INFO:
361 {
362 show_cli_info(use_color);
363 break;
364 }
365 case HM_SEND:
366 {
367 show_cli_send(use_color);
368 break;
369 }
370 case HM_TUI:
371 {
372 show_cli_tui(use_color);
373 break;
374 }
375 case HM_ALL:
376 {
377 printf("------------------------------------------------------------\n");
378 show_cli_shared(use_color);
379 printf("\n------------------------------------------------------------\n");
380 show_cli_help(use_color);
381 printf("\n------------------------------------------------------------\n");
382 show_cli_info(use_color);
383 printf("\n------------------------------------------------------------\n");
384 show_cli_send(use_color);
385 printf("\n------------------------------------------------------------\n");
386 show_cli_tui(use_color);
387 printf("\n------------------------------------------------------------\n");
388 break;
389 }
390 }
391}
@ HM_SEND
Help about sending email options.
Definition objects.h:38
@ HM_ALL
Help about all options.
Definition objects.h:40
@ HM_HELP
Help about help.
Definition objects.h:36
@ HM_INFO
Help about info options.
Definition objects.h:37
@ HM_TUI
Help about starting the tui options.
Definition objects.h:39
@ HM_NONE
No extra help.
Definition objects.h:34
@ HM_SHARED
Help about shared config options.
Definition objects.h:35
static void show_cli_tui(bool use_color)
Show Command Line Help for Tui.
Definition usage.c:294
static void show_cli_shared(bool use_color)
Show Command Line Help for Shared.
Definition usage.c:128
static void show_cli_info(bool use_color)
Show Command Line Help for Info.
Definition usage.c:211
static void show_cli_overview(bool use_color)
Display NeoMutt command line.
Definition usage.c:54
static void show_cli_help(bool use_color)
Show Command Line Help for Help.
Definition usage.c:184
static void show_cli_send(bool use_color)
Show Command Line Help for Send.
Definition usage.c:250
const char * mutt_make_version(void)
Generate the NeoMutt version string.
Definition version.c:293
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ execute_commands()

static int execute_commands ( struct StringArray * sa)
static

Execute a set of NeoMutt commands.

Parameters
saArray of command strings
Return values
0Success, all the commands succeeded
-1Error

Definition at line 225 of file main.c.

226{
227 int rc = 0;
228 struct Buffer *line = buf_pool_get();
229 struct ParseContext *pc = parse_context_new();
230 struct ParseError *pe = parse_error_new();
231
232 const char **cp = NULL;
233 ARRAY_FOREACH(cp, sa)
234 {
235 buf_strcpy(line, *cp);
236 enum CommandResult rc2 = parse_rc_line(line, pc, pe);
237 if (rc2 == MUTT_CMD_ERROR)
238 mutt_error(_("Error in command line: %s"), buf_string(pe->message));
239 else if (rc2 == MUTT_CMD_WARNING)
240 mutt_warning(_("Warning in command line: %s"), buf_string(pe->message));
241
242 if ((rc2 == MUTT_CMD_ERROR) || (rc2 == MUTT_CMD_WARNING))
243 {
244 rc = -1;
245 goto done;
246 }
247 }
248
249done:
250 buf_pool_release(&line);
252 parse_error_free(&pe);
253
254 return rc;
255}
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition array.h:223
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition buffer.c:395
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
CommandResult
Error codes for command_t parse functions.
Definition command.h:37
@ MUTT_CMD_ERROR
Error: Can't help the user.
Definition command.h:38
@ MUTT_CMD_WARNING
Warning: Help given to the user.
Definition command.h:39
#define mutt_warning(...)
Definition logging2.h:92
#define mutt_error(...)
Definition logging2.h:94
#define _(a)
Definition message.h:28
void parse_context_free(struct ParseContext **pptr)
Free a ParseContext.
Definition pcontext.c:48
struct ParseContext * parse_context_new(void)
Create a new ParseContext.
Definition pcontext.c:37
void parse_error_free(struct ParseError **pptr)
Free a ParseError.
Definition perror.c:50
struct ParseError * parse_error_new(void)
Create a new ParseError.
Definition perror.c:37
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
enum CommandResult parse_rc_line(struct Buffer *line, struct ParseContext *pc, struct ParseError *pe)
Parse a line of user config.
Definition rc.c:45
String manipulation buffer.
Definition buffer.h:36
Context for config parsing (history/backtrace)
Definition pcontext.h:34
Detailed error information from config parsing.
Definition perror.h:34
struct Buffer * message
Error message.
Definition perror.h:35
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ find_cfg()

static char * find_cfg ( const char * home,
const char * xdg_cfg_home )
static

Find a config file.

Parameters
homeUser's home directory
xdg_cfg_homeXDG home directory
Return values
ptrSuccess, first matching directory
NULLError, no matching directories

Definition at line 264 of file main.c.

265{
266 const char *names[] = {
267 "neomuttrc",
268 "muttrc",
269 NULL,
270 };
271
272 const char *locations[][2] = {
273 { xdg_cfg_home, "neomutt/" },
274 { xdg_cfg_home, "mutt/" },
275 { home, ".neomutt/" },
276 { home, ".mutt/" },
277 { home, "." },
278 { NULL, NULL },
279 };
280
281 struct Buffer *buf = buf_pool_get();
282 char *cfg = NULL;
283
284 for (int i = 0; locations[i][0] || locations[i][1]; i++)
285 {
286 if (!locations[i][0])
287 continue;
288
289 for (int j = 0; names[j]; j++)
290 {
291 buf_printf(buf, "%s/%s%s", locations[i][0], locations[i][1], names[j]);
292 if (access(buf_string(buf), F_OK) == 0)
293 {
294 cfg = buf_strdup(buf);
295 goto done;
296 }
297 }
298 }
299
300done:
301 buf_pool_release(&buf);
302 return cfg;
303}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition buffer.c:161
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
Definition buffer.c:571
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getmailname()

static char * getmailname ( void )
static

Try to retrieve the FQDN from mailname files.

Return values
ptrHeap allocated string with the FQDN
NULLNo valid mailname file could be read

Definition at line 311 of file main.c.

312{
313 char *mailname = NULL;
314 static const char *mn_files[] = { "/etc/mailname", "/etc/mail/mailname" };
315
316 for (size_t i = 0; i < countof(mn_files); i++)
317 {
318 FILE *fp = mutt_file_fopen(mn_files[i], "r");
319 if (!fp)
320 continue;
321
322 size_t len = 0;
323 mailname = mutt_file_read_line(NULL, &len, fp, NULL, MUTT_RL_NO_FLAGS);
324 mutt_file_fclose(&fp);
325 if (mailname && *mailname)
326 break;
327
328 FREE(&mailname);
329 }
330
331 return mailname;
332}
char * mutt_file_read_line(char *line, size_t *size, FILE *fp, int *line_num, ReadLineFlags flags)
Read a line from a file.
Definition file.c:682
#define mutt_file_fclose(FP)
Definition file.h:139
#define mutt_file_fopen(PATH, MODE)
Definition file.h:138
#define MUTT_RL_NO_FLAGS
No flags are set.
Definition file.h:40
#define countof(x)
Definition memory.h:49
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_hostname()

static bool get_hostname ( struct ConfigSet * cs)
static

Find the Fully-Qualified Domain Name.

Parameters
csConfig Set
Return values
trueSuccess
falseError, failed to find any name

Use several methods to try to find the Fully-Qualified domain name of this host. If the user has already configured a hostname, this function will use it.

Definition at line 344 of file main.c.

345{
346 const char *short_host = NULL;
347 struct utsname utsname = { 0 };
348
349 const char *const c_hostname = cs_subset_string(NeoMutt->sub, "hostname");
350 if (c_hostname)
351 {
352 short_host = c_hostname;
353 }
354 else
355 {
356 /* The call to uname() shouldn't fail, but if it does, the system is horribly
357 * broken, and the system's networking configuration is in an unreliable
358 * state. We should bail. */
359 if ((uname(&utsname)) == -1)
360 {
361 mutt_perror(_("unable to determine nodename via uname()"));
362 return false; // TEST09: can't test
363 }
364
365 short_host = utsname.nodename;
366 }
367
368 /* some systems report the FQDN instead of just the hostname */
369 char *dot = strchr(short_host, '.');
370 if (dot)
371 ShortHostname = mutt_strn_dup(short_host, dot - short_host);
372 else
373 ShortHostname = mutt_str_dup(short_host);
374
375 // All the code paths from here alloc memory for the fqdn
376 char *fqdn = mutt_str_dup(c_hostname);
377 if (!fqdn)
378 {
379 mutt_debug(LL_DEBUG1, "Setting $hostname\n");
380 /* now get FQDN. Use configured domain first, DNS next, then uname */
381#ifdef DOMAIN
382 /* we have a compile-time domain name, use that for `$hostname` */
383 mutt_str_asprintf(&fqdn, "%s.%s", NONULL(ShortHostname), DOMAIN);
384#else
385 fqdn = getmailname();
386 if (!fqdn)
387 {
388 struct Buffer *domain = buf_pool_get();
389 if (getdnsdomainname(domain) == 0)
390 {
391 mutt_str_asprintf(&fqdn, "%s.%s", NONULL(ShortHostname), buf_string(domain));
392 }
393 else
394 {
395 /* DNS failed, use the nodename. Whether or not the nodename had a '.'
396 * in it, we can use the nodename as the FQDN. On hosts where DNS is
397 * not being used, e.g. small network that relies on hosts files, a
398 * short host name is all that is required for SMTP to work correctly.
399 * It could be wrong, but we've done the best we can, at this point the
400 * onus is on the user to provide the correct hostname if the nodename
401 * won't work in their network. */
402 fqdn = mutt_str_dup(utsname.nodename);
403 }
404 buf_pool_release(&domain);
405 mutt_debug(LL_DEBUG1, "Hostname: %s\n", NONULL(fqdn));
406 }
407#endif
408 }
409
410 if (fqdn)
411 {
412 config_str_set_initial(cs, "hostname", fqdn);
413 FREE(&fqdn);
414 }
415
416 return true;
417}
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition helpers.c:291
bool config_str_set_initial(struct ConfigSet *cs, const char *name, const char *value)
Set the initial value of a Config Option.
Definition helpers.c:332
int getdnsdomainname(struct Buffer *result)
Lookup the host's name using DNS.
Definition getdomain.c:124
char * ShortHostname
Short version of the hostname.
Definition globals.c:36
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
#define mutt_perror(...)
Definition logging2.h:95
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
static char * getmailname(void)
Try to retrieve the FQDN from mailname files.
Definition main.c:311
char * mutt_strn_dup(const char *begin, size_t len)
Duplicate a sub-string.
Definition string.c:384
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition string.c:257
int mutt_str_asprintf(char **strp, const char *fmt,...)
Definition string.c:805
#define NONULL(x)
Definition string2.h:44
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_init()

static int mutt_init ( struct ConfigSet * cs,
struct Buffer * dlevel,
struct Buffer * dfile,
bool skip_sys_rc,
struct StringArray * user_files,
struct StringArray * commands )
static

Initialise NeoMutt.

Parameters
csConfig Set
dlevelCommand line debug level
dfileCommand line debug file
skip_sys_rcIf true, don't read the system config file
user_filesArray of user config files
commandsArray of config commands to execute
Return values
0Success
1Error

Definition at line 430 of file main.c.

433{
434 bool need_pause = false;
435 int rc = 1;
436 struct Buffer *buf = buf_pool_get();
437 struct ParseContext *pc = parse_context_new();
438 struct ParseError *pe = parse_error_new();
439 const char **cp = NULL;
440
441#ifdef NEOMUTT_DIRECT_COLORS
442 /* Test if we run in a terminal which supports direct colours.
443 *
444 * The user/terminal can indicate their capability independent of the
445 * terminfo file by setting the COLORTERM environment variable to "truecolor"
446 * or "24bit" (case sensitive).
447 *
448 * Note: This is to test is less about whether the terminal understands
449 * direct color commands but more about whether ncurses believes it can send
450 * them to the terminal, e.g. ncurses ignores COLORTERM.
451 */
452 if (COLORS == 16777216) // 2^24
453 {
454 /* Ncurses believes the Terminal supports it check the environment variable
455 * to respect the user's choice */
456 const char *env_colorterm = mutt_str_getenv("COLORTERM");
457 if (env_colorterm && (mutt_str_equal(env_colorterm, "truecolor") ||
458 mutt_str_equal(env_colorterm, "24bit")))
459 {
460 config_str_set_initial(cs, "color_directcolor", "yes");
461 }
462 }
463#endif
464
465 /* "$spool_file" precedence: config file, environment */
466 const char *p = mutt_str_getenv("MAIL");
467 if (!p)
468 p = mutt_str_getenv("MAILDIR");
469 if (!p)
470 {
471#ifdef HOMESPOOL
472 buf_concat_path(buf, NONULL(NeoMutt->home_dir), MAILPATH);
473#else
474 buf_concat_path(buf, MAILPATH, NONULL(NeoMutt->username));
475#endif
476 p = buf_string(buf);
477 }
478 config_str_set_initial(cs, "spool_file", p);
479
480 p = mutt_str_getenv("REPLYTO");
481 if (p)
482 {
483 buf_printf(buf, "Reply-To: %s", p);
484 buf_seek(buf, 0);
485
487 ASSERT(cmd);
488 parse_my_header(cmd, buf, pc, pe);
489 }
490
491 p = mutt_str_getenv("EMAIL");
492 if (p)
493 config_str_set_initial(cs, "from", p);
494
495 /* "$mailcap_path" precedence: config file, environment, code */
496 struct Buffer *mc = buf_pool_get();
497 struct Slist *sl_mc = NULL;
498 const char *env_mc = mutt_str_getenv("MAILCAPS");
499 if (env_mc)
500 {
501 sl_mc = slist_parse(env_mc, D_SLIST_SEP_COLON);
502 }
503 else
504 {
505 cs_str_initial_get(cs, "mailcap_path", mc);
507 buf_reset(mc);
508 }
509 slist_to_buffer(sl_mc, mc);
510 config_str_set_initial(cs, "mailcap_path", buf_string(mc));
511 slist_free(&sl_mc);
512 buf_pool_release(&mc);
513
514 /* "$tmp_dir" precedence: config file, environment, code */
515 const char *env_tmp = mutt_str_getenv("TMPDIR");
516 if (env_tmp)
517 config_str_set_initial(cs, "tmp_dir", env_tmp);
518
519 /* "$visual", "$editor" precedence: config file, environment, code */
520 const char *env_ed = mutt_str_getenv("VISUAL");
521 if (!env_ed)
522 env_ed = mutt_str_getenv("EDITOR");
523 if (!env_ed)
524 env_ed = "vi";
525 config_str_set_initial(cs, "editor", env_ed);
526
527 const char *charset = mutt_ch_get_langinfo_charset();
528 config_str_set_initial(cs, "charset", charset);
529 mutt_ch_set_charset(charset);
530 FREE(&charset);
531
532 char name[256] = { 0 };
533 const char *c_real_name = cs_subset_string(NeoMutt->sub, "real_name");
534 if (!c_real_name)
535 {
536 struct passwd *pw = getpwuid(getuid());
537 if (pw)
538 {
539 c_real_name = mutt_gecos_name(name, sizeof(name), pw);
540 }
541 }
542 config_str_set_initial(cs, "real_name", c_real_name);
543
544 if (ARRAY_EMPTY(user_files))
545 {
546 const char *xdg_cfg_home = mutt_str_getenv("XDG_CONFIG_HOME");
547
548 if (!xdg_cfg_home && NeoMutt->home_dir)
549 {
550 buf_printf(buf, "%s/.config", NeoMutt->home_dir);
551 xdg_cfg_home = buf_string(buf);
552 }
553
554 char *config = find_cfg(NeoMutt->home_dir, xdg_cfg_home);
555 if (config)
556 {
557 ARRAY_ADD(user_files, config);
558 }
559 }
560 else
561 {
562 ARRAY_FOREACH(cp, user_files)
563 {
564 buf_strcpy(buf, *cp);
565 FREE(cp);
566 expand_path(buf, false);
567 ARRAY_SET(user_files, ARRAY_FOREACH_IDX_cp, buf_strdup(buf));
568 if (access(buf_string(buf), F_OK))
569 {
570 mutt_perror("%s", buf_string(buf));
571 goto done; // TEST10: neomutt -F missing
572 }
573 }
574 }
575
576 ARRAY_FOREACH(cp, user_files)
577 {
578 if (*cp && !mutt_str_equal(*cp, "/dev/null"))
579 {
580 cs_str_string_set(cs, "alias_file", *cp, NULL);
581 break;
582 }
583 }
584
585 /* Process the global rc file if it exists and the user hasn't explicitly
586 * requested not to via "-n". */
587 if (!skip_sys_rc)
588 {
589 do
590 {
592 break;
593
594 buf_printf(buf, "%s/neomuttrc", SYSCONFDIR);
595 if (access(buf_string(buf), F_OK) == 0)
596 break;
597
598 buf_printf(buf, "%s/Muttrc", SYSCONFDIR);
599 if (access(buf_string(buf), F_OK) == 0)
600 break;
601
602 buf_printf(buf, "%s/neomuttrc", PKGDATADIR);
603 if (access(buf_string(buf), F_OK) == 0)
604 break;
605
606 buf_printf(buf, "%s/Muttrc", PKGDATADIR);
607 } while (false);
608
609 if (access(buf_string(buf), F_OK) == 0)
610 {
611 if (source_rc(buf_string(buf), pc, pe) != 0)
612 {
613 mutt_error("%s", buf_string(pe->message));
614 need_pause = true; // TEST11: neomutt (error in /etc/neomuttrc)
615 }
616 }
617 }
618
619 /* Read the user's initialization file. */
620 ARRAY_FOREACH(cp, user_files)
621 {
622 if (*cp)
623 {
624 if (source_rc(*cp, pc, pe) != 0)
625 {
626 mutt_error("%s", buf_string(pe->message));
627 need_pause = true; // TEST12: neomutt (error in ~/.neomuttrc)
628 }
629 }
630 }
631
632 if (execute_commands(commands) != 0)
633 need_pause = true; // TEST13: neomutt -e broken
634
635 if (!get_hostname(cs))
636 goto done;
637
638 /* The command line overrides the config */
639 if (!buf_is_empty(dlevel))
640 cs_str_reset(cs, "debug_level", NULL);
641 if (!buf_is_empty(dfile))
642 cs_str_reset(cs, "debug_file", NULL);
643
644 if (mutt_log_start() < 0)
645 {
646 mutt_perror("log file");
647 goto done;
648 }
649
650 if (need_pause && OptGui)
651 {
653 if (mutt_any_key_to_continue(NULL) == 'q')
654 goto done; // TEST14: neomutt -e broken (press 'q')
655 }
656
657 const char *const c_tmp_dir = cs_subset_path(NeoMutt->sub, "tmp_dir");
658 if (mutt_file_mkdir(c_tmp_dir, S_IRWXU) < 0)
659 {
660 mutt_error(_("Can't create %s: %s"), c_tmp_dir, strerror(errno));
661 goto done;
662 }
663
664 rc = 0;
665
666done:
668 parse_error_free(&pe);
669 buf_pool_release(&buf);
670 return rc;
671}
#define ARRAY_SET(head, idx, elem)
Set an element in the array.
Definition array.h:123
#define ARRAY_ADD(head, elem)
Add an element at the end of the array.
Definition array.h:157
#define ARRAY_EMPTY(head)
Check if an array is empty.
Definition array.h:74
void buf_seek(struct Buffer *buf, size_t offset)
Set current read/write position to offset from beginning.
Definition buffer.c:622
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition buffer.c:76
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
Definition buffer.c:291
size_t buf_concat_path(struct Buffer *buf, const char *dir, const char *fname)
Join a directory name and a filename.
Definition buffer.c:509
@ CMD_MY_HEADER
:my-header
Definition command.h:97
const struct Command * command_find_by_id(const struct CommandArray *ca, enum CommandId id)
Find a NeoMutt Command by its CommandId.
Definition commands.c:146
const char * cs_subset_path(const struct ConfigSubset *sub, const char *name)
Get a path config item by name.
Definition helpers.c:168
int cs_str_initial_get(const struct ConfigSet *cs, const char *name, struct Buffer *result)
Get the initial, or parent, value of a config item.
Definition set.c:594
int cs_str_reset(const struct ConfigSet *cs, const char *name, struct Buffer *err)
Reset a config item to its initial value.
Definition set.c:447
int cs_str_string_set(const struct ConfigSet *cs, const char *name, const char *value, struct Buffer *err)
Set a config item by string.
Definition set.c:669
int mutt_any_key_to_continue(const char *s)
Prompt the user to 'press any key' and wait.
Definition curs_lib.c:173
int mutt_file_mkdir(const char *path, mode_t mode)
Recursively create directories.
Definition file.c:848
bool OptGui
(pseudo) when the gui (and curses) are started
Definition globals.c:48
enum CommandResult parse_my_header(const struct Command *cmd, struct Buffer *line, const struct ParseContext *pc, struct ParseError *pe)
Parse the 'my-header' command - Implements Command::parse() -.
Definition my_header.c:52
int log_disp_terminal(time_t stamp, const char *file, int line, const char *function, enum LogLevel level, const char *format,...)
Save a log line to the terminal - Implements log_dispatcher_t -.
Definition logging.c:427
static char * find_cfg(const char *home, const char *xdg_cfg_home)
Find a config file.
Definition main.c:264
static bool get_hostname(struct ConfigSet *cs)
Find the Fully-Qualified Domain Name.
Definition main.c:344
static int execute_commands(struct StringArray *sa)
Execute a set of NeoMutt commands.
Definition main.c:225
char * mutt_ch_get_langinfo_charset(void)
Get the user's choice of character set.
Definition charset.c:472
void mutt_ch_set_charset(const char *charset)
Update the records for a new character set.
Definition charset.c:1061
void log_queue_flush(log_dispatcher_t disp)
Replay the log queue.
Definition logging.c:353
struct Slist * slist_parse(const char *str, uint32_t flags)
Parse a list of strings into a list.
Definition slist.c:177
void slist_free(struct Slist **ptr)
Free an Slist object.
Definition slist.c:124
int slist_to_buffer(const struct Slist *list, struct Buffer *buf)
Export an Slist to a Buffer.
Definition slist.c:269
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:662
const char * mutt_str_getenv(const char *name)
Get an environment variable.
Definition string.c:728
@ XDG_CONFIG_DIRS
XDG system dir: /etc/xdg.
Definition mutt.h:68
int mutt_set_xdg_path(enum XdgType type, struct Buffer *buf)
Find an XDG path or its fallback.
Definition muttlib.c:827
int mutt_log_start(void)
Enable file logging.
char * mutt_gecos_name(char *dest, size_t destlen, struct passwd *pw)
Lookup a user's real name in /etc/passwd.
Definition muttlib.c:320
void expand_path(struct Buffer *buf, bool regex)
Create the canonical path.
Definition muttlib.c:121
#define ASSERT(COND)
Definition signal2.h:59
int source_rc(const char *rcfile_path, struct ParseContext *pc, struct ParseError *pe)
Read an initialization file.
Definition source.c:67
struct CommandArray commands
NeoMutt commands.
Definition neomutt.h:53
char * username
User's login name.
Definition neomutt.h:57
char * home_dir
User's home directory.
Definition neomutt.h:56
String list.
Definition slist.h:37
#define D_SLIST_SEP_COLON
Slist items are colon-separated.
Definition types.h:112
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_elem_queries()

static int get_elem_queries ( struct StringArray * queries,
struct HashElemArray * hea )
static

Lookup the HashElems for a set of queries.

Parameters
[in]queriesArray of query strings
[out]heaArray for Config HashElems
Return values
0Success, all queries exist
1Error

Definition at line 680 of file main.c.

681{
682 int rc = 0;
683 const char **cp = NULL;
684 ARRAY_FOREACH(cp, queries)
685 {
686 struct HashElem *he = cs_subset_lookup(NeoMutt->sub, *cp);
687 if (!he)
688 {
689 mutt_warning(_("Unknown option %s"), *cp);
690 rc = 1;
691 continue;
692 }
693
694 if (he->type & D_INTERNAL_DEPRECATED)
695 {
696 mutt_warning(_("Option %s is deprecated"), *cp);
697 rc = 1;
698 continue;
699 }
700
701 ARRAY_ADD(hea, he);
702 }
703
704 return rc; // TEST16: neomutt -Q charset
705}
The item stored in a Hash Table.
Definition hash.h:44
int type
Type of data stored in Hash Table, e.g. DT_STRING.
Definition hash.h:45
struct HashElem * cs_subset_lookup(const struct ConfigSubset *sub, const char *name)
Find an inherited config item.
Definition subset.c:193
#define D_INTERNAL_DEPRECATED
Config item shouldn't be used any more.
Definition types.h:88
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_keys()

static void init_keys ( void )
static

Initialise the Keybindings.

Definition at line 710 of file main.c.

711{
712 km_init();
713
714 struct SubMenu *sm_generic = generic_init_keys();
715
716 alias_init_keys(sm_generic);
717 attach_init_keys(sm_generic);
718#ifdef USE_AUTOCRYPT
719 autocrypt_init_keys(sm_generic);
720#endif
721 browser_init_keys(sm_generic);
722 compose_init_keys(sm_generic);
723 editor_init_keys(sm_generic);
724 sidebar_init_keys(sm_generic);
725 index_init_keys(sm_generic);
726 pager_init_keys(sm_generic);
727 pgp_init_keys(sm_generic);
728 postponed_init_keys(sm_generic);
729
730 km_sort();
731}
void alias_init_keys(struct SubMenu *sm_generic)
Initialise the Alias Keybindings - Implements ::init_keys_api.
Definition functions.c:128
void attach_init_keys(struct SubMenu *sm_generic)
Initialise the Attach Keybindings - Implements ::init_keys_api.
Definition functions.c:128
void autocrypt_init_keys(struct SubMenu *sm_generic)
Initialise the Autocrypt Keybindings - Implements ::init_keys_api.
Definition functions.c:77
void browser_init_keys(struct SubMenu *sm_generic)
Initialise the Browser Keybindings - Implements ::init_keys_api.
Definition functions.c:130
void compose_init_keys(struct SubMenu *sm_generic)
Initialise the Compose Keybindings - Implements ::init_keys_api.
Definition functions.c:211
void editor_init_keys(struct SubMenu *sm_generic)
Initialise the Editor Keybindings - Implements ::init_keys_api.
Definition functions.c:131
struct SubMenu * generic_init_keys(void)
Initialise the Generic Keybindings.
Definition functions.c:195
void index_init_keys(struct SubMenu *sm_generic)
Initialise the Index Keybindings - Implements ::init_keys_api.
Definition functions.c:322
void km_init(void)
Initialise all the menu keybindings.
Definition init.c:170
void km_sort(void)
Sort all the menu keybindings.
Definition init.c:192
void pgp_init_keys(struct SubMenu *sm_generic)
Initialise the PGP Keybindings - Implements ::init_keys_api.
Definition functions.c:91
void pager_init_keys(struct SubMenu *sm_generic)
Initialise the Pager Keybindings - Implements ::init_keys_api.
Definition functions.c:321
void postponed_init_keys(struct SubMenu *sm_generic)
Initialise the Postponed Keybindings - Implements ::init_keys_api.
Definition functions.c:70
void sidebar_init_keys(struct SubMenu *sm_generic)
Initialise the Sidebar Keybindings - Implements ::init_keys_api.
Definition functions.c:73
Collection of related functions.
Definition menu.h:68
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ start_curses()

static int start_curses ( void )
static

Start the Curses UI.

Return values
0Success
1Failure

Definition at line 738 of file main.c.

739{
740 /* should come before initscr() so that ncurses 4.2 doesn't try to install
741 * its own SIGWINCH handler */
743
744 if (!initscr())
745 {
746 mutt_error(_("Error initializing terminal"));
747 return 1;
748 }
749
750 colors_init();
751 keypad(stdscr, true);
752 cbreak();
753 noecho();
754 nonl();
755 typeahead(-1); /* simulate smooth scrolling */
756 meta(stdscr, true);
758 /* Now that curses is set up, we drop back to normal screen mode.
759 * This simplifies displaying error messages to the user.
760 * The first call to refresh() will swap us back to curses screen mode. */
761 endwin();
762 return 0;
763}
void colors_init(void)
Initialize colours.
Definition color.c:49
void ext_keys_init(void)
Initialise map of ncurses extended keys.
Definition extended.c:114
void mutt_signal_init(void)
Initialise the signal handling.
int endwin(void)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_user_info()

static bool get_user_info ( struct ConfigSet * cs)
static

Find the user's name, home and shell.

Parameters
csConfig Set
Return values
trueSuccess

Find the login name, real name, home directory and shell.

Definition at line 772 of file main.c.

773{
774 const char *shell = mutt_str_getenv("SHELL");
775
776 /* Get some information about the user */
777 struct passwd *pw = getpwuid(getuid());
778 if (pw)
779 {
780 if (!NeoMutt->username)
781 NeoMutt->username = mutt_str_dup(pw->pw_name);
782 if (!NeoMutt->home_dir)
783 NeoMutt->home_dir = mutt_str_dup(pw->pw_dir);
784 if (!shell)
785 shell = pw->pw_shell;
786 }
787
788 if (!NeoMutt->username)
789 {
790 mutt_error(_("unable to determine username"));
791 return false; // TEST05: neomutt (unset $USER, delete user from /etc/passwd)
792 }
793
794 if (!NeoMutt->home_dir)
795 {
796 mutt_error(_("unable to determine home directory"));
797 return false; // TEST06: neomutt (unset $HOME, delete user from /etc/passwd)
798 }
799
800 if (shell)
801 config_str_set_initial(cs, "shell", shell);
802
803 return true;
804}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ log_translation()

static void log_translation ( void )
static

Log the translation being used.

Read the header info from the translation file.

Note
Call bindtextdomain() first

Definition at line 813 of file main.c.

814{
815 const char *header = ""; // Do not merge these two lines
816 header = _(header); // otherwise the .po files will end up badly ordered
817 const char *label = "Language:"; // the start of the lookup/needle
818 const char *lang = mutt_istr_find(header, label);
819 int len = 64;
820 if (lang)
821 {
822 lang += strlen(label); // skip label
823 SKIPWS(lang);
824 char *nl = strchr(lang, '\n');
825 if (nl)
826 len = (nl - lang);
827 }
828 else
829 {
830 lang = "NONE";
831 }
832
833 mutt_debug(LL_DEBUG1, "Translation: %.*s\n", len, lang);
834}
const char * mutt_istr_find(const char *haystack, const char *needle)
Find first occurrence of string (ignoring case)
Definition string.c:525
#define SKIPWS(ch)
Definition string2.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ log_gui()

static void log_gui ( void )
static

Log info about the GUI.

Definition at line 839 of file main.c.

840{
841 const char *term = mutt_str_getenv("TERM");
842 const char *color_term = mutt_str_getenv("COLORTERM");
843 bool true_color = false;
844#ifdef NEOMUTT_DIRECT_COLORS
845 true_color = true;
846#endif
847
848 mutt_debug(LL_DEBUG1, "GUI:\n");
849 mutt_debug(LL_DEBUG1, " Curses: %s\n", curses_version());
850 mutt_debug(LL_DEBUG1, " COLORS=%d\n", COLORS);
851 mutt_debug(LL_DEBUG1, " COLOR_PAIRS=%d\n", COLOR_PAIRS);
852 mutt_debug(LL_DEBUG1, " TERM=%s\n", NONULL(term));
853 mutt_debug(LL_DEBUG1, " COLORTERM=%s\n", NONULL(color_term));
854 mutt_debug(LL_DEBUG1, " True color support: %s\n", true_color ? "YES" : "NO");
855 mutt_debug(LL_DEBUG1, " Screen: %dx%d\n", RootWindow->state.cols,
856 RootWindow->state.rows);
857}
struct MuttWindow * RootWindow
Parent of all Windows.
Definition rootwin.c:106
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ show_help()

static bool show_help ( struct CliHelp * help)
static

Show the Help.

Parameters
helpCommand Line Options
Return values
trueSuccess, continue

Definition at line 896 of file main.c.

897{
898 if (!help->is_set)
899 return true;
900
902
903 const bool tty = isatty(STDOUT_FILENO);
904
905 if (help->help)
906 {
907 show_cli(help->mode, tty);
908 }
909 else if (help->license)
910 {
912 }
913 else
914 {
915 print_version(stdout, tty);
916 }
917
918 return false; // Stop
919}
void show_cli(enum HelpMode mode, bool use_color)
Show Instructions on how to run NeoMutt.
Definition usage.c:336
bool license
-vv Print license
Definition objects.h:68
enum HelpMode mode
Display detailed help.
Definition objects.h:70
bool help
-h Print help
Definition objects.h:66
bool is_set
This struct has been used.
Definition objects.h:65
bool print_copyright(void)
Print copyright message.
Definition version.c:701
bool print_version(FILE *fp, bool use_ansi)
Print system and compile info to a file.
Definition version.c:589
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_logging()

static bool init_logging ( struct CliShared * shared,
struct ConfigSet * cs )
static

Initialise the Logging.

Parameters
sharedShared Command line Options
csConfig Set
Return values
trueSuccess

Definition at line 927 of file main.c.

928{
929 if (!shared->is_set)
930 return true;
931
932 if (!buf_is_empty(&shared->log_file))
933 config_str_set_initial(cs, "debug_file", buf_string(&shared->log_file));
934
935 if (!buf_is_empty(&shared->log_level))
936 {
937 const char *dlevel = buf_string(&shared->log_level);
938 short num = 0;
939 if (!mutt_str_atos_full(dlevel, &num) || (num < LL_MESSAGE) || (num >= LL_MAX))
940 {
941 mutt_error(_("Error: value '%s' is invalid for -d"), dlevel);
942 return false;
943 }
944
945 config_str_set_initial(cs, "debug_level", dlevel);
946 }
947
948 return true;
949}
@ LL_MESSAGE
Log informational message.
Definition logging2.h:44
@ LL_MAX
Definition logging2.h:52
struct Buffer log_level
-d Debug log level
Definition objects.h:56
struct Buffer log_file
-l Debug log file
Definition objects.h:57
bool is_set
This struct has been used.
Definition objects.h:48
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_nntp()

static void init_nntp ( struct Buffer * server,
struct ConfigSet * cs )
static

Initialise the NNTP config.

Parameters
serverNNTP Server to use
csConfig Set

Definition at line 956 of file main.c.

957{
958 const char *cli_nntp = NULL;
959 if (!buf_is_empty(server))
960 cli_nntp = buf_string(server);
961
962 /* "$news_server" precedence: command line, config file, environment, system file */
963 if (cli_nntp)
964 cli_nntp = cs_subset_string(NeoMutt->sub, "news_server");
965
966 if (!cli_nntp)
967 cli_nntp = mutt_str_getenv("NNTPSERVER");
968
969 if (!cli_nntp)
970 {
971 char buf[1024] = { 0 };
972 cli_nntp = mutt_file_read_keyword(SYSCONFDIR "/nntpserver", buf, sizeof(buf));
973 }
974
975 if (cli_nntp)
976 config_str_set_initial(cs, "news_server", cli_nntp);
977}
char * mutt_file_read_keyword(const char *file, char *buf, size_t buflen)
Read a keyword from a file.
Definition file.c:1296
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dump_info()

static bool dump_info ( struct CliInfo * ci,
struct ConfigSet * cs )
static

Show config info.

Parameters
ciCommand line Options
csConfig Set
Return values
trueSuccess

Definition at line 985 of file main.c.

986{
987 if (!ci->is_set)
988 return true;
989
990 if (ci->dump_config || !ARRAY_EMPTY(&ci->queries))
991 {
992 const bool tty = isatty(STDOUT_FILENO);
993
995 if (tty)
996 cdflags |= CS_DUMP_LINK_DOCS;
997 if (ci->hide_sensitive)
998 cdflags |= CS_DUMP_HIDE_SENSITIVE;
999 if (ci->show_help)
1000 cdflags |= CS_DUMP_SHOW_DOCS;
1001
1002 struct HashElemArray hea = ARRAY_HEAD_INITIALIZER;
1003 if (ci->dump_config)
1004 {
1006 hea = get_elem_list(cs, gel_flags);
1007 }
1008 else
1009 {
1010 get_elem_queries(&ci->queries, &hea);
1011 }
1012
1013 dump_config(cs, &hea, cdflags, stdout);
1014 ARRAY_FREE(&hea);
1015 }
1016 else if (!ARRAY_EMPTY(&ci->alias_queries))
1017 {
1018 const char **cp = NULL;
1020 {
1021 struct AddressList *al = alias_lookup(*cp);
1022 if (al)
1023 {
1024 /* output in machine-readable form */
1025 mutt_addrlist_to_intl(al, NULL);
1026 struct Buffer *buf = buf_pool_get();
1027 mutt_addrlist_write(al, buf, false);
1028 printf("%s\n", buf_string(buf));
1029 buf_pool_release(&buf);
1030 }
1031 else
1032 {
1033 printf("%s\n", NONULL(*cp)); // TEST19: neomutt -A unknown
1034 }
1035 }
1036 }
1037
1038 return false; // Stop
1039}
size_t mutt_addrlist_write(const struct AddressList *al, struct Buffer *buf, bool display)
Write an Address to a buffer.
Definition address.c:1210
int mutt_addrlist_to_intl(struct AddressList *al, char **err)
Convert an Address list to Punycode.
Definition address.c:1297
struct AddressList * alias_lookup(const char *name)
Find an Alias.
Definition alias.c:273
#define ARRAY_FREE(head)
Release all memory.
Definition array.h:209
#define ARRAY_HEAD_INITIALIZER
Static initializer for arrays.
Definition array.h:58
bool dump_config(struct ConfigSet *cs, struct HashElemArray *hea, ConfigDumpFlags flags, FILE *fp)
Write all the config to a file.
Definition dump.c:198
#define CS_DUMP_HIDE_SENSITIVE
Obscure sensitive information like passwords.
Definition dump.h:38
uint16_t ConfigDumpFlags
Flags for dump_config(), e.g. CS_DUMP_ONLY_CHANGED.
Definition dump.h:35
#define CS_DUMP_LINK_DOCS
Link to the online docs.
Definition dump.h:47
#define CS_DUMP_NO_FLAGS
No flags are set.
Definition dump.h:36
#define CS_DUMP_SHOW_DOCS
Show one-liner documentation for the config item.
Definition dump.h:46
static int get_elem_queries(struct StringArray *queries, struct HashElemArray *hea)
Lookup the HashElems for a set of queries.
Definition main.c:680
bool show_help
-O Show one-liner help
Definition objects.h:81
bool is_set
This struct has been used.
Definition objects.h:78
struct StringArray queries
-Q Query a config option
Definition objects.h:85
struct StringArray alias_queries
-A Lookup an alias
Definition objects.h:84
bool dump_config
-D Dump the config options
Definition objects.h:79
bool dump_changed
-DD Dump the changed config options
Definition objects.h:80
bool hide_sensitive
-S Hide sensitive config
Definition objects.h:82
struct HashElemArray get_elem_list(struct ConfigSet *cs, enum GetElemListFlags flags)
Create a sorted list of all config items.
Definition subset.c:81
GetElemListFlags
Flags for get_elem_list()
Definition subset.h:80
@ GEL_CHANGED_CONFIG
Only config that has been changed.
Definition subset.h:82
@ GEL_ALL_CONFIG
All the normal config (no synonyms or deprecated)
Definition subset.h:81
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ main()

int main ( int argc,
char * argv[],
char * envp[] )

Start NeoMutt.

Parameters
argcNumber of command line arguments
argvList of command line arguments
envpCopy of the environment
Return values
0Success
1Error

Definition at line 1049 of file main.c.

1050{
1051 struct Email *e = NULL;
1052 SendFlags sendflags = SEND_NO_FLAGS;
1053 int rc = 1;
1054 bool repeat_error = false;
1055 struct Buffer *expanded_infile = buf_pool_get();
1056 struct Buffer *tempfile = buf_pool_get();
1057 struct ConfigSet *cs = NULL;
1058 struct CommandLine *cli = command_line_new();
1059
1061
1062 /* sanity check against stupid administrators */
1063 if (getegid() != getgid())
1064 {
1065 mutt_error("%s: I don't want to run with privileges!", (argc != 0) ? argv[0] : "neomutt");
1066 goto main_exit; // TEST01: neomutt (as root, chgrp mail neomutt; chmod +s neomutt)
1067 }
1068
1069 OptGui = true;
1070
1071 NeoMutt = neomutt_new();
1072 if (!neomutt_init(NeoMutt, envp, Modules))
1073 goto main_curses;
1074
1075 cli_parse(argc, argv, cli);
1076
1077 if (!show_help(&cli->help))
1078 goto main_ok;
1079
1080 init_keys();
1081
1082#ifdef USE_DEBUG_NOTIFY
1084#endif
1085
1086 cs = NeoMutt->sub->cs;
1087 if (!get_user_info(cs))
1088 goto main_exit;
1089
1090 if (!init_logging(&cli->shared, cs))
1091 goto main_exit;
1092
1093 mutt_log_prep();
1096
1097 /* Check for a batch send. */
1098 if (!isatty(STDIN_FILENO) || !ARRAY_EMPTY(&cli->info.queries) ||
1100 {
1101 OptGui = false;
1102 sendflags |= SEND_BATCH;
1105 }
1106
1107 /* Check to make sure stdout is available in curses mode. */
1108 if (OptGui && !isatty(STDOUT_FILENO))
1109 goto main_curses;
1110
1111 /* This must come before mutt_init() because curses needs to be started
1112 * before calling the init_pair() function to set the color scheme. */
1113 if (OptGui)
1114 {
1115 int crc = start_curses();
1116 if (crc != 0)
1117 goto main_curses; // TEST08: can't test -- fake term?
1118 }
1119
1120 /* Always create the mutt_windows because batch mode has some shared code
1121 * paths that end up referencing them. */
1122 rootwin_new();
1123
1124 if (OptGui)
1125 {
1126 /* check whether terminal status is supported (must follow curses init) */
1129 log_gui();
1130 }
1131
1132 menu_init();
1133 sb_init();
1134
1135 /* set defaults and read init files */
1136 int rc2 = mutt_init(cs, &cli->shared.log_level, &cli->shared.log_file,
1138 &cli->shared.commands);
1139 if (rc2 != 0)
1140 goto main_curses;
1141
1144
1145#ifdef USE_NOTMUCH
1146 const bool c_virtual_spool_file = cs_subset_bool(NeoMutt->sub, "virtual_spool_file");
1147 if (c_virtual_spool_file)
1148 {
1149 /* Find the first virtual folder and open it */
1150 struct MailboxArray ma = neomutt_mailboxes_get(NeoMutt, MUTT_NOTMUCH);
1151 struct Mailbox **mp = ARRAY_FIRST(&ma);
1152 if (mp)
1153 cs_str_string_set(cs, "spool_file", mailbox_path(*mp), NULL);
1154 ARRAY_FREE(&ma); // Clean up the ARRAY, but not the Mailboxes
1155 }
1156#endif
1157
1159
1160 init_nntp(&cli->tui.nntp_server, cs);
1161
1162 /* Initialize crypto backends. */
1163 crypt_init();
1164
1165 if (!buf_is_empty(&cli->shared.mbox_type) &&
1166 !config_str_set_initial(cs, "mbox_type", buf_string(&cli->shared.mbox_type)))
1167 {
1168 goto main_curses;
1169 }
1170
1171 if (!dump_info(&cli->info, cs))
1172 goto main_ok;
1173
1174 if (OptGui)
1175 {
1177 clear();
1181 }
1182
1183#ifdef USE_AUTOCRYPT
1184 /* Initialize autocrypt after curses messages are working,
1185 * because of the initial account setup screens. */
1186 const bool c_autocrypt = cs_subset_bool(NeoMutt->sub, "autocrypt");
1187 if (c_autocrypt)
1188 mutt_autocrypt_init(!(sendflags & SEND_BATCH));
1189#endif
1190
1191 /* Create the `$folder` directory if it doesn't exist. */
1192 const char *const c_folder = cs_subset_string(NeoMutt->sub, "folder");
1193 if (OptGui && c_folder)
1194 {
1195 struct stat st = { 0 };
1196 struct Buffer *fpath = buf_pool_get();
1197
1198 buf_strcpy(fpath, c_folder);
1199 expand_path(fpath, false);
1200 bool skip = false;
1201 /* we're not connected yet - skip mail folder creation */
1202 skip |= (imap_path_probe(buf_string(fpath), NULL) == MUTT_IMAP);
1203 skip |= (pop_path_probe(buf_string(fpath), NULL) == MUTT_POP);
1204 skip |= (nntp_path_probe(buf_string(fpath), NULL) == MUTT_NNTP);
1205 if (!skip && (stat(buf_string(fpath), &st) == -1) && (errno == ENOENT))
1206 {
1207 char msg2[256] = { 0 };
1208 snprintf(msg2, sizeof(msg2), _("%s does not exist. Create it?"), c_folder);
1209 if (query_yesorno(msg2, MUTT_YES) == MUTT_YES)
1210 {
1211 if ((mkdir(buf_string(fpath), 0700) == -1) && (errno != EEXIST))
1212 mutt_error(_("Can't create %s: %s"), c_folder, strerror(errno)); // TEST21: neomutt -n -F /dev/null (and ~/Mail doesn't exist)
1213 }
1214 }
1215 buf_pool_release(&fpath);
1216 }
1217
1218 StartupComplete = true;
1219
1223
1224 if (cli->tui.start_postponed)
1225 {
1226 if (OptGui)
1227 mutt_flushinp();
1228 if (mutt_send_message(SEND_POSTPONED, NULL, NULL, NULL, NULL, NeoMutt->sub) == 0)
1229 rc = 0;
1230 // TEST23: neomutt -p (postponed message, cancel)
1231 // TEST24: neomutt -p (no postponed message)
1233 repeat_error = true;
1234 goto main_curses;
1235 }
1236 else if (cli->send.is_set)
1237 {
1238 FILE *fp_in = NULL;
1239 FILE *fp_out = NULL;
1240 const char *infile = NULL;
1241 char *bodytext = NULL;
1242 const char *bodyfile = NULL;
1243 int rv = 0;
1244
1245 if (OptGui)
1246 mutt_flushinp();
1247
1248 e = email_new();
1249 e->env = mutt_env_new();
1250
1251 const char **cp = NULL;
1252 ARRAY_FOREACH(cp, &cli->send.bcc_list)
1253 {
1254 mutt_addrlist_parse(&e->env->bcc, *cp);
1255 }
1256
1257 ARRAY_FOREACH(cp, &cli->send.cc_list)
1258 {
1259 mutt_addrlist_parse(&e->env->cc, *cp);
1260 }
1261
1262 ARRAY_FOREACH(cp, &cli->send.addresses)
1263 {
1264 if (url_check_scheme(*cp) == U_MAILTO)
1265 {
1266 if (!mutt_parse_mailto(e->env, &bodytext, *cp))
1267 {
1268 mutt_error(_("Failed to parse mailto: link"));
1269 email_free(&e);
1270 goto main_curses; // TEST25: neomutt mailto:?
1271 }
1272 }
1273 else
1274 {
1275 mutt_addrlist_parse(&e->env->to, *cp);
1276 }
1277 }
1278
1279 const bool c_auto_edit = cs_subset_bool(NeoMutt->sub, "auto_edit");
1280 if (buf_is_empty(&cli->send.draft_file) && c_auto_edit &&
1281 TAILQ_EMPTY(&e->env->to) && TAILQ_EMPTY(&e->env->cc))
1282 {
1283 mutt_error(_("No recipients specified"));
1284 email_free(&e);
1285 goto main_curses; // TEST26: neomutt -s test (with auto_edit=yes)
1286 }
1287
1288 if (!buf_is_empty(&cli->send.subject))
1289 {
1290 /* prevent header injection */
1293 }
1294
1295 if (!buf_is_empty(&cli->send.draft_file))
1296 {
1297 infile = buf_string(&cli->send.draft_file);
1298 }
1299 else if (!buf_is_empty(&cli->send.include_file))
1300 {
1301 infile = buf_string(&cli->send.include_file);
1302 }
1303 else
1304 {
1305 cli->send.edit_infile = false;
1306 }
1307
1308 if (infile || bodytext)
1309 {
1310 /* Prepare fp_in and expanded_infile. */
1311 if (infile)
1312 {
1313 if (mutt_str_equal("-", infile))
1314 {
1315 if (cli->send.edit_infile)
1316 {
1317 mutt_error(_("Can't use -E flag with stdin"));
1318 email_free(&e);
1319 goto main_curses; // TEST27: neomutt -E -H -
1320 }
1321 fp_in = stdin;
1322 }
1323 else
1324 {
1325 buf_strcpy(expanded_infile, infile);
1326 expand_path(expanded_infile, false);
1327 fp_in = mutt_file_fopen(buf_string(expanded_infile), "r");
1328 if (!fp_in)
1329 {
1330 mutt_perror("%s", buf_string(expanded_infile));
1331 email_free(&e);
1332 goto main_curses; // TEST28: neomutt -E -H missing
1333 }
1334 }
1335 }
1336
1337 if (cli->send.edit_infile)
1338 {
1339 /* If editing the infile, keep it around afterwards so
1340 * it doesn't get unlinked, and we can rebuild the draft_file */
1341 sendflags |= SEND_NO_FREE_HEADER;
1342 }
1343 else
1344 {
1345 /* Copy input to a tempfile, and re-point fp_in to the tempfile.
1346 * Note: stdin is always copied to a tempfile, ensuring draft_file
1347 * can stat and get the correct st_size below. */
1348 buf_mktemp(tempfile);
1349
1350 fp_out = mutt_file_fopen(buf_string(tempfile), "w");
1351 if (!fp_out)
1352 {
1353 mutt_file_fclose(&fp_in);
1354 mutt_perror("%s", buf_string(tempfile));
1355 email_free(&e);
1356 goto main_curses; // TEST29: neomutt -H existing-file (where tmpdir=/path/to/FILE blocking tmpdir)
1357 }
1358 if (fp_in)
1359 {
1360 mutt_file_copy_stream(fp_in, fp_out);
1361 if (fp_in == stdin)
1362 sendflags |= SEND_CONSUMED_STDIN;
1363 else
1364 mutt_file_fclose(&fp_in);
1365 }
1366 else if (bodytext)
1367 {
1368 fputs(bodytext, fp_out);
1369 }
1370 mutt_file_fclose(&fp_out);
1371
1372 fp_in = mutt_file_fopen(buf_string(tempfile), "r");
1373 if (!fp_in)
1374 {
1375 mutt_perror("%s", buf_string(tempfile));
1376 email_free(&e);
1377 goto main_curses; // TEST30: can't test
1378 }
1379 }
1380
1381 /* Parse the draft_file into the full Email/Body structure.
1382 * Set SEND_DRAFT_FILE so mutt_send_message doesn't overwrite
1383 * our e->body. */
1384 if (!buf_is_empty(&cli->send.draft_file))
1385 {
1386 struct Envelope *opts_env = e->env;
1387 struct stat st = { 0 };
1388
1389 sendflags |= SEND_DRAFT_FILE;
1390
1391 /* Set up a tmp Email with just enough information so that
1392 * mutt_prepare_template() can parse the message in fp_in. */
1393 struct Email *e_tmp = email_new();
1394 e_tmp->offset = 0;
1395 e_tmp->body = mutt_body_new();
1396 if (fstat(fileno(fp_in), &st) != 0)
1397 {
1398 mutt_perror("%s", buf_string(&cli->send.draft_file));
1399 email_free(&e);
1400 email_free(&e_tmp);
1401 goto main_curses; // TEST31: can't test
1402 }
1403 e_tmp->body->length = st.st_size;
1404
1405 if (mutt_prepare_template(fp_in, NULL, e, e_tmp, false) < 0)
1406 {
1407 mutt_error(_("Can't parse message template: %s"),
1408 buf_string(&cli->send.draft_file));
1409 email_free(&e);
1410 email_free(&e_tmp);
1411 goto main_curses;
1412 }
1413
1414 /* Scan for neomutt header to set `$resume_draft_files` */
1415 struct ListNode *tmp = NULL;
1416 const bool c_resume_edited_draft_files = cs_subset_bool(NeoMutt->sub, "resume_edited_draft_files");
1417 struct ListNode *np = NULL;
1418 STAILQ_FOREACH_SAFE(np, &e->env->userhdrs, entries, tmp)
1419 {
1420 if (mutt_istr_startswith(np->data, "X-Mutt-Resume-Draft:"))
1421 {
1422 if (c_resume_edited_draft_files)
1423 cs_str_native_set(cs, "resume_draft_files", true, NULL);
1424
1425 STAILQ_REMOVE(&e->env->userhdrs, np, ListNode, entries);
1426 FREE(&np->data);
1427 FREE(&np);
1428 }
1429 }
1430
1431 mutt_addrlist_copy(&e->env->to, &opts_env->to, false);
1432 mutt_addrlist_copy(&e->env->cc, &opts_env->cc, false);
1433 mutt_addrlist_copy(&e->env->bcc, &opts_env->bcc, false);
1434 if (opts_env->subject)
1435 mutt_env_set_subject(e->env, opts_env->subject);
1436
1437 mutt_env_free(&opts_env);
1438 email_free(&e_tmp);
1439 }
1440 else if (cli->send.edit_infile)
1441 {
1442 /* Editing the include_file: pass it directly in.
1443 * Note that SEND_NO_FREE_HEADER is set above so it isn't unlinked. */
1444 bodyfile = buf_string(expanded_infile);
1445 }
1446 else
1447 {
1448 // For bodytext and unedited include_file: use the tempfile.
1449 bodyfile = buf_string(tempfile);
1450 }
1451
1452 mutt_file_fclose(&fp_in);
1453 }
1454
1455 FREE(&bodytext);
1456
1457 if (!ARRAY_EMPTY(&cli->send.attach))
1458 {
1459 struct Body *b = e->body;
1460
1461 while (b && b->next)
1462 b = b->next;
1463
1464 ARRAY_FOREACH(cp, &cli->send.attach)
1465 {
1466 if (b)
1467 {
1469 b = b->next;
1470 }
1471 else
1472 {
1474 e->body = b;
1475 }
1476 if (!b)
1477 {
1478 mutt_error(_("%s: unable to attach file"), *cp);
1479 email_free(&e);
1480 goto main_curses; // TEST32: neomutt john@example.com -a missing
1481 }
1482 }
1483 }
1484
1485 rv = mutt_send_message(sendflags, e, bodyfile, NULL, NULL, NeoMutt->sub);
1486 /* We WANT the "Mail sent." and any possible, later error */
1488 if (ErrorBufMessage)
1489 mutt_message("%s", ErrorBuf);
1490
1491 if (cli->send.edit_infile)
1492 {
1493 if (!buf_is_empty(&cli->send.draft_file))
1494 {
1495 if (truncate(buf_string(expanded_infile), 0) == -1)
1496 {
1497 mutt_perror("%s", buf_string(expanded_infile));
1498 email_free(&e);
1499 goto main_curses; // TEST33: neomutt -H read-only -s test john@example.com -E
1500 }
1501 fp_out = mutt_file_fopen(buf_string(expanded_infile), "a");
1502 if (!fp_out)
1503 {
1504 mutt_perror("%s", buf_string(expanded_infile));
1505 email_free(&e);
1506 goto main_curses; // TEST34: can't test
1507 }
1508
1509 /* If the message was sent or postponed, these will already
1510 * have been done. */
1511 if (rv < 0)
1512 {
1513 if (e->body->next)
1514 e->body = mutt_make_multipart(e->body);
1516 mutt_prepare_envelope(e->env, false, NeoMutt->sub);
1517 mutt_env_to_intl(e->env, NULL, NULL);
1518 }
1519
1520 const bool c_crypt_protected_headers_read = cs_subset_bool(NeoMutt->sub, "crypt_protected_headers_read");
1522 c_crypt_protected_headers_read &&
1524 NeoMutt->sub);
1525 const bool c_resume_edited_draft_files = cs_subset_bool(NeoMutt->sub, "resume_edited_draft_files");
1526 if (c_resume_edited_draft_files)
1527 fprintf(fp_out, "X-Mutt-Resume-Draft: 1\n");
1528 fputc('\n', fp_out);
1529 if ((mutt_write_mime_body(e->body, fp_out, NeoMutt->sub) == -1))
1530 {
1531 mutt_file_fclose(&fp_out);
1532 email_free(&e);
1533 goto main_curses; // TEST35: can't test
1534 }
1535 mutt_file_fclose(&fp_out);
1536 }
1537
1538 email_free(&e);
1539 }
1540
1541 /* !edit_infile && draft_file will leave the tempfile around */
1542 if (!buf_is_empty(tempfile))
1543 unlink(buf_string(tempfile));
1544
1546
1547 if (rv != 0)
1548 goto main_curses; // TEST36: neomutt -H existing -s test john@example.com -E (cancel sending)
1549 }
1550 else if (sendflags & SEND_BATCH)
1551 {
1552 /* This guards against invoking `neomutt < /dev/null` and accidentally
1553 * sending an email due to a my-header or other setting. */
1554 mutt_error(_("No recipients specified"));
1555 goto main_curses;
1556 }
1557 else
1558 {
1559 struct Buffer *folder = &cli->tui.folder;
1560 bool explicit_folder = !buf_is_empty(folder);
1561
1562 if (cli->tui.start_new_mail)
1563 {
1564 const bool c_imap_passive = cs_subset_bool(NeoMutt->sub, "imap_passive");
1565 cs_subset_str_native_set(NeoMutt->sub, "imap_passive", false, NULL);
1567 if (mutt_mailbox_check(NULL, csflags) == 0)
1568 {
1569 mutt_message(_("No mailbox with new mail"));
1570 repeat_error = true;
1571 goto main_curses; // TEST37: neomutt -Z (no new mail)
1572 }
1573 buf_reset(folder);
1574 mutt_mailbox_next(NULL, folder);
1575 cs_subset_str_native_set(NeoMutt->sub, "imap_passive", c_imap_passive, NULL);
1576 }
1577 else if (cli->tui.start_nntp || cli->tui.start_browser)
1578 {
1579 if (cli->tui.start_nntp)
1580 {
1581 const char *const c_news_server = cs_subset_string(NeoMutt->sub, "news_server");
1582 OptNews = true;
1583 CurrentNewsSrv = nntp_select_server(NULL, c_news_server, false);
1584 if (!CurrentNewsSrv)
1585 goto main_curses; // TEST38: neomutt -G (unset news_server)
1586 }
1587 else if (ARRAY_EMPTY(&NeoMutt->accounts))
1588 {
1589 mutt_error(_("No incoming mailboxes defined"));
1590 goto main_curses; // TEST39: neomutt -n -F /dev/null -y
1591 }
1592 buf_reset(folder);
1593 dlg_browser(folder, MUTT_SEL_FOLDER | MUTT_SEL_MAILBOX, NULL, NULL, NULL);
1594 if (buf_is_empty(folder))
1595 {
1596 goto main_ok; // TEST40: neomutt -y (quit selection)
1597 }
1598 }
1599
1600 if (buf_is_empty(folder))
1601 {
1602 const char *const c_spool_file = cs_subset_string(NeoMutt->sub, "spool_file");
1603 if (c_spool_file)
1604 {
1605 // Check if `$spool_file` corresponds a mailboxes' description.
1606 struct Mailbox *m_desc = mailbox_find_name(c_spool_file);
1607 if (m_desc)
1608 buf_strcpy(folder, m_desc->realpath);
1609 else
1610 buf_strcpy(folder, c_spool_file);
1611 }
1612 else if (c_folder)
1613 {
1614 buf_strcpy(folder, c_folder);
1615 }
1616 /* else no folder */
1617 }
1618
1619 if (OptNews)
1620 {
1621 OptNews = false;
1622 buf_alloc(folder, PATH_MAX);
1623 nntp_expand_path(folder->data, folder->dsize, &CurrentNewsSrv->conn->account);
1624 }
1625 else
1626 {
1627 expand_path(folder, false);
1628 }
1629
1632
1633 if (cli->tui.start_any_mail || cli->tui.start_new_mail)
1634 {
1635 /* check to see if there are any messages in the folder */
1636 switch (mx_path_is_empty(folder))
1637 {
1638 case -1:
1639 mutt_perror("%s", buf_string(folder));
1640 goto main_curses; // TEST41: neomutt -z -f missing
1641 case 1:
1642 mutt_error(_("Mailbox is empty"));
1643 goto main_curses; // TEST42: neomutt -z -f /dev/null
1644 }
1645 }
1646
1647 struct Mailbox *m_cur = mailbox_find(buf_string(folder));
1648 // Take a copy of the name just in case the hook alters m_cur
1649 const char *name = m_cur ? mutt_str_dup(m_cur->name) : NULL;
1651 FREE(&name);
1653 mutt_debug(LL_NOTIFY, "NT_GLOBAL_STARTUP\n");
1655
1657 window_redraw(NULL);
1658
1659 repeat_error = true;
1660 struct Mailbox *m = mx_resolve(buf_string(folder));
1661 const bool c_read_only = cs_subset_bool(NeoMutt->sub, "read_only");
1662 if (!mx_mbox_open(m, (cli->tui.read_only || c_read_only) ? MUTT_READONLY : MUTT_OPEN_NO_FLAGS))
1663 {
1664 if (m->account)
1666
1667 mailbox_free(&m);
1668 mutt_error(_("Unable to open mailbox %s"), buf_string(folder));
1669 repeat_error = false;
1670 }
1671 if (m || !explicit_folder)
1672 {
1673 struct MuttWindow *dlg = index_pager_init();
1674 dialog_push(dlg);
1675
1677 m = dlg_index(dlg, m);
1679 mailbox_free(&m);
1680
1681 dialog_pop();
1682 mutt_window_free(&dlg);
1684 repeat_error = false;
1685 }
1687#ifdef USE_SASL_CYRUS
1689#endif
1690#ifdef USE_SASL_GNU
1692#endif
1693#ifdef USE_AUTOCRYPT
1695#endif
1696 // TEST43: neomutt (no change to mailbox)
1697 // TEST44: neomutt (change mailbox)
1698 }
1699
1700main_ok:
1701 rc = 0;
1702main_curses:
1703 mutt_endwin();
1704 /* Repeat the last message to the user */
1705 if (repeat_error && ErrorBufMessage)
1706 puts(ErrorBuf);
1707main_exit:
1708 if (NeoMutt && NeoMutt->sub)
1709 {
1713 }
1714
1715 buf_pool_release(&expanded_infile);
1716 buf_pool_release(&tempfile);
1719 if (NeoMutt)
1723 menu_cleanup();
1724 crypt_cleanup();
1726 command_line_free(&cli);
1727
1729
1730 sb_cleanup();
1731
1733
1735 FREE(&LastFolder);
1737
1739
1741
1742 lua_cleanup();
1743 km_cleanup();
1751 mutt_log_stop();
1752 return rc;
1753}
void mutt_addrlist_copy(struct AddressList *dst, const struct AddressList *src, bool prune)
Copy a list of addresses into another list.
Definition address.c:769
int mutt_addrlist_parse(struct AddressList *al, const char *s)
Parse a list of email addresses.
Definition address.c:480
#define ARRAY_FIRST(head)
Convenience method to get the first element.
Definition array.h:136
void mutt_autocrypt_cleanup(void)
Shutdown Autocrypt.
Definition autocrypt.c:129
int mutt_autocrypt_init(bool can_create)
Initialise Autocrypt.
Definition autocrypt.c:99
#define MUTT_SEL_MAILBOX
Select a mailbox.
Definition lib.h:59
#define MUTT_SEL_FOLDER
Select a local directory.
Definition lib.h:61
void buf_alloc(struct Buffer *buf, size_t new_size)
Make sure a buffer can store at least new_size bytes.
Definition buffer.c:337
bool cli_parse(int argc, char *const *argv, struct CommandLine *cli)
Parse the Command Line.
Definition parse.c:148
void colors_cleanup(void)
Cleanup all the colours.
Definition color.c:84
@ MT_COLOR_NORMAL
Plain text.
Definition color.h:53
@ CMD_STARTUP_HOOK
:startup-hook
Definition command.h:115
@ CMD_NONE
No Command.
Definition command.h:59
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
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.
Definition set.c:789
bool StartupComplete
When the config has been read.
Definition address.c:11
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.
Definition account.c:94
void mailbox_free(struct Mailbox **ptr)
Free a Mailbox.
Definition mailbox.c:90
struct Mailbox * mailbox_find_name(const char *name)
Find the mailbox with a given name.
Definition mailbox.c:187
struct Mailbox * mailbox_find(const char *path)
Find the mailbox with a given path.
Definition mailbox.c:151
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
Definition mailbox.h:213
@ MUTT_NOTMUCH
'Notmuch' (virtual) Mailbox type
Definition mailbox.h:50
@ MUTT_POP
'POP3' Mailbox type
Definition mailbox.h:51
@ MUTT_NNTP
'NNTP' (Usenet) Mailbox type
Definition mailbox.h:48
@ MUTT_IMAP
'IMAP' Mailbox type
Definition mailbox.h:49
bool mutt_should_hide_protected_subject(struct Email *e)
Should NeoMutt hide the protected subject?
Definition crypt.c:1100
void crypto_module_cleanup(void)
Clean up the crypto modules.
Definition crypt_mod.c:84
void crypt_cleanup(void)
Clean up backend.
Definition cryptglue.c:141
void crypt_init(void)
Initialise the crypto backends.
Definition cryptglue.c:93
void mutt_endwin(void)
Shutdown curses.
Definition curs_lib.c:151
int debug_all_observer(struct NotifyCallback *nc)
Debug observer for all notifications.
Definition notify.c:237
void dialog_push(struct MuttWindow *dlg)
Display a Window to the user.
Definition dialog.c:109
void dialog_pop(void)
Hide a Window from the user.
Definition dialog.c:142
void mutt_browser_cleanup(void)
Clean up working Buffers.
struct MuttWindow * index_pager_init(void)
Allocate the Windows for the Index/Pager.
Definition dlg_index.c:1437
struct Body * mutt_body_new(void)
Create a new Body.
Definition body.c:44
struct Email * email_new(void)
Create a new Email.
Definition email.c:77
void email_free(struct Email **ptr)
Free an Email.
Definition email.c:46
bool mutt_parse_mailto(struct Envelope *env, char **body, const char *src)
Parse a mailto:// url.
Definition parse.c:1762
void mutt_filter_commandline_header_value(char *header)
Sanitise characters in a header value.
Definition parse.c:92
int mutt_env_to_intl(struct Envelope *env, const char **tag, char **err)
Convert an Envelope's Address fields to Punycode format.
Definition envelope.c:350
void mutt_env_free(struct Envelope **ptr)
Free an Envelope.
Definition envelope.c:125
struct Envelope * mutt_env_new(void)
Create a new Envelope.
Definition envelope.c:45
void mutt_env_set_subject(struct Envelope *env, const char *subj)
Set both subject and real_subj to subj.
Definition envelope.c:68
void envlist_free(char ***envp)
Free the private copy of the environment.
Definition envlist.c:42
void mutt_delete_hooks(enum CommandId id)
Delete matching hooks.
Definition parse.c:1014
void external_cleanup(void)
Clean up commands globals.
Definition external.c:77
int mutt_file_copy_stream(FILE *fp_in, FILE *fp_out)
Copy the contents of one file into another.
Definition file.c:222
static const struct Module * Modules[]
All the library Modules.
Definition address.c:32
void mutt_flushinp(void)
Empty all the keyboard buffers.
Definition get.c:65
bool OptNews
(pseudo) used to change reader mode
Definition globals.c:53
char * LastFolder
Previously selected mailbox.
Definition globals.c:39
char ErrorBuf[1024]
Copy of the last error message.
Definition globals.c:34
bool ErrorBufMessage
true if the last message was an error
Definition globals.c:33
char * CurrentFolder
Currently selected mailbox.
Definition globals.c:38
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 -.
Definition dlg_index.c:1099
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 -.
Definition logging.c:384
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(...)
Definition logging2.h:93
enum MailboxType nntp_path_probe(const char *path, const struct stat *st)
Is this an NNTP Mailbox?
Definition nntp.c:2783
enum MailboxType pop_path_probe(const char *path, const struct stat *st)
Is this a POP Mailbox?
Definition pop.c:1161
enum MailboxType imap_path_probe(const char *path, const struct stat *st)
Is this an IMAP Mailbox?
Definition imap.c:2543
int main_hist_observer(struct NotifyCallback *nc)
Notification that a Config Variable has change - Implements observer_t -.
Definition history.c:701
static int main_timeout_observer(struct NotifyCallback *nc)
Notification that a timeout has occurred - Implements observer_t -.
Definition main.c:862
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.
Definition gsasl.c:149
void mutt_hist_read_file(void)
Read the History from a file.
Definition history.c:592
void mutt_hist_init(void)
Create a set of empty History ring buffers.
Definition history.c:464
void mutt_hist_cleanup(void)
Free all the history lists.
Definition history.c:437
void exec_startup_shutdown_hook(enum CommandId id)
Execute any startup/shutdown hooks.
Definition exec.c:410
void exec_folder_hook(const char *path, const char *desc)
Perform a folder hook.
Definition exec.c:64
void imap_logout_all(void)
Close all open connections.
Definition imap.c:667
void km_cleanup(void)
Free the key maps.
Definition init.c:200
void km_set_abort_key(void)
Parse the abort_key config string.
Definition init.c:232
int log_dispatcher_t MuttLogger
@ LL_NOTIFY
Log of notifications.
Definition logging2.h:50
void lua_cleanup(void)
Clean up Lua.
Definition commands.c:167
static bool init_logging(struct CliShared *shared, struct ConfigSet *cs)
Initialise the Logging.
Definition main.c:927
static void log_translation(void)
Log the translation being used.
Definition main.c:813
static void log_gui(void)
Log info about the GUI.
Definition main.c:839
static void init_nntp(struct Buffer *server, struct ConfigSet *cs)
Initialise the NNTP config.
Definition main.c:956
static bool show_help(struct CliHelp *help)
Show the Help.
Definition main.c:896
static int start_curses(void)
Start the Curses UI.
Definition main.c:738
static bool dump_info(struct CliInfo *ci, struct ConfigSet *cs)
Show config info.
Definition main.c:985
static bool get_user_info(struct ConfigSet *cs)
Find the user's name, home and shell.
Definition main.c:772
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.
Definition main.c:430
static void init_keys(void)
Initialise the Keybindings.
Definition main.c:710
void menu_init(void)
Initialise all the Menus.
Definition menu.c:81
void menu_cleanup(void)
Free the saved Menu searches.
Definition menu.c:72
struct Body * mutt_make_multipart(struct Body *b)
Create a multipart email.
Definition multipart.c:100
void mutt_ch_cache_cleanup(void)
Clean up the cached iconv handles and charset strings.
Definition charset.c:1161
void log_queue_empty(void)
Free the contents of the queue.
Definition logging.c:331
void log_queue_set_max_size(int size)
Set a upper limit for the queue length.
Definition logging.c:319
bool notify_observer_remove(struct Notify *notify, const observer_t callback, const void *global_data)
Remove an observer from an object.
Definition notify.c:230
bool notify_observer_add(struct Notify *notify, enum NotifyType type, observer_t callback, void *global_data)
Add an observer to an object.
Definition notify.c:191
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition notify.c:173
size_t mutt_istr_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix, ignoring case.
Definition string.c:246
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition string.c:284
#define PATH_MAX
Definition mutt.h:49
enum MuttCursorState mutt_curses_set_cursor(enum MuttCursorState state)
Set the cursor state.
Definition mutt_curses.c:94
const struct AttrColor * mutt_curses_set_color_by_id(enum ColorId cid)
Set the colour and attributes by the Colour ID.
Definition mutt_curses.c:79
void mutt_resize_screen(void)
Update NeoMutt's opinion about the window size.
Definition resize.c:76
@ MUTT_CURSOR_INVISIBLE
Hide the cursor.
Definition mutt_curses.h:65
@ MUTT_CURSOR_VISIBLE
Display a normal cursor.
Definition mutt_curses.h:66
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.
Definition mx.c:285
struct Mailbox * mx_resolve(const char *path_or_name)
Get a Mailbox from either a path or name.
Definition mx.c:1719
int mx_path_is_empty(struct Buffer *path)
Is the mailbox empty.
Definition mx.c:1254
#define MUTT_READONLY
Open in read-only mode.
Definition mxapi.h:42
#define MUTT_MAILBOX_CHECK_IMMEDIATE
Don't postpone the actual checking.
Definition mxapi.h:52
#define MUTT_OPEN_NO_FLAGS
No flags are set.
Definition mxapi.h:39
uint8_t CheckStatsFlags
Flags for mutt_mailbox_check.
Definition mxapi.h:48
struct MailboxArray neomutt_mailboxes_get(struct NeoMutt *n, enum MailboxType type)
Get an Array of matching Mailboxes.
Definition neomutt.c:526
void neomutt_cleanup(struct NeoMutt *n)
Clean up NeoMutt and Modules.
Definition neomutt.c:405
bool neomutt_init(struct NeoMutt *n, char **envp, const struct Module **modules)
Initialise NeoMutt.
Definition neomutt.c:319
struct NeoMutt * neomutt_new(void)
Create the main NeoMutt object.
Definition neomutt.c:307
void neomutt_free(struct NeoMutt **ptr)
Free a NeoMutt.
Definition neomutt.c:418
@ NT_GLOBAL_STARTUP
NeoMutt is initialised.
Definition neomutt.h:70
void nntp_expand_path(char *buf, size_t buflen, struct ConnAccount *acct)
Make fully qualified url from newsgroup name.
Definition newsrc.c:555
struct NntpAccountData * CurrentNewsSrv
Current NNTP news server.
Definition nntp.c:74
struct NntpAccountData * nntp_select_server(struct Mailbox *m, const char *server, bool leave_lock)
Open a connection to an NNTP server.
Definition newsrc.c:944
@ NT_TIMEOUT
Timeout has occurred.
Definition notify_type.h:56
@ NT_CONFIG
Config has changed, NotifyConfig, EventConfig.
Definition notify_type.h:43
@ NT_ALL
Register for all notifications.
Definition notify_type.h:35
@ NT_GLOBAL
Not object-related, NotifyGlobal.
Definition notify_type.h:46
@ NT_RESIZE
Window has been resized.
Definition notify_type.h:52
struct CommandLine * command_line_new(void)
Create a new CommandLine.
Definition objects.c:105
void command_line_free(struct CommandLine **ptr)
Free a CommandLine.
Definition objects.c:114
void buf_pool_cleanup(void)
Release the Buffer pool.
Definition pool.c:75
int mutt_prepare_template(FILE *fp, struct Mailbox *m, struct Email *e_new, struct Email *e, bool resend)
Prepare a message template.
Definition postpone.c:492
void mutt_prex_cleanup(void)
Cleanup heap memory allocated by compiled regexes.
Definition prex.c:342
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
Definition quad.h:39
enum QuadOption query_yesorno(const char *prompt, enum QuadOption def)
Ask the user a Yes/No question.
Definition question.c:326
#define STAILQ_REMOVE(head, elm, type, field)
Definition queue.h:441
#define STAILQ_FOREACH_SAFE(var, head, field, tvar)
Definition queue.h:400
#define TAILQ_EMPTY(head)
Definition queue.h:778
void rootwin_cleanup(void)
Free all the default Windows.
Definition rootwin.c:209
void rootwin_new(void)
Create the default Windows.
Definition rootwin.c:221
void mutt_sasl_cleanup(void)
Invoke when processing is complete.
Definition sasl.c:781
int mutt_write_mime_body(struct Body *b, FILE *fp, struct ConfigSubset *sub)
Write a MIME part.
Definition body.c:300
int mutt_rfc822_write_header(FILE *fp, struct Envelope *env, struct Body *b, enum MuttWriteHeaderMode mode, bool privacy, bool hide_protected_subject, struct ConfigSubset *sub)
Write out one RFC822 header line.
Definition header.c:578
@ MUTT_WRITE_HEADER_POSTPONE
A postponed Email, just the envelope info.
Definition header.h:40
void mutt_encode_descriptions(struct Body *b, bool recurse, struct ConfigSubset *sub)
RFC2047 encode the content-descriptions.
Definition send.c:1492
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.
Definition send.c:2037
#define SEND_BATCH
Send email in batch mode (without user interaction)
Definition send.h:47
#define SEND_NO_FREE_HEADER
Used by the -E flag.
Definition send.h:51
#define SEND_DRAFT_FILE
Used by the -H flag.
Definition send.h:52
uint32_t SendFlags
Flags for mutt_send_message(), e.g. SEND_REPLY.
Definition send.h:40
#define SEND_POSTPONED
Recall a postponed email.
Definition send.h:46
#define SEND_CONSUMED_STDIN
stdin has been read; don't read it twice
Definition send.h:57
#define SEND_NO_FLAGS
No flags are set.
Definition send.h:41
struct Body * mutt_make_file_attach(const char *path, struct ConfigSubset *sub)
Create a file attachment.
Definition sendlib.c:606
void mutt_prepare_envelope(struct Envelope *env, bool final, struct ConfigSubset *sub)
Prepare an email header.
Definition sendlib.c:739
void sb_init(void)
Set up the Sidebar.
Definition sidebar.c:213
void sb_cleanup(void)
Clean up the Sidebar.
Definition sidebar.c:227
void source_stack_cleanup(void)
Free memory from the stack used for the source command.
Definition source.c:274
The body of an email.
Definition body.h:36
bool unlink
If true, filename should be unlink()ed before free()ing this structure.
Definition body.h:68
LOFF_T length
length (in bytes) of attachment
Definition body.h:53
struct Body * next
next attachment in the list
Definition body.h:72
size_t dsize
Length of data.
Definition buffer.h:39
char * data
Pointer to data.
Definition buffer.h:37
struct Buffer draft_file
-H Use this draft file
Definition objects.h:102
bool is_set
This struct has been used.
Definition objects.h:93
struct Buffer include_file
-i Use this include file
Definition objects.h:103
struct StringArray cc_list
-c Add a Cc:
Definition objects.h:99
struct StringArray attach
-a Attach a file
Definition objects.h:97
bool edit_infile
-E Edit the draft/include
Definition objects.h:95
struct StringArray bcc_list
-b Add a Bcc:
Definition objects.h:98
struct StringArray addresses
Send to these addresses.
Definition objects.h:100
struct Buffer subject
-s Use this Subject:
Definition objects.h:104
struct StringArray commands
-e Run these commands
Definition objects.h:53
bool disable_system
-n Don't read the system config file
Definition objects.h:51
struct StringArray user_files
-F Use these user config files
Definition objects.h:50
struct Buffer mbox_type
-m Set the default Mailbox type
Definition objects.h:54
bool read_only
-R Open Mailbox read-only
Definition objects.h:113
bool start_any_mail
-z Check for Any Mail
Definition objects.h:118
bool start_nntp
-G Open an NNTP Mailbox
Definition objects.h:116
struct Buffer nntp_server
-g Open this NNTP Mailbox
Definition objects.h:121
struct Buffer folder
-f Open this Mailbox
Definition objects.h:120
bool start_postponed
-p Open Postponed emails
Definition objects.h:114
bool start_new_mail
-Z Check for New Mail
Definition objects.h:117
bool start_browser
-y Open the Mailbox Browser
Definition objects.h:115
Command Line options.
Definition objects.h:128
struct CliSend send
Send Mode command line options.
Definition objects.h:132
struct CliShared shared
Shared command line options.
Definition objects.h:129
struct CliHelp help
Help Mode command line options.
Definition objects.h:130
struct CliInfo info
Info Mode command line options.
Definition objects.h:131
struct CliTui tui
Tui Mode command line options.
Definition objects.h:133
Container for lots of config items.
Definition set.h:250
struct Notify * notify
Notifications: NotifyConfig, EventConfig.
Definition subset.h:51
struct ConfigSet * cs
Parent ConfigSet.
Definition subset.h:50
The envelope/body of an email.
Definition email.h:39
struct Envelope * env
Envelope information.
Definition email.h:68
struct Body * body
List of MIME parts.
Definition email.h:69
LOFF_T offset
Where in the stream does this message begin?
Definition email.h:71
The header of an Email.
Definition envelope.h:57
struct ListHead userhdrs
user defined headers
Definition envelope.h:85
char *const subject
Email's subject.
Definition envelope.h:70
struct AddressList to
Email's 'To' list.
Definition envelope.h:60
struct AddressList cc
Email's 'Cc' list.
Definition envelope.h:61
struct AddressList bcc
Email's 'Bcc' list.
Definition envelope.h:62
A List node for strings.
Definition list.h:37
char * data
String.
Definition list.h:38
A mailbox.
Definition mailbox.h:78
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
Definition mailbox.h:80
char * name
A short name for the Mailbox.
Definition mailbox.h:81
struct Account * account
Account that owns this Mailbox.
Definition mailbox.h:126
struct AccountArray accounts
All Accounts.
Definition neomutt.h:50
struct Notify * notify_resize
Window resize notifications handler.
Definition neomutt.h:46
char ** env
Private copy of the environment variables.
Definition neomutt.h:58
struct Notify * notify
Notifications handler.
Definition neomutt.h:45
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.
Definition subset.c:303
bool TsSupported
Terminal Setting is supported.
Definition terminal.c:53
bool mutt_ts_capability(void)
Check terminal capabilities.
Definition terminal.c:83
#define buf_mktemp(buf)
Definition tmp.h:33
enum UrlScheme url_check_scheme(const char *str)
Check the protocol of a URL.
Definition url.c:226
@ U_MAILTO
Url is mailto://.
Definition url.h:45

Variable Documentation

◆ StartupComplete

bool StartupComplete = false

When the config has been read.

Definition at line 163 of file main.c.

◆ ModuleMain

const struct Module ModuleMain
extern

Module for the Main library.

Definition at line 48 of file module.c.

48 {
50 "main",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool main_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_MAIN
ModuleMain, NeoMutt Email Client
Definition module_api.h:44

◆ ModuleAddress

const struct Module ModuleAddress
extern

Module for the Address library.

Definition at line 65 of file module.c.

65 {
67 "address",
68 NULL, // init
71 NULL, // commands_register
72 NULL, // gui_init
73 NULL, // gui_cleanup
74 NULL, // cleanup
75};
static bool address_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:51
static bool address_config_define_types(struct NeoMutt *n, struct ConfigSet *cs)
Set up Config Types - Implements Module::config_define_types()
Definition module.c:43
@ MODULE_ID_ADDRESS
ModuleAddress, Address
Definition module_api.h:47

◆ ModuleAlias

const struct Module ModuleAlias
extern

Module for the Alias library.

Definition at line 108 of file module.c.

108 {
110 "alias",
112 NULL, // config_define_types
115 NULL, // gui_init
116 NULL, // gui_cleanup
118};
void alias_cleanup(void)
void alias_init(void)
static bool alias_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:74
static bool alias_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:66
@ MODULE_ID_ALIAS
ModuleAlias, Alias
Definition module_api.h:48

◆ ModuleAttach

const struct Module ModuleAttach
extern

Module for the Attach library.

Definition at line 108 of file module.c.

108 {
110 "attach",
112 NULL, // config_define_types
115 NULL, // gui_init
116 NULL, // gui_cleanup
118};
static bool attach_init(struct NeoMutt *n)
Initialise a Module - Implements Module::init()
Definition module.c:46
static bool attach_cleanup(struct NeoMutt *n)
Clean up a Module - Implements Module::cleanup()
Definition module.c:84
static bool attach_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:76
static bool attach_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:68
@ MODULE_ID_ATTACH
ModuleAttach, Attachments
Definition module_api.h:49

◆ ModuleAutocrypt

const struct Module ModuleAutocrypt
extern

Module for the Autocrypt library.

Definition at line 54 of file module.c.

54 {
56 "autocrypt",
57 NULL, // init
58 NULL, // config_define_types
60 NULL, // commands_register
61 NULL, // gui_init
62 NULL, // gui_cleanup
63 NULL, // cleanup
64};
static bool autocrypt_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_AUTOCRYPT
ModuleAutocrypt, Autocrypt
Definition module_api.h:50

◆ ModuleBcache

const struct Module ModuleBcache
extern

Module for the Bcache library.

Definition at line 36 of file module.c.

36 {
38 "bcache",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_BCACHE
ModuleBcache, Body (Message) Cache
Definition module_api.h:51

◆ ModuleBrowser

const struct Module ModuleBrowser
extern

Module for the Browser library.

Definition at line 48 of file module.c.

48 {
50 "browser",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool browser_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_BROWSER
ModuleBrowser, Mailbox Browser
Definition module_api.h:52

◆ ModuleColor

const struct Module ModuleColor
extern

Module for the Color library.

Definition at line 36 of file module.c.

36 {
38 "color",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_COLOR
ModuleColor, Color
Definition module_api.h:53

◆ ModuleCommands

const struct Module ModuleCommands
extern

Module for the Commands library.

Definition at line 47 of file module.c.

47 {
49 "commands",
50 NULL, // init
51 NULL, // config_define_types
52 NULL, // config_define_variables
54 NULL, // gui_init
55 NULL, // gui_cleanup
56 NULL, // cleanup
57};
static bool commands_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:39
@ MODULE_ID_COMMANDS
ModuleCommands, NeoMutt Commands
Definition module_api.h:54

◆ ModuleComplete

const struct Module ModuleComplete
extern

Module for the Complete library.

Definition at line 36 of file module.c.

36 {
38 "complete",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_COMPLETE
ModuleComplete, Auto-completion
Definition module_api.h:55

◆ ModuleCompmbox

const struct Module ModuleCompmbox
extern

Module for the Compmbox library.

Definition at line 47 of file module.c.

47 {
49 "compmbox",
50 NULL, // init
51 NULL, // config_define_types
52 NULL, // config_define_variables
54 NULL, // gui_init
55 NULL, // gui_cleanup
56 NULL, // cleanup
57};
static bool compmbox_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:39
@ MODULE_ID_COMPMBOX
ModuleCompmbox, Compressed Mailbox
Definition module_api.h:56

◆ ModuleCompose

const struct Module ModuleCompose
extern

Module for the Compose library.

Definition at line 48 of file module.c.

48 {
50 "compose",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool compose_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_COMPOSE
ModuleCompose, Compose an Email
Definition module_api.h:57

◆ ModuleCompress

const struct Module ModuleCompress
extern

Module for the Compress library.

Definition at line 36 of file module.c.

36 {
38 "compress",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_COMPRESS
ModuleCompress, Compression functions
Definition module_api.h:58

◆ ModuleConfig

const struct Module ModuleConfig
extern

Module for the Config library.

Definition at line 74 of file module.c.

74 {
76 "config",
77 NULL, // init
79 NULL, // config_define_variables
80 NULL, // commands_register
81 NULL, // gui_init
82 NULL, // gui_cleanup
83 NULL, // cleanup
84};
static bool config_config_define_types(struct NeoMutt *n, struct ConfigSet *cs)
Set up Config Types - Implements Module::config_define_types()
Definition module.c:51
@ MODULE_ID_CONFIG
ModuleConfig, Config
Definition module_api.h:59

◆ ModuleConn

const struct Module ModuleConn
extern

Module for the Conn library.

Definition at line 77 of file module.c.

77 {
79 "conn",
80 NULL, // init
81 NULL, // config_define_types
83 NULL, // commands_register
84 NULL, // gui_init
85 NULL, // gui_cleanup
86 NULL, // cleanup
87};
static bool conn_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:45
@ MODULE_ID_CONN
ModuleConn, Network connections
Definition module_api.h:60

◆ ModuleConvert

const struct Module ModuleConvert
extern

Module for the Convert library.

Definition at line 36 of file module.c.

36 {
38 "convert",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_CONVERT
ModuleConvert, File Charset Conversion
Definition module_api.h:61

◆ ModuleCore

const struct Module ModuleCore
extern

Module for the Core library.

Definition at line 36 of file module.c.

36 {
37 MODULE_ID_CORE, "core",
38 NULL, // init
39 NULL, // config_define_types
40 NULL, // config_define_variables
41 NULL, // commands_register
42 NULL, // gui_init
43 NULL, // gui_cleanup
44 NULL, // cleanup
45};
@ MODULE_ID_CORE
ModuleCore, Core NeoMutt objects
Definition module_api.h:62

◆ ModuleEditor

const struct Module ModuleEditor
extern

Module for the Editor library.

Definition at line 36 of file module.c.

36 {
38 "editor",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_EDITOR
ModuleEditor, Edit a string
Definition module_api.h:63

◆ ModuleEmail

const struct Module ModuleEmail
extern

Module for the Email library.

Definition at line 132 of file module.c.

132 {
134 "email",
136 NULL, // config_define_types
139 NULL, // gui_init
140 NULL, // gui_cleanup
142};
static bool email_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:93
static bool email_init(struct NeoMutt *n)
Initialise a Module - Implements Module::init()
Definition module.c:45
static bool email_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:85
static bool email_cleanup(struct NeoMutt *n)
Clean up a Module - Implements Module::cleanup()
Definition module.c:101
@ MODULE_ID_EMAIL
ModuleEmail, Email code
Definition module_api.h:64

◆ ModuleEnvelope

const struct Module ModuleEnvelope
extern

Module for the Envelope library.

Definition at line 36 of file module.c.

36 {
38 "envelope",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_ENVELOPE
ModuleEnvelope, Envelope-editing Window
Definition module_api.h:65

◆ ModuleExpando

const struct Module ModuleExpando
extern

Module for the Expando library.

Definition at line 48 of file module.c.

48 {
50 "expando",
51 NULL, // init
53 NULL, // config_define_variables
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool expando_config_define_types(struct NeoMutt *n, struct ConfigSet *cs)
Set up Config Types - Implements Module::config_define_types()
Definition module.c:40
@ MODULE_ID_EXPANDO
ModuleExpando, Parse Expando string
Definition module_api.h:66

◆ ModuleGui

const struct Module ModuleGui
extern

Module for the Gui library.

Definition at line 48 of file module.c.

48 {
50 "gui",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool gui_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_GUI
ModuleGui, Graphical code
Definition module_api.h:45

◆ ModuleHcache

const struct Module ModuleHcache
extern

Module for the Hcache library.

Definition at line 69 of file module.c.

69 {
71 "hcache",
72 NULL, // init
73 NULL, // config_define_types
75 NULL, // commands_register
76 NULL, // gui_init
77 NULL, // gui_cleanup
78 NULL, // cleanup
79};
static bool hcache_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:43
@ MODULE_ID_HCACHE
ModuleHcache, Email Header Cache
Definition module_api.h:67

◆ ModuleHelpbar

const struct Module ModuleHelpbar
extern

Module for the Helpbar library.

Definition at line 48 of file module.c.

48 {
50 "helpbar",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool helpbar_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_HELPBAR
ModuleHelpbar, Help bar
Definition module_api.h:68

◆ ModuleHistory

const struct Module ModuleHistory
extern

Module for the History library.

Definition at line 48 of file module.c.

48 {
50 "history",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool history_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_HISTORY
ModuleHistory, History
Definition module_api.h:69

◆ ModuleHooks

const struct Module ModuleHooks
extern

Module for the Hooks library.

Definition at line 57 of file module.c.

57 {
59 "hooks",
60 NULL, // init
61 NULL, // config_define_types
64 NULL, // gui_init
65 NULL, // gui_cleanup
66 NULL, // cleanup
67};
static bool hooks_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:49
static bool hooks_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:41
@ MODULE_ID_HOOKS
ModuleHooks, Hook Commands
Definition module_api.h:70

◆ ModuleImap

const struct Module ModuleImap
extern

Module for the Imap library.

Definition at line 65 of file module.c.

65 {
67 "imap",
68 NULL, // init
69 NULL, // config_define_types
72 NULL, // gui_init
73 NULL, // gui_cleanup
74 NULL, // cleanup
75};
static bool imap_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:57
static bool imap_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:43
@ MODULE_ID_IMAP
ModuleImap, Imap Mailbox
Definition module_api.h:71

◆ ModuleIndex

const struct Module ModuleIndex
extern

Module for the Index library.

Definition at line 87 of file module.c.

87 {
89 "index",
91 NULL, // config_define_types
94 NULL, // gui_init
95 NULL, // gui_cleanup
97};
static bool index_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:57
static bool index_init(struct NeoMutt *n)
Initialise a Module - Implements Module::init()
Definition module.c:45
static bool index_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:65
static bool index_cleanup(struct NeoMutt *n)
Clean up a Module - Implements Module::cleanup()
Definition module.c:73
@ MODULE_ID_INDEX
ModuleIndex, Index
Definition module_api.h:72

◆ ModuleKey

const struct Module ModuleKey
extern

Module for the Key library.

Definition at line 47 of file module.c.

47 {
49 "key",
50 NULL, // init
51 NULL, // config_define_types
52 NULL, // config_define_variables
54 NULL, // gui_init
55 NULL, // gui_cleanup
56 NULL, // cleanup
57};
static bool key_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:39
@ MODULE_ID_KEY
ModuleKey, Key mappings
Definition module_api.h:73

◆ ModuleLua

const struct Module ModuleLua
extern

Module for the Lua library.

Definition at line 47 of file module.c.

47 {
49 "lua",
50 NULL, // init
51 NULL, // config_define_types
52 NULL, // config_define_variables
54 NULL, // gui_init
55 NULL, // gui_cleanup
56 NULL, // cleanup
57};
static bool lua_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:39
@ MODULE_ID_LUA
ModuleLua, Integrated Lua scripting
Definition module_api.h:74

◆ ModuleMaildir

const struct Module ModuleMaildir
extern

Module for the Maildir library.

Definition at line 55 of file module.c.

55 {
57 "maildir",
58 NULL, // init
59 NULL, // config_define_types
61 NULL, // commands_register
62 NULL, // gui_init
63 NULL, // gui_cleanup
64 NULL, // cleanup
65};
static bool maildir_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:41
@ MODULE_ID_MAILDIR
ModuleMaildir, Maildir Mailbox
Definition module_api.h:75

◆ ModuleMbox

const struct Module ModuleMbox
extern

Module for the Mbox library.

Definition at line 48 of file module.c.

48 {
50 "mbox",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool mbox_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_MBOX
ModuleMbox, Mbox
Definition module_api.h:76

◆ ModuleMenu

const struct Module ModuleMenu
extern

Module for the Menu library.

Definition at line 48 of file module.c.

48 {
50 "menu",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool menu_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_MENU
ModuleMenu, Menu
Definition module_api.h:77

◆ ModuleMh

const struct Module ModuleMh
extern

Module for the Mh library.

Definition at line 48 of file module.c.

48 {
50 "mh",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
static bool mh_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40
@ MODULE_ID_MH
ModuleMh, Mh Mailbox
Definition module_api.h:78

◆ ModuleMutt

const struct Module ModuleMutt
extern

Module for the Mutt library.

Definition at line 36 of file module.c.

36 {
37 MODULE_ID_MUTT, "mutt",
38 NULL, // init
39 NULL, // config_define_types
40 NULL, // config_define_variables
41 NULL, // commands_register
42 NULL, // gui_init
43 NULL, // gui_cleanup
44 NULL, // cleanup
45};
@ MODULE_ID_MUTT
ModuleMutt, Mutt
Definition module_api.h:79

◆ ModuleNcrypt

const struct Module ModuleNcrypt
extern

Module for the Ncrypt library.

Definition at line 67 of file module.c.

67 {
69 "ncrypt",
70 NULL, // init
71 NULL, // config_define_types
73 NULL, // commands_register
74 NULL, // gui_init
75 NULL, // gui_cleanup
76 NULL, // cleanup
77};
@ MODULE_ID_NCRYPT
ModuleNcrypt, Ncrypt
Definition module_api.h:80
static bool ncrypt_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:43

◆ ModuleNntp

const struct Module ModuleNntp
extern

Module for the Nntp library.

Definition at line 48 of file module.c.

48 {
50 "nntp",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
@ MODULE_ID_NNTP
ModuleNntp, Nntp
Definition module_api.h:81
static bool nntp_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40

◆ ModuleNotmuch

const struct Module ModuleNotmuch
extern

Module for the Notmuch library.

Definition at line 64 of file module.c.

64 {
66 "notmuch",
67 NULL, // init
68 NULL, // config_define_types
71 NULL, // gui_init
72 NULL, // gui_cleanup
73 NULL, // cleanup
74};
@ MODULE_ID_NOTMUCH
ModuleNotmuch, Notmuch
Definition module_api.h:82
static bool notmuch_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:42
static bool notmuch_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:56

◆ ModulePager

const struct Module ModulePager
extern

Module for the Pager library.

Definition at line 48 of file module.c.

48 {
50 "pager",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
@ MODULE_ID_PAGER
ModulePager, Pager
Definition module_api.h:83
static bool pager_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40

◆ ModuleParse

const struct Module ModuleParse
extern

Module for the Parse library.

Definition at line 36 of file module.c.

36 {
38 "parse",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_PARSE
ModuleParse, Text parsing functions
Definition module_api.h:84

◆ ModulePattern

const struct Module ModulePattern
extern

Module for the Pattern library.

Definition at line 48 of file module.c.

48 {
50 "pattern",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
@ MODULE_ID_PATTERN
ModulePattern, Pattern
Definition module_api.h:85
static bool pattern_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40

◆ ModulePop

const struct Module ModulePop
extern

Module for the Pop library.

Definition at line 48 of file module.c.

48 {
50 "pop",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
@ MODULE_ID_POP
ModulePop, Pop
Definition module_api.h:86
static bool pop_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40

◆ ModulePostpone

const struct Module ModulePostpone
extern

Module for the Postpone library.

Definition at line 36 of file module.c.

36 {
38 "postpone",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_POSTPONE
ModulePostpone, Postponed Emails
Definition module_api.h:87

◆ ModuleProgress

const struct Module ModuleProgress
extern

Module for the Progress library.

Definition at line 48 of file module.c.

48 {
50 "progress",
51 NULL, // init
52 NULL, // config_define_types
54 NULL, // commands_register
55 NULL, // gui_init
56 NULL, // gui_cleanup
57 NULL, // cleanup
58};
@ MODULE_ID_PROGRESS
ModuleProgress, Progress Bar
Definition module_api.h:88
static bool progress_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:40

◆ ModuleQuestion

const struct Module ModuleQuestion
extern

Module for the Question library.

Definition at line 36 of file module.c.

36 {
38 "question",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_QUESTION
ModuleQuestion, Question
Definition module_api.h:89

◆ ModuleSend

const struct Module ModuleSend
extern

Module for the Send library.

Definition at line 87 of file module.c.

87 {
89 "send",
91 NULL, // config_define_types
94 NULL, // gui_init
95 NULL, // gui_cleanup
97};
@ MODULE_ID_SEND
ModuleSend, Send
Definition module_api.h:90
static bool send_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:57
static bool send_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:65
static bool send_init(struct NeoMutt *n)
Initialise a Module - Implements Module::init()
Definition module.c:44
static bool send_cleanup(struct NeoMutt *n)
Clean up a Module - Implements Module::cleanup()
Definition module.c:73

◆ ModuleSidebar

const struct Module ModuleSidebar
extern

Module for the Sidebar library.

Definition at line 58 of file module.c.

58 {
60 "sidebar",
61 NULL, // init
62 NULL, // config_define_types
65 NULL, // gui_init
66 NULL, // gui_cleanup
67 NULL, // cleanup
68};
@ MODULE_ID_SIDEBAR
ModuleSidebar, Sidebar
Definition module_api.h:91
static bool sidebar_config_define_variables(struct NeoMutt *n, struct ConfigSet *cs)
Define the Config Variables - Implements Module::config_define_variables()
Definition module.c:42
static bool sidebar_commands_register(struct NeoMutt *n, struct CommandArray *ca)
Register NeoMutt Commands - Implements Module::commands_register()
Definition module.c:50

◆ ModuleStore

const struct Module ModuleStore
extern

Module for the Store library.

Definition at line 36 of file module.c.

36 {
38 "store",
39 NULL, // init
40 NULL, // config_define_types
41 NULL, // config_define_variables
42 NULL, // commands_register
43 NULL, // gui_init
44 NULL, // gui_cleanup
45 NULL, // cleanup
46};
@ MODULE_ID_STORE
ModuleStore, Store
Definition module_api.h:92

◆ Modules

const struct Module* Modules[]
static

All the library Modules.

Definition at line 186 of file main.c.

186 {
187 // clang-format off
188 &ModuleMain, &ModuleGui, // These two have priority
197// clang-format on
198#ifdef USE_AUTOCRYPT
200#endif
201#ifdef USE_HCACHE_COMPRESSION
203#endif
204#ifdef USE_HCACHE
206#endif
207#ifdef USE_LUA
208 &ModuleLua,
209#endif
210#ifdef USE_NOTMUCH
212#endif
213#ifdef USE_HCACHE
215#endif
216 NULL,
217};
const struct Module ModuleAddress
Module for the Address library.
Definition module.c:65
const struct Module ModuleAlias
Module for the Alias library.
Definition module.c:108
const struct Module ModuleAttach
Module for the Attach library.
Definition module.c:108
const struct Module ModuleAutocrypt
Module for the Autocrypt library.
Definition module.c:54
const struct Module ModuleBcache
Module for the Bcache library.
Definition module.c:36
const struct Module ModuleBrowser
Module for the Browser library.
Definition module.c:48
const struct Module ModuleColor
Module for the Color library.
Definition module.c:36
const struct Module ModuleCommands
Module for the Commands library.
Definition module.c:47
const struct Module ModuleComplete
Module for the Complete library.
Definition module.c:36
const struct Module ModuleCompmbox
Module for the Compmbox library.
Definition module.c:47
const struct Module ModuleCompose
Module for the Compose library.
Definition module.c:48
const struct Module ModuleCompress
Module for the Compress library.
Definition module.c:36
const struct Module ModuleConfig
Module for the Config library.
Definition module.c:74
const struct Module ModuleConn
Module for the Conn library.
Definition module.c:77
const struct Module ModuleConvert
Module for the Convert library.
Definition module.c:36
const struct Module ModuleCore
Module for the Core library.
Definition module.c:36
const struct Module ModuleEditor
Module for the Editor library.
Definition module.c:36
const struct Module ModuleEmail
Module for the Email library.
Definition module.c:132
const struct Module ModuleEnvelope
Module for the Envelope library.
Definition module.c:36
const struct Module ModuleExpando
Module for the Expando library.
Definition module.c:48
const struct Module ModulePop
Module for the Pop library.
Definition module.c:48
const struct Module ModuleParse
Module for the Parse library.
Definition module.c:36
const struct Module ModuleMaildir
Module for the Maildir library.
Definition module.c:55
const struct Module ModulePostpone
Module for the Postpone library.
Definition module.c:36
const struct Module ModuleSidebar
Module for the Sidebar library.
Definition module.c:58
const struct Module ModuleMh
Module for the Mh library.
Definition module.c:48
const struct Module ModuleLua
Module for the Lua library.
Definition module.c:47
const struct Module ModulePager
Module for the Pager library.
Definition module.c:48
const struct Module ModuleGui
Module for the Gui library.
Definition module.c:48
const struct Module ModuleProgress
Module for the Progress library.
Definition module.c:48
const struct Module ModuleMenu
Module for the Menu library.
Definition module.c:48
const struct Module ModuleNcrypt
Module for the Ncrypt library.
Definition module.c:67
const struct Module ModuleMutt
Module for the Mutt library.
Definition module.c:36
const struct Module ModuleHcache
Module for the Hcache library.
Definition module.c:69
const struct Module ModuleSend
Module for the Send library.
Definition module.c:87
const struct Module ModuleQuestion
Module for the Question library.
Definition module.c:36
const struct Module ModuleImap
Module for the Imap library.
Definition module.c:65
const struct Module ModuleMain
Module for the Main library.
Definition module.c:48
const struct Module ModuleStore
Module for the Store library.
Definition module.c:36
const struct Module ModuleMbox
Module for the Mbox library.
Definition module.c:48
const struct Module ModulePattern
Module for the Pattern library.
Definition module.c:48
const struct Module ModuleNntp
Module for the Nntp library.
Definition module.c:48
const struct Module ModuleHelpbar
Module for the Helpbar library.
Definition module.c:48
const struct Module ModuleHistory
Module for the History library.
Definition module.c:48
const struct Module ModuleNotmuch
Module for the Notmuch library.
Definition module.c:64
const struct Module ModuleKey
Module for the Key library.
Definition module.c:47
const struct Module ModuleIndex
Module for the Index library.
Definition module.c:87
const struct Module ModuleHooks
Module for the Hooks library.
Definition module.c:57