NeoMutt  2025-12-11-58-g09398d
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
commands.h File Reference

Functions to parse commands in a config file. More...

#include "config.h"
#include <stdbool.h>
#include "config/lib.h"
#include "core/lib.h"
+ Include dependency graph for commands.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define MUTT_NAMED   (1 << 0)
 

Functions

enum CommandResult parse_cd (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'cd' command - Implements Command::parse() -.
 
enum CommandResult parse_echo (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'echo' command - Implements Command::parse() -.
 
enum CommandResult parse_finish (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'finish' command - Implements Command::parse() -.
 
enum CommandResult parse_group (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'group' and 'ungroup' commands - Implements Command::parse() -.
 
enum CommandResult parse_ifdef (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'ifdef' and 'ifndef' commands - Implements Command::parse() -.
 
enum CommandResult parse_ignore (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'ignore' command - Implements Command::parse() -.
 
enum CommandResult parse_lists (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'lists' command - Implements Command::parse() -.
 
enum CommandResult parse_mailboxes (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'mailboxes' command - Implements Command::parse() -.
 
enum CommandResult parse_my_hdr (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'my_hdr' command - Implements Command::parse() -.
 
enum CommandResult parse_nospam (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'nospam' command - Implements Command::parse() -.
 
enum CommandResult parse_setenv (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'setenv' and 'unsetenv' commands - Implements Command::parse() -.
 
enum CommandResult parse_source (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'source' command - Implements Command::parse() -.
 
enum CommandResult parse_spam (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'spam' command - Implements Command::parse() -.
 
enum CommandResult parse_stailq (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse a list command - Implements Command::parse() -.
 
enum CommandResult parse_subjectrx_list (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'subjectrx' command - Implements Command::parse() -.
 
enum CommandResult parse_subscribe (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'subscribe' command - Implements Command::parse() -.
 
enum CommandResult parse_subscribe_to (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'subscribe-to' command - Implements Command::parse() -.
 
enum CommandResult parse_tag_formats (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'tag-formats' command - Implements Command::parse() -.
 
enum CommandResult parse_tag_transforms (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'tag-transforms' command - Implements Command::parse() -.
 
enum CommandResult parse_unalternates (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'unalternates' command - Implements Command::parse() -.
 
enum CommandResult parse_unignore (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'unignore' command - Implements Command::parse() -.
 
enum CommandResult parse_unlists (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'unlists' command - Implements Command::parse() -.
 
enum CommandResult parse_unmailboxes (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'unmailboxes' command - Implements Command::parse() -.
 
enum CommandResult parse_unmy_hdr (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'unmy_hdr' command - Implements Command::parse() -.
 
enum CommandResult parse_unstailq (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse an unlist command - Implements Command::parse() -.
 
enum CommandResult parse_unsubjectrx_list (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'unsubjectrx' command - Implements Command::parse() -.
 
enum CommandResult parse_unsubscribe (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'unsubscribe' command - Implements Command::parse() -.
 
enum CommandResult parse_unsubscribe_from (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'unsubscribe-from' command - Implements Command::parse() -.
 
enum CommandResult parse_version (const struct Command *cmd, struct Buffer *line, struct Buffer *err)
 Parse the 'version' command - Implements Command::parse() -.
 
enum CommandResult parse_rc_line_cwd (const char *line, char *cwd, struct Buffer *err)
 Parse and run a muttrc line in a relative directory.
 
char * mutt_get_sourced_cwd (void)
 Get the current file path that is being parsed.
 
bool mailbox_add_simple (const char *mailbox, struct Buffer *err)
 Add a new Mailbox.
 
int parse_grouplist (struct GroupList *gl, struct Buffer *buf, struct Buffer *s, struct Buffer *err, struct HashTable *groups)
 Parse a group context.
 
void source_stack_cleanup (void)
 Free memory from the stack used for the source command.
 
int source_rc (const char *rcfile_path, struct Buffer *err)
 Read an initialization file.
 
enum CommandResult set_dump (enum GetElemListFlags flags, struct Buffer *err)
 Dump list of config variables into a file/pager.
 

Detailed Description

Functions to parse commands in a config file.

Authors
  • Richard Russon

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 commands.h.

Macro Definition Documentation

◆ MUTT_NAMED

#define MUTT_NAMED   (1 << 0)

Definition at line 36 of file commands.h.

Function Documentation

◆ parse_rc_line_cwd()

enum CommandResult parse_rc_line_cwd ( const char * line,
char * cwd,
struct Buffer * err )

Parse and run a muttrc line in a relative directory.

Parameters
lineLine to be parsed
cwdFile relative where to run the line
errWhere to write error messages
Return values
CommandResultResult e.g. MUTT_CMD_SUCCESS

Definition at line 179 of file commands.c.

180{
182
183 struct Buffer *buf = buf_pool_get();
184 buf_strcpy(buf, line);
185 enum CommandResult ret = parse_rc_line(buf, err);
186 buf_pool_release(&buf);
187
188 struct ListNode *np = STAILQ_FIRST(&MuttrcStack);
190 FREE(&np->data);
191 FREE(&np);
192
193 return ret;
194}
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition buffer.c:395
CommandResult
Error codes for command_t parse functions.
Definition command.h:35
static struct ListHead MuttrcStack
LIFO designed to contain the list of config files that have been sourced and avoid cyclic sourcing.
Definition commands.c:77
struct ListNode * mutt_list_insert_head(struct ListHead *h, char *s)
Insert a string at the beginning of a List.
Definition list.c:46
#define FREE(x)
Definition memory.h:62
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition string.c:255
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:82
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:96
#define STAILQ_REMOVE_HEAD(head, field)
Definition queue.h:461
#define STAILQ_FIRST(head)
Definition queue.h:388
enum CommandResult parse_rc_line(struct Buffer *line, struct Buffer *err)
Parse a line of user config.
Definition rc.c:45
#define NONULL(x)
Definition string2.h:43
String manipulation buffer.
Definition buffer.h:36
A List node for strings.
Definition list.h:37
char * data
String.
Definition list.h:38
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_get_sourced_cwd()

char * mutt_get_sourced_cwd ( void )

Get the current file path that is being parsed.

Return values
ptrFile path that is being parsed or cwd at runtime
Note
Caller is responsible for freeing returned string

Definition at line 202 of file commands.c.

203{
204 struct ListNode *np = STAILQ_FIRST(&MuttrcStack);
205 if (np && np->data)
206 return mutt_str_dup(np->data);
207
208 // stack is empty, return our own dummy file relative to cwd
209 struct Buffer *cwd = buf_pool_get();
210 mutt_path_getcwd(cwd);
211 buf_addstr(cwd, "/dummy.rc");
212 char *ret = buf_strdup(cwd);
213 buf_pool_release(&cwd);
214 return ret;
215}
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition buffer.c:226
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
Definition buffer.c:571
const char * mutt_path_getcwd(struct Buffer *cwd)
Get the current working directory.
Definition path.c:476
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_add_simple()

bool mailbox_add_simple ( const char * mailbox,
struct Buffer * err )

Add a new Mailbox.

Parameters
mailboxMailbox to add
errBuffer for error messages
Return values
trueSuccess

Definition at line 796 of file commands.c.

797{
798 enum CommandResult rc = mailbox_add("", mailbox, NULL, TB_UNSET, TB_UNSET, err);
799
800 return (rc == MUTT_CMD_SUCCESS);
801}
@ MUTT_CMD_SUCCESS
Success: Command worked.
Definition command.h:38
static enum CommandResult mailbox_add(const char *folder, const char *mailbox, const char *label, enum TriBool poll, enum TriBool notify, struct Buffer *err)
Add a new Mailbox.
Definition commands.c:692
@ TB_UNSET
Value hasn't been set.
Definition commands.c:86
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ parse_grouplist()

int parse_grouplist ( struct GroupList * gl,
struct Buffer * token,
struct Buffer * line,
struct Buffer * err,
struct HashTable * groups )

Parse a group context.

Parameters
glGroupList to add to
tokenTemporary Buffer space
lineBuffer containing string to be parsed
errBuffer for error messages
groupsGroups HashTable
Return values
0Success
-1Error

Definition at line 145 of file commands.c.

147{
148 while (mutt_istr_equal(token->data, "-group"))
149 {
150 if (!MoreArgs(line))
151 {
152 buf_strcpy(err, _("-group: no group name"));
153 return -1;
154 }
155
157
158 grouplist_add_group(gl, groups_get_group(groups, token->data));
159
160 if (!MoreArgs(line))
161 {
162 buf_strcpy(err, _("out of arguments"));
163 return -1;
164 }
165
167 }
168
169 return 0;
170}
int parse_extract_token(struct Buffer *dest, struct Buffer *line, TokenFlags flags)
Extract one token from a string.
Definition extract.c:48
#define MoreArgs(buf)
Definition extract.h:30
#define TOKEN_NO_FLAGS
No flags are set.
Definition extract.h:44
struct Group * groups_get_group(struct HashTable *groups, const char *name)
Get a Group by its name.
Definition group.c:291
void grouplist_add_group(struct GroupList *gl, struct Group *g)
Add a Group to a GroupList.
Definition group.c:183
#define _(a)
Definition message.h:28
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition string.c:672
char * data
Pointer to data.
Definition buffer.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ source_stack_cleanup()

void source_stack_cleanup ( void )

Free memory from the stack used for the source command.

Definition at line 1936 of file commands.c.

1937{
1939}
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
Definition list.c:123
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ source_rc()

int source_rc ( const char * rcfile_path,
struct Buffer * err )

Read an initialization file.

Parameters
rcfile_pathPath to initialization file
errBuffer for error messages
Return values
<0NeoMutt should pause to let the user know

Definition at line 223 of file commands.c.

224{
225 int lineno = 0, rc = 0, warnings = 0;
226 enum CommandResult line_rc;
227 struct Buffer *linebuf = NULL;
228 char *line = NULL;
229 char *currentline = NULL;
230 char rcfile[PATH_MAX + 1] = { 0 };
231 size_t linelen = 0;
232 pid_t pid;
233
234 mutt_str_copy(rcfile, rcfile_path, sizeof(rcfile));
235
236 size_t rcfilelen = mutt_str_len(rcfile);
237 if (rcfilelen == 0)
238 return -1;
239
240 bool ispipe = rcfile[rcfilelen - 1] == '|';
241
242 if (!ispipe)
243 {
244 struct ListNode *np = STAILQ_FIRST(&MuttrcStack);
245 if (!mutt_path_to_absolute(rcfile, np ? NONULL(np->data) : ""))
246 {
247 mutt_error(_("Error: Can't build path of '%s'"), rcfile_path);
248 return -1;
249 }
250
251 STAILQ_FOREACH(np, &MuttrcStack, entries)
252 {
253 if (mutt_str_equal(np->data, rcfile))
254 {
255 break;
256 }
257 }
258 if (np)
259 {
260 mutt_error(_("Error: Cyclic sourcing of configuration file '%s'"), rcfile);
261 return -1;
262 }
263
265 }
266
267 mutt_debug(LL_DEBUG2, "Reading configuration file '%s'\n", rcfile);
268
269 FILE *fp = mutt_open_read(rcfile, &pid);
270 if (!fp)
271 {
272 buf_printf(err, "%s: %s", rcfile, strerror(errno));
273 return -1;
274 }
275
276 linebuf = buf_pool_get();
277
278 const char *const c_config_charset = cs_subset_string(NeoMutt->sub, "config_charset");
279 const char *const c_charset = cc_charset();
280 while ((line = mutt_file_read_line(line, &linelen, fp, &lineno, MUTT_RL_CONT)) != NULL)
281 {
282 const bool conv = c_config_charset && c_charset;
283 if (conv)
284 {
285 currentline = mutt_str_dup(line);
286 if (!currentline)
287 continue;
288 mutt_ch_convert_string(&currentline, c_config_charset, c_charset, MUTT_ICONV_NO_FLAGS);
289 }
290 else
291 {
292 currentline = line;
293 }
294
295 buf_strcpy(linebuf, currentline);
296
297 buf_reset(err);
298 line_rc = parse_rc_line(linebuf, err);
299 if (line_rc == MUTT_CMD_ERROR)
300 {
301 mutt_error("%s:%d: %s", rcfile, lineno, buf_string(err));
302 if (--rc < -MAX_ERRS)
303 {
304 if (conv)
305 FREE(&currentline);
306 break;
307 }
308 }
309 else if (line_rc == MUTT_CMD_WARNING)
310 {
311 /* Warning */
312 mutt_warning("%s:%d: %s", rcfile, lineno, buf_string(err));
313 warnings++;
314 }
315 else if (line_rc == MUTT_CMD_FINISH)
316 {
317 if (conv)
318 FREE(&currentline);
319 break; /* Found "finish" command */
320 }
321 else
322 {
323 if (rc < 0)
324 rc = -1;
325 }
326 if (conv)
327 FREE(&currentline);
328 }
329
330 FREE(&line);
331 mutt_file_fclose(&fp);
332 if (pid != -1)
333 filter_wait(pid);
334
335 if (rc)
336 {
337 /* the neomuttrc source keyword */
338 buf_reset(err);
339 buf_printf(err, (rc >= -MAX_ERRS) ? _("source: errors in %s") : _("source: reading aborted due to too many errors in %s"),
340 rcfile);
341 rc = -1;
342 }
343 else
344 {
345 /* Don't alias errors with warnings */
346 if (warnings > 0)
347 {
348 buf_printf(err, ngettext("source: %d warning in %s", "source: %d warnings in %s", warnings),
349 warnings, rcfile);
350 rc = -2;
351 }
352 }
353
354 if (!ispipe && !STAILQ_EMPTY(&MuttrcStack))
355 {
356 struct ListNode *np = STAILQ_FIRST(&MuttrcStack);
358 FREE(&np->data);
359 FREE(&np);
360 }
361
362 buf_pool_release(&linebuf);
363 return rc;
364}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition buffer.c:161
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition buffer.c:76
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
@ MUTT_CMD_ERROR
Error: Can't help the user.
Definition command.h:36
@ MUTT_CMD_WARNING
Warning: Help given to the user.
Definition command.h:37
@ MUTT_CMD_FINISH
Finish: Stop processing this file.
Definition command.h:39
#define MAX_ERRS
Definition commands.c:79
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition helpers.c:291
const char * cc_charset(void)
Get the cached value of $charset.
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:685
#define MUTT_RL_CONT
-continuation
Definition file.h:41
#define mutt_file_fclose(FP)
Definition file.h:139
#define mutt_warning(...)
Definition logging2.h:91
#define mutt_error(...)
Definition logging2.h:93
#define mutt_debug(LEVEL,...)
Definition logging2.h:90
@ LL_DEBUG2
Log at debug level 2.
Definition logging2.h:45
int mutt_ch_convert_string(char **ps, const char *from, const char *to, uint8_t flags)
Convert a string between encodings.
Definition charset.c:831
#define MUTT_ICONV_NO_FLAGS
No flags are set.
Definition charset.h:64
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
Definition filter.c:220
bool mutt_path_to_absolute(char *path, const char *reference)
Convert a relative path to its absolute form.
Definition path.c:333
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:660
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition string.c:498
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
Definition string.c:581
#define PATH_MAX
Definition mutt.h:42
FILE * mutt_open_read(const char *path, pid_t *thepid)
Run a command to read from.
Definition muttlib.c:699
#define STAILQ_FOREACH(var, head, field)
Definition queue.h:390
#define STAILQ_EMPTY(head)
Definition queue.h:382
Container for Accounts, Notifications.
Definition neomutt.h:43
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ set_dump()

enum CommandResult set_dump ( enum GetElemListFlags flags,
struct Buffer * err )

Dump list of config variables into a file/pager.

Parameters
flagsWhich config to dump, e.g. GEL_CHANGED_CONFIG
errBuffer for error message
Returns
num See CommandResult

FIXME: Move me into parse/set.c. Note: this function currently depends on pager, which is the reason it is not included in the parse library.

Definition at line 968 of file commands.c.

969{
970 struct Buffer *tempfile = buf_pool_get();
971 buf_mktemp(tempfile);
972
973 FILE *fp_out = mutt_file_fopen(buf_string(tempfile), "w");
974 if (!fp_out)
975 {
976 // L10N: '%s' is the file name of the temporary file
977 buf_printf(err, _("Could not create temporary file %s"), buf_string(tempfile));
978 buf_pool_release(&tempfile);
979 return MUTT_CMD_ERROR;
980 }
981
982 struct ConfigSet *cs = NeoMutt->sub->cs;
983 struct HashElemArray hea = get_elem_list(cs, flags);
984 dump_config(cs, &hea, CS_DUMP_NO_FLAGS, fp_out);
985 ARRAY_FREE(&hea);
986
987 mutt_file_fclose(&fp_out);
988
989 struct PagerData pdata = { 0 };
990 struct PagerView pview = { &pdata };
991
992 pdata.fname = buf_string(tempfile);
993
994 pview.banner = "set";
996 pview.mode = PAGER_MODE_OTHER;
997
998 mutt_do_pager(&pview, NULL);
999 buf_pool_release(&tempfile);
1000
1001 return MUTT_CMD_SUCCESS;
1002}
#define ARRAY_FREE(head)
Release all memory.
Definition array.h:204
bool dump_config(struct ConfigSet *cs, struct HashElemArray *hea, ConfigDumpFlags flags, FILE *fp)
Write all the config to a file.
Definition dump.c:196
#define CS_DUMP_NO_FLAGS
No flags are set.
Definition dump.h:36
int mutt_do_pager(struct PagerView *pview, struct Email *e)
Display some page-able text to the user (help or attachment)
Definition do_pager.c:122
#define mutt_file_fopen(PATH, MODE)
Definition file.h:138
#define MUTT_PAGER_NO_FLAGS
No flags are set.
Definition lib.h:60
@ PAGER_MODE_OTHER
Pager is invoked via 3rd path. Non-email content is likely to be shown.
Definition lib.h:140
Container for lots of config items.
Definition set.h:248
struct ConfigSet * cs
Parent ConfigSet.
Definition subset.h:50
Data to be displayed by PagerView.
Definition lib.h:159
const char * fname
Name of the file to read.
Definition lib.h:163
Paged view into some data.
Definition lib.h:170
struct PagerData * pdata
Data that pager displays. NOTNULL.
Definition lib.h:171
enum PagerMode mode
Pager mode.
Definition lib.h:172
PagerFlags flags
Additional settings to tweak pager's function.
Definition lib.h:173
const char * banner
Title to display in status bar.
Definition lib.h:174
struct HashElemArray get_elem_list(struct ConfigSet *cs, enum GetElemListFlags flags)
Create a sorted list of all config items.
Definition subset.c:81
#define buf_mktemp(buf)
Definition tmp.h:33
+ Here is the call graph for this function:
+ Here is the caller graph for this function: