NeoMutt  2023-05-17-56-ga67199
Teaching an old dog new tricks
DOXYGEN
commands.c
Go to the documentation of this file.
1
29#include "config.h"
30#include <stdint.h>
31#include <stdio.h>
32#include "mutt/lib.h"
33#include "address/lib.h"
34#include "config/lib.h"
35#include "core/lib.h"
36#include "commands.h"
37#include "lib.h"
38#include "parse/lib.h"
39#include "alias.h"
40#include "reverse.h"
41
47enum CommandResult parse_alias(struct Buffer *buf, struct Buffer *s,
48 intptr_t data, struct Buffer *err)
49{
50 struct Alias *tmp = NULL;
51 struct GroupList gl = STAILQ_HEAD_INITIALIZER(gl);
52 enum NotifyAlias event;
53
54 if (!MoreArgs(s))
55 {
56 buf_strcpy(err, _("alias: no address"));
57 return MUTT_CMD_WARNING;
58 }
59
60 /* name */
62 mutt_debug(LL_DEBUG5, "First token is '%s'\n", buf->data);
63 if (parse_grouplist(&gl, buf, s, err) == -1)
64 {
65 return MUTT_CMD_ERROR;
66 }
67 char *name = mutt_str_dup(buf->data);
68
69 /* address list */
71 mutt_debug(LL_DEBUG5, "Second token is '%s'\n", buf->data);
72 struct AddressList al = TAILQ_HEAD_INITIALIZER(al);
73 int parsed = mutt_addrlist_parse2(&al, buf->data);
74 if (parsed == 0)
75 {
76 buf_printf(err, _("Warning: Bad address '%s' in alias '%s'"), buf->data, name);
77 FREE(&name);
78 goto bail;
79 }
80
81 /* IDN */
82 char *estr = NULL;
83 if (mutt_addrlist_to_intl(&al, &estr))
84 {
85 buf_printf(err, _("Warning: Bad IDN '%s' in alias '%s'"), estr, name);
86 FREE(&name);
87 FREE(&estr);
88 goto bail;
89 }
90
91 /* check to see if an alias with this name already exists */
92 TAILQ_FOREACH(tmp, &Aliases, entries)
93 {
94 if (mutt_istr_equal(tmp->name, name))
95 break;
96 }
97
98 if (tmp)
99 {
100 FREE(&name);
102 /* override the previous value */
104 FREE(&tmp->comment);
105 event = NT_ALIAS_CHANGE;
106 }
107 else
108 {
109 /* create a new alias */
110 tmp = alias_new();
111 tmp->name = name;
112 TAILQ_INSERT_TAIL(&Aliases, tmp, entries);
113 event = NT_ALIAS_ADD;
114 }
115 tmp->addr = al;
116
118
119 const short c_debug_level = cs_subset_number(NeoMutt->sub, "debug_level");
120 if (c_debug_level > LL_DEBUG4)
121 {
122 /* A group is terminated with an empty address, so check a->mailbox */
123 struct Address *a = NULL;
124 TAILQ_FOREACH(a, &tmp->addr, entries)
125 {
126 if (!a->mailbox)
127 break;
128
129 if (a->group)
130 mutt_debug(LL_DEBUG5, " Group %s\n", a->mailbox);
131 else
132 mutt_debug(LL_DEBUG5, " %s\n", a->mailbox);
133 }
134 }
136 if (!MoreArgs(s) && (s->dptr[0] == '#'))
137 {
138 char *comment = s->dptr + 1;
139 SKIPWS(comment);
140 tmp->comment = mutt_str_dup(comment);
141 }
142
144
145 mutt_debug(LL_NOTIFY, "%s: %s\n",
146 (event == NT_ALIAS_ADD) ? "NT_ALIAS_ADD" : "NT_ALIAS_CHANGE", tmp->name);
147 struct EventAlias ev_a = { tmp };
148 notify_send(NeoMutt->notify, NT_ALIAS, event, &ev_a);
149
150 return MUTT_CMD_SUCCESS;
151
152bail:
154 return MUTT_CMD_ERROR;
155}
156
160enum CommandResult parse_unalias(struct Buffer *buf, struct Buffer *s,
161 intptr_t data, struct Buffer *err)
162{
163 do
164 {
166
167 struct Alias *np = NULL;
168 if (mutt_str_equal("*", buf->data))
169 {
170 TAILQ_FOREACH(np, &Aliases, entries)
171 {
173 }
174
176 return MUTT_CMD_SUCCESS;
177 }
178
179 TAILQ_FOREACH(np, &Aliases, entries)
180 {
181 if (!mutt_istr_equal(buf->data, np->name))
182 continue;
183
184 TAILQ_REMOVE(&Aliases, np, entries);
186 alias_free(&np);
187 break;
188 }
189 } while (MoreArgs(s));
190 return MUTT_CMD_SUCCESS;
191}
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
Definition: address.c:1449
int mutt_addrlist_parse2(struct AddressList *al, const char *s)
Parse a list of email addresses.
Definition: address.c:629
int mutt_addrlist_to_intl(struct AddressList *al, char **err)
Convert an Address list to Punycode.
Definition: address.c:1282
Email Address Handling.
void alias_free(struct Alias **ptr)
Free an Alias.
Definition: alias.c:639
struct AliasList Aliases
List of all the user's email aliases.
Definition: alias.c:58
struct Alias * alias_new(void)
Create a new Alias.
Definition: alias.c:628
void aliaslist_free(struct AliasList *al)
Free a List of Aliases.
Definition: alias.c:660
Representation of a single alias to an email address.
NotifyAlias
Alias notification types.
Definition: alias.h:53
@ NT_ALIAS_ADD
Alias has been added.
Definition: alias.h:54
@ NT_ALIAS_CHANGE
Alias has been changed.
Definition: alias.h:57
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition: buffer.c:173
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition: buffer.c:401
CommandResult
Error codes for command_t parse functions.
Definition: command.h:36
@ MUTT_CMD_SUCCESS
Success: Command worked.
Definition: command.h:39
@ 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
int parse_grouplist(struct GroupList *gl, struct Buffer *buf, struct Buffer *s, struct Buffer *err)
Parse a group context.
Definition: commands.c:116
Functions to parse commands in a config file.
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition: helpers.c:169
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
int parse_extract_token(struct Buffer *dest, struct Buffer *tok, TokenFlags flags)
Extract one token from a string.
Definition: extract.c:47
#define TOKEN_SPACE
Don't treat whitespace as a term.
Definition: extract.h:47
#define TOKEN_QUOTE
Don't interpret quotes.
Definition: extract.h:48
#define MoreArgs(buf)
Definition: extract.h:30
#define TOKEN_SEMICOLON
Don't treat ; as special.
Definition: extract.h:51
#define TOKEN_NO_FLAGS
No flags are set.
Definition: extract.h:44
void mutt_grouplist_destroy(struct GroupList *gl)
Free a GroupList.
Definition: group.c:202
void mutt_grouplist_add_addrlist(struct GroupList *gl, struct AddressList *al)
Add Address list to a GroupList.
Definition: group.c:271
enum CommandResult parse_alias(struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
Parse the 'alias' command - Implements Command::parse() -.
Definition: commands.c:47
enum CommandResult parse_unalias(struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
Parse the 'unalias' command - Implements Command::parse() -.
Definition: commands.c:160
#define mutt_debug(LEVEL,...)
Definition: logging2.h:87
@ LL_DEBUG4
Log at debug level 4.
Definition: logging2.h:46
@ LL_DEBUG5
Log at debug level 5.
Definition: logging2.h:47
@ LL_NOTIFY
Log of notifications.
Definition: logging2.h:48
#define FREE(x)
Definition: memory.h:43
Convenience wrapper for the library headers.
#define _(a)
Definition: message.h:28
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition: notify.c:171
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition: string.c:810
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:251
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:798
@ NT_ALIAS
Alias has changed, NotifyAlias, EventAlias.
Definition: notify_type.h:37
Text parsing functions.
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:725
#define STAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:324
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:809
#define TAILQ_REMOVE(head, elm, field)
Definition: queue.h:841
#define TAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:637
void alias_reverse_add(struct Alias *alias)
Add an email address lookup for an Alias.
Definition: reverse.c:61
void alias_reverse_delete(struct Alias *alias)
Remove an email address lookup for an Alias.
Definition: reverse.c:83
Manage alias reverse lookups.
Key value store.
#define SKIPWS(ch)
Definition: string2.h:45
An email address.
Definition: address.h:36
bool group
Group mailbox?
Definition: address.h:39
struct Buffer * mailbox
Mailbox and host address.
Definition: address.h:38
A shortcut for an email address or addresses.
Definition: alias.h:34
char * comment
Free-form comment string.
Definition: alias.h:37
char * name
Short name.
Definition: alias.h:35
struct AddressList addr
List of Addresses the Alias expands to.
Definition: alias.h:36
String manipulation buffer.
Definition: buffer.h:34
char * dptr
Current read/write position.
Definition: buffer.h:36
char * data
Pointer to data.
Definition: buffer.h:35
An alias-change event.
Definition: alias.h:64
Container for Accounts, Notifications.
Definition: neomutt.h:37
struct Notify * notify
Notifications handler.
Definition: neomutt.h:38
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:39