NeoMutt  2023-05-17-33-gce4425
Teaching an old dog new tricks
DOXYGEN
commands.h File Reference

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

#include "config.h"
#include <stdint.h>
#include "core/lib.h"
#include "config/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_mailboxes (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'mailboxes' command - Implements Command::parse() -. More...
 
enum CommandResult parse_my_hdr (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'my_hdr' command - Implements Command::parse() -. More...
 
enum CommandResult parse_subjectrx_list (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'subjectrx' command - Implements Command::parse() -. More...
 
enum CommandResult parse_subscribe_to (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'subscribe-to' command - Implements Command::parse() -. More...
 
enum CommandResult parse_unalternates (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'unalternates' command - Implements Command::parse() -. More...
 
enum CommandResult parse_unmailboxes (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'unmailboxes' command - Implements Command::parse() -. More...
 
enum CommandResult parse_unsubjectrx_list (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'unsubjectrx' command - Implements Command::parse() -. More...
 
enum CommandResult parse_unsubscribe_from (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'unsubscribe-from' command - Implements Command::parse() -. More...
 
enum CommandResult parse_rc_line_cwd (const char *line, char *cwd, struct Buffer *err)
 Parse and run a muttrc line in a relative directory. More...
 
char * mutt_get_sourced_cwd (void)
 Get the current file path that is being parsed. More...
 
int parse_grouplist (struct GroupList *gl, struct Buffer *buf, struct Buffer *s, struct Buffer *err)
 Parse a group context. More...
 
void clear_source_stack (void)
 Free memory from the stack used for the source command. More...
 
int source_rc (const char *rcfile_path, struct Buffer *err)
 Read an initialization file. More...
 
enum CommandResult set_dump (ConfigDumpFlags flags, struct Buffer *err)
 Dump list of config variables into a file/pager. More...
 

Detailed Description

Functions to parse commands in a config file.

Authors
  • Michael R. Elkins
  • g10 Code GmbH

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 150 of file commands.c.

151{
153
154 enum CommandResult ret = parse_rc_line(line, err);
155
156 struct ListNode *np = STAILQ_FIRST(&MuttrcStack);
158 FREE(&np->data);
159 FREE(&np);
160
161 return ret;
162}
CommandResult
Error codes for command_t parse functions.
Definition: command.h:36
static struct ListHead MuttrcStack
LIFO designed to contain the list of config files that have been sourced and avoid cyclic sourcing.
Definition: commands.c:72
struct ListNode * mutt_list_insert_head(struct ListHead *h, char *s)
Insert a string at the beginning of a List.
Definition: list.c:45
#define FREE(x)
Definition: memory.h:43
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:251
#define STAILQ_REMOVE_HEAD(head, field)
Definition: queue.h:422
#define STAILQ_FIRST(head)
Definition: queue.h:350
enum CommandResult parse_rc_line(const char *line, struct Buffer *err)
Parse a line of user config.
Definition: rc.c:108
#define NONULL(x)
Definition: string2.h:37
A List node for strings.
Definition: list.h:35
char * data
String.
Definition: list.h:36
+ 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 170 of file commands.c.

171{
172 struct ListNode *np = STAILQ_FIRST(&MuttrcStack);
173 if (np && np->data)
174 return mutt_str_dup(np->data);
175
176 // stack is empty, return our own dummy file relative to cwd
177 struct Buffer *cwd = buf_pool_get();
178 mutt_path_getcwd(cwd);
179 buf_addstr(cwd, "/dummy.rc");
180 char *ret = buf_strdup(cwd);
181 buf_pool_release(&cwd);
182 return ret;
183}
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition: buffer.c:236
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
Definition: buffer.c:490
const char * mutt_path_getcwd(struct Buffer *cwd)
Get the current working directory.
Definition: path.c:563
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:106
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:119
String manipulation buffer.
Definition: buffer.h:34
+ 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 buf,
struct Buffer s,
struct Buffer err 
)

Parse a group context.

Parameters
glGroupList to add to
bufTemporary Buffer space
sBuffer containing string to be parsed
errBuffer for error messages
Return values
0Success
-1Error

Definition at line 116 of file commands.c.

118{
119 while (mutt_istr_equal(buf->data, "-group"))
120 {
121 if (!MoreArgs(s))
122 {
123 buf_strcpy(err, _("-group: no group name"));
124 return -1;
125 }
126
128
130
131 if (!MoreArgs(s))
132 {
133 buf_strcpy(err, _("out of arguments"));
134 return -1;
135 }
136
138 }
139
140 return 0;
141}
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition: buffer.c:370
int parse_extract_token(struct Buffer *dest, struct Buffer *tok, TokenFlags flags)
Extract one token from a string.
Definition: extract.c:47
#define MoreArgs(buf)
Definition: extract.h:30
#define TOKEN_NO_FLAGS
No flags are set.
Definition: extract.h:44
void mutt_grouplist_add(struct GroupList *gl, struct Group *group)
Add a Group to a GroupList.
Definition: group.c:182
struct Group * mutt_pattern_group(const char *pat)
Match a pattern to a Group.
Definition: group.c:117
#define _(a)
Definition: message.h:28
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition: string.c:810
char * data
Pointer to data.
Definition: buffer.h:35
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ clear_source_stack()

void clear_source_stack ( void  )

Free memory from the stack used for the source command.

Definition at line 1510 of file commands.c.

1511{
1513}
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
Definition: list.c:122
+ 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 191 of file commands.c.

192{
193 int lineno = 0, rc = 0, warnings = 0;
194 enum CommandResult line_rc;
195 struct Buffer *token = NULL, *linebuf = NULL;
196 char *line = NULL;
197 char *currentline = NULL;
198 char rcfile[PATH_MAX] = { 0 };
199 size_t linelen = 0;
200 pid_t pid;
201
202 mutt_str_copy(rcfile, rcfile_path, sizeof(rcfile));
203
204 size_t rcfilelen = mutt_str_len(rcfile);
205 if (rcfilelen == 0)
206 return -1;
207
208 bool ispipe = rcfile[rcfilelen - 1] == '|';
209
210 if (!ispipe)
211 {
212 struct ListNode *np = STAILQ_FIRST(&MuttrcStack);
213 if (!mutt_path_to_absolute(rcfile, np ? NONULL(np->data) : ""))
214 {
215 mutt_error(_("Error: Can't build path of '%s'"), rcfile_path);
216 return -1;
217 }
218
219 STAILQ_FOREACH(np, &MuttrcStack, entries)
220 {
221 if (mutt_str_equal(np->data, rcfile))
222 {
223 break;
224 }
225 }
226 if (np)
227 {
228 mutt_error(_("Error: Cyclic sourcing of configuration file '%s'"), rcfile);
229 return -1;
230 }
231
233 }
234
235 mutt_debug(LL_DEBUG2, "Reading configuration file '%s'\n", rcfile);
236
237 FILE *fp = mutt_open_read(rcfile, &pid);
238 if (!fp)
239 {
240 buf_printf(err, "%s: %s", rcfile, strerror(errno));
241 return -1;
242 }
243
244 token = buf_pool_get();
245 linebuf = buf_pool_get();
246
247 const char *const c_config_charset = cs_subset_string(NeoMutt->sub, "config_charset");
248 const char *const c_charset = cc_charset();
249 while ((line = mutt_file_read_line(line, &linelen, fp, &lineno, MUTT_RL_CONT)) != NULL)
250 {
251 const bool conv = c_config_charset && c_charset;
252 if (conv)
253 {
254 currentline = mutt_str_dup(line);
255 if (!currentline)
256 continue;
257 mutt_ch_convert_string(&currentline, c_config_charset, c_charset, MUTT_ICONV_NO_FLAGS);
258 }
259 else
260 {
261 currentline = line;
262 }
263
264 buf_strcpy(linebuf, currentline);
265
266 buf_reset(err);
267 line_rc = parse_rc_buffer(linebuf, token, err);
268 if (line_rc == MUTT_CMD_ERROR)
269 {
270 mutt_error(_("Error in %s, line %d: %s"), rcfile, lineno, err->data);
271 if (--rc < -MAX_ERRS)
272 {
273 if (conv)
274 FREE(&currentline);
275 break;
276 }
277 }
278 else if (line_rc == MUTT_CMD_WARNING)
279 {
280 /* Warning */
281 mutt_warning(_("Warning in %s, line %d: %s"), rcfile, lineno, err->data);
282 warnings++;
283 }
284 else if (line_rc == MUTT_CMD_FINISH)
285 {
286 if (conv)
287 FREE(&currentline);
288 break; /* Found "finish" command */
289 }
290 else
291 {
292 if (rc < 0)
293 rc = -1;
294 }
295 if (conv)
296 FREE(&currentline);
297 }
298
299 FREE(&line);
300 mutt_file_fclose(&fp);
301 if (pid != -1)
302 filter_wait(pid);
303
304 if (rc)
305 {
306 /* the neomuttrc source keyword */
307 buf_reset(err);
308 buf_printf(err, (rc >= -MAX_ERRS) ? _("source: errors in %s") : _("source: reading aborted due to too many errors in %s"),
309 rcfile);
310 rc = -1;
311 }
312 else
313 {
314 /* Don't alias errors with warnings */
315 if (warnings > 0)
316 {
317 buf_printf(err, ngettext("source: %d warning in %s", "source: %d warnings in %s", warnings),
318 warnings, rcfile);
319 rc = -2;
320 }
321 }
322
323 if (!ispipe && !STAILQ_EMPTY(&MuttrcStack))
324 {
325 struct ListNode *np = STAILQ_FIRST(&MuttrcStack);
327 FREE(&np->data);
328 FREE(&np);
329 }
330
331 buf_pool_release(&token);
332 buf_pool_release(&linebuf);
333 return rc;
334}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition: buffer.c:171
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:86
const char * cc_charset(void)
Get the cached value of $charset.
Definition: cache.c:106
@ MUTT_CMD_ERROR
Error: Can't help the user.
Definition: command.h:37
@ MUTT_CMD_WARNING
Warning: Help given to the user.
Definition: command.h:38
@ MUTT_CMD_FINISH
Finish: Stop processing this file.
Definition: command.h:40
#define MAX_ERRS
Definition: commands.c:74
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:317
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:738
int mutt_file_fclose(FILE **fp)
Close a FILE handle (and NULL the pointer)
Definition: file.c:150
#define MUTT_RL_CONT
-continuation
Definition: file.h:40
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
Definition: filter.c:217
#define mutt_warning(...)
Definition: logging2.h:85
#define mutt_error(...)
Definition: logging2.h:87
#define mutt_debug(LEVEL,...)
Definition: logging2.h:84
@ LL_DEBUG2
Log at debug level 2.
Definition: logging2.h:41
int mutt_ch_convert_string(char **ps, const char *from, const char *to, uint8_t flags)
Convert a string between encodings.
Definition: charset.c:822
#define MUTT_ICONV_NO_FLAGS
No flags are set.
Definition: charset.h:71
bool mutt_path_to_absolute(char *path, const char *reference)
Convert relative filepath to an absolute path.
Definition: path.c:397
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:798
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition: string.c:568
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:653
#define PATH_MAX
Definition: mutt.h:41
FILE * mutt_open_read(const char *path, pid_t *thepid)
Run a command to read from.
Definition: muttlib.c:1280
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
#define STAILQ_EMPTY(head)
Definition: queue.h:348
enum CommandResult parse_rc_buffer(struct Buffer *line, struct Buffer *token, struct Buffer *err)
Parse a line of user config.
Definition: rc.c:50
Container for Accounts, Notifications.
Definition: neomutt.h:37
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:39
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ set_dump()

enum CommandResult set_dump ( ConfigDumpFlags  flags,
struct Buffer err 
)

Dump list of config variables into a file/pager.

Parameters
flagswhat configs to dump: see ConfigDumpFlags
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 736 of file commands.c.

737{
738 char tempfile[PATH_MAX] = { 0 };
739 mutt_mktemp(tempfile, sizeof(tempfile));
740
741 FILE *fp_out = mutt_file_fopen(tempfile, "w");
742 if (!fp_out)
743 {
744 // L10N: '%s' is the file name of the temporary file
745 buf_printf(err, _("Could not create temporary file %s"), tempfile);
746 return MUTT_CMD_ERROR;
747 }
748
749 dump_config(NeoMutt->sub->cs, flags, fp_out);
750
751 mutt_file_fclose(&fp_out);
752
753 struct PagerData pdata = { 0 };
754 struct PagerView pview = { &pdata };
755
756 pdata.fname = tempfile;
757
758 pview.banner = "set";
760 pview.mode = PAGER_MODE_OTHER;
761
762 mutt_do_pager(&pview, NULL);
763
764 return MUTT_CMD_SUCCESS;
765}
@ MUTT_CMD_SUCCESS
Success: Command worked.
Definition: command.h:39
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:123
bool dump_config(struct ConfigSet *cs, ConfigDumpFlags flags, FILE *fp)
Write all the config to a file.
Definition: dump.c:165
FILE * mutt_file_fopen(const char *path, const char *mode)
Call fopen() safely.
Definition: file.c:634
#define MUTT_PAGER_NO_FLAGS
No flags are set.
Definition: lib.h:59
@ PAGER_MODE_OTHER
Pager is invoked via 3rd path. Non-email content is likely to be shown.
Definition: lib.h:140
struct ConfigSet * cs
Parent ConfigSet.
Definition: subset.h:51
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
#define mutt_mktemp(buf, buflen)
Definition: tmp.h:34
+ Here is the call graph for this function:
+ Here is the caller graph for this function: