NeoMutt  2024-04-25-85-g27bab4
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
util.c File Reference

IMAP helper functions. More...

#include "config.h"
#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
#include <netdb.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "private.h"
#include "mutt/lib.h"
#include "config/lib.h"
#include "email/lib.h"
#include "core/lib.h"
#include "conn/lib.h"
#include "lib.h"
#include "bcache/lib.h"
#include "question/lib.h"
#include "adata.h"
#include "edata.h"
#include "globals.h"
#include "mdata.h"
#include "msn.h"
#include "mutt_account.h"
#include "hcache/lib.h"
+ Include dependency graph for util.c:

Go to the source code of this file.

Functions

int imap_adata_find (const char *path, struct ImapAccountData **adata, struct ImapMboxData **mdata)
 Find the Account data for this path.
 
void imap_mdata_cache_reset (struct ImapMboxData *mdata)
 Release and clear cache data of ImapMboxData structure.
 
void imap_get_parent (const char *mbox, char delim, char *buf, size_t buflen)
 Get an IMAP folder's parent.
 
void imap_get_parent_path (const char *path, char *buf, size_t buflen)
 Get the path of the parent folder.
 
void imap_clean_path (char *path, size_t plen)
 Cleans an IMAP path using imap_fix_path.
 
static const char * imap_get_field (enum ConnAccountField field, void *gf_data)
 Get connection login credentials - Implements ConnAccount::get_field() -.
 
static void imap_msn_index_to_uid_seqset (struct Buffer *buf, struct ImapMboxData *mdata)
 Convert MSN index of UIDs to Seqset.
 
static void imap_hcache_namer (const char *path, struct Buffer *dest)
 Generate a filename for the header cache - Implements hcache_namer_t -.
 
void imap_hcache_open (struct ImapAccountData *adata, struct ImapMboxData *mdata, bool create)
 Open a header cache.
 
void imap_hcache_close (struct ImapMboxData *mdata)
 Close the header cache.
 
struct Emailimap_hcache_get (struct ImapMboxData *mdata, unsigned int uid)
 Get a header cache entry by its UID.
 
int imap_hcache_put (struct ImapMboxData *mdata, struct Email *e)
 Add an entry to the header cache.
 
int imap_hcache_del (struct ImapMboxData *mdata, unsigned int uid)
 Delete an item from the header cache.
 
int imap_hcache_store_uid_seqset (struct ImapMboxData *mdata)
 Store a UID Sequence Set in the header cache.
 
int imap_hcache_clear_uid_seqset (struct ImapMboxData *mdata)
 Delete a UID Sequence Set from the header cache.
 
char * imap_hcache_get_uid_seqset (struct ImapMboxData *mdata)
 Get a UID Sequence Set from the header cache.
 
int imap_parse_path (const char *path, struct ConnAccount *cac, char *mailbox, size_t mailboxlen)
 Parse an IMAP mailbox name into ConnAccount, name.
 
int imap_mxcmp (const char *mx1, const char *mx2)
 Compare mailbox names, giving priority to INBOX.
 
void imap_pretty_mailbox (char *path, size_t pathlen, const char *folder)
 Prettify an IMAP mailbox name.
 
enum QuadOption imap_continue (const char *msg, const char *resp)
 Display a message and ask the user if they want to go on.
 
void imap_error (const char *where, const char *msg)
 Show an error and abort.
 
char * imap_fix_path (char delim, const char *mailbox, char *path, size_t plen)
 Fix up the imap path.
 
void imap_cachepath (char delim, const char *mailbox, struct Buffer *dest)
 Generate a cache path for a mailbox.
 
int imap_get_literal_count (const char *buf, unsigned int *bytes)
 Write number of bytes in an IMAP literal into bytes.
 
char * imap_get_qualifier (char *buf)
 Get the qualifier from a tagged response.
 
char * imap_next_word (char *s)
 Find where the next IMAP word begins.
 
void imap_qualify_path (char *buf, size_t buflen, struct ConnAccount *cac, char *path)
 Make an absolute IMAP folder target.
 
void imap_buf_qualify_path (struct Buffer *buf, struct ConnAccount *cac, char *path)
 Make an absolute IMAP folder target to a buffer.
 
void imap_quote_string (char *dest, size_t dlen, const char *src, bool quote_backtick)
 Quote string according to IMAP rules.
 
void imap_unquote_string (char *s)
 Equally stupid unquoting routine.
 
void imap_munge_mbox_name (bool unicode, char *dest, size_t dlen, const char *src)
 Quote awkward characters in a mailbox name.
 
void imap_unmunge_mbox_name (bool unicode, char *s)
 Remove quoting from a mailbox name.
 
void imap_keep_alive (void)
 Poll the current folder to keep the connection alive.
 
int imap_wait_keep_alive (pid_t pid)
 Wait for a process to change state.
 
void imap_allow_reopen (struct Mailbox *m)
 Allow re-opening a folder upon expunge.
 
void imap_disallow_reopen (struct Mailbox *m)
 Disallow re-opening a folder upon expunge.
 
bool imap_account_match (const struct ConnAccount *a1, const struct ConnAccount *a2)
 Compare two Accounts.
 
struct SeqsetIteratormutt_seqset_iterator_new (const char *seqset)
 Create a new Sequence Set Iterator.
 
int mutt_seqset_iterator_next (struct SeqsetIterator *iter, unsigned int *next)
 Get the next UID from a Sequence Set.
 
void mutt_seqset_iterator_free (struct SeqsetIterator **ptr)
 Free a Sequence Set Iterator.
 

Detailed Description

IMAP helper functions.

Authors
  • Michael R. Elkins
  • Brandon Long
  • Brendan Cully
  • Richard Russon
  • Mehdi Abaakouk
  • Pietro Cerutti

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 util.c.

Function Documentation

◆ imap_adata_find()

int imap_adata_find ( const char *  path,
struct ImapAccountData **  adata,
struct ImapMboxData **  mdata 
)

Find the Account data for this path.

Parameters
pathPath to search for
adataImap Account data
mdataImap Mailbox data
Return values
0Success
-1Failure

Definition at line 73 of file util.c.

75{
76 struct ConnAccount cac = { { 0 } };
77 struct ImapAccountData *tmp_adata = NULL;
78 char tmp[1024] = { 0 };
79
80 if (imap_parse_path(path, &cac, tmp, sizeof(tmp)) < 0)
81 return -1;
82
83 struct Account *np = NULL;
84 TAILQ_FOREACH(np, &NeoMutt->accounts, entries)
85 {
86 if (np->type != MUTT_IMAP)
87 continue;
88
89 tmp_adata = np->adata;
90 if (!tmp_adata)
91 continue;
92 if (imap_account_match(&tmp_adata->conn->account, &cac))
93 {
94 *mdata = imap_mdata_new(tmp_adata, tmp);
95 *adata = tmp_adata;
96 return 0;
97 }
98 }
99 mutt_debug(LL_DEBUG3, "no ImapAccountData found\n");
100 return -1;
101}
@ MUTT_IMAP
'IMAP' Mailbox type
Definition: mailbox.h:50
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
struct ImapMboxData * imap_mdata_new(struct ImapAccountData *adata, const char *name)
Allocate and initialise a new ImapMboxData structure.
Definition: mdata.c:73
@ LL_DEBUG3
Log at debug level 3.
Definition: logging2.h:45
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:725
A group of associated Mailboxes.
Definition: account.h:36
enum MailboxType type
Type of Mailboxes this Account contains.
Definition: account.h:37
void * adata
Private data (for Mailbox backends)
Definition: account.h:42
Login details for a remote server.
Definition: connaccount.h:53
struct ConnAccount account
Account details: username, password, etc.
Definition: connection.h:49
IMAP-specific Account data -.
Definition: adata.h:40
struct Connection * conn
Connection to IMAP server.
Definition: adata.h:41
Container for Accounts, Notifications.
Definition: neomutt.h:42
struct AccountList accounts
List of all Accounts.
Definition: neomutt.h:47
int imap_parse_path(const char *path, struct ConnAccount *cac, char *mailbox, size_t mailboxlen)
Parse an IMAP mailbox name into ConnAccount, name.
Definition: util.c:475
bool imap_account_match(const struct ConnAccount *a1, const struct ConnAccount *a2)
Compare two Accounts.
Definition: util.c:1055
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_mdata_cache_reset()

void imap_mdata_cache_reset ( struct ImapMboxData mdata)

Release and clear cache data of ImapMboxData structure.

Parameters
mdataImap Mailbox data

Definition at line 107 of file util.c.

108{
109 mutt_hash_free(&mdata->uid_hash);
110 imap_msn_free(&mdata->msn);
111 mutt_bcache_close(&mdata->bcache);
112}
void mutt_bcache_close(struct BodyCache **ptr)
Close an Email-Body Cache.
Definition: bcache.c:169
void mutt_hash_free(struct HashTable **ptr)
Free a hash table.
Definition: hash.c:457
void imap_msn_free(struct MSNArray *msn)
Free the cache.
Definition: msn.c:62
struct BodyCache * bcache
Email body cache.
Definition: mdata.h:61
struct HashTable * uid_hash
Hash Table: "uid" -> Email.
Definition: mdata.h:59
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_get_parent()

void imap_get_parent ( const char *  mbox,
char  delim,
char *  buf,
size_t  buflen 
)

Get an IMAP folder's parent.

Parameters
mboxMailbox whose parent is to be determined
delimPath delimiter
bufBuffer for the result
buflenLength of the buffer

Definition at line 121 of file util.c.

122{
123 /* Make a copy of the mailbox name, but only if the pointers are different */
124 if (mbox != buf)
125 mutt_str_copy(buf, mbox, buflen);
126
127 int n = mutt_str_len(buf);
128
129 /* Let's go backwards until the next delimiter
130 *
131 * If buf[n] is a '/', the first n-- will allow us
132 * to ignore it. If it isn't, then buf looks like
133 * "/aaaaa/bbbb". There is at least one "b", so we can't skip
134 * the "/" after the 'a's.
135 *
136 * If buf == '/', then n-- => n == 0, so the loop ends
137 * immediately */
138 for (n--; (n >= 0) && (buf[n] != delim); n--)
139 ; // do nothing
140
141 /* We stopped before the beginning. There is a trailing slash. */
142 if (n > 0)
143 {
144 /* Strip the trailing delimiter. */
145 buf[n] = '\0';
146 }
147 else
148 {
149 buf[0] = (n == 0) ? delim : '\0';
150 }
151}
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition: string.c:496
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
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_get_parent_path()

void imap_get_parent_path ( const char *  path,
char *  buf,
size_t  buflen 
)

Get the path of the parent folder.

Parameters
pathMailbox whose parent is to be determined
bufBuffer for the result
buflenLength of the buffer

Provided an imap path, returns in buf the parent directory if existent. Else returns the same path.

Definition at line 162 of file util.c.

163{
164 struct ImapAccountData *adata = NULL;
165 struct ImapMboxData *mdata = NULL;
166 char mbox[1024] = { 0 };
167
168 if (imap_adata_find(path, &adata, &mdata) < 0)
169 {
170 mutt_str_copy(buf, path, buflen);
171 return;
172 }
173
174 /* Gets the parent mbox in mbox */
175 imap_get_parent(mdata->name, adata->delim, mbox, sizeof(mbox));
176
177 /* Returns a fully qualified IMAP url */
178 imap_qualify_path(buf, buflen, &adata->conn->account, mbox);
179 imap_mdata_free((void *) &mdata);
180}
void imap_mdata_free(void **ptr)
Free the private Mailbox data - Implements Mailbox::mdata_free() -.
Definition: mdata.c:39
char delim
Path delimiter.
Definition: adata.h:75
IMAP-specific Mailbox data -.
Definition: mdata.h:40
void * mdata
Driver specific data.
Definition: mailbox.h:132
void imap_qualify_path(char *buf, size_t buflen, struct ConnAccount *cac, char *path)
Make an absolute IMAP folder target.
Definition: util.c:817
void imap_get_parent(const char *mbox, char delim, char *buf, size_t buflen)
Get an IMAP folder's parent.
Definition: util.c:121
int imap_adata_find(const char *path, struct ImapAccountData **adata, struct ImapMboxData **mdata)
Find the Account data for this path.
Definition: util.c:73
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_clean_path()

void imap_clean_path ( char *  path,
size_t  plen 
)

Cleans an IMAP path using imap_fix_path.

Parameters
pathPath to be cleaned
plenLength of the buffer

Does it in place.

Definition at line 189 of file util.c.

190{
191 struct ImapAccountData *adata = NULL;
192 struct ImapMboxData *mdata = NULL;
193
194 if (imap_adata_find(path, &adata, &mdata) < 0)
195 return;
196
197 /* Returns a fully qualified IMAP url */
198 imap_qualify_path(path, plen, &adata->conn->account, mdata->name);
199 imap_mdata_free((void *) &mdata);
200}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_msn_index_to_uid_seqset()

static void imap_msn_index_to_uid_seqset ( struct Buffer buf,
struct ImapMboxData mdata 
)
static

Convert MSN index of UIDs to Seqset.

Parameters
bufBuffer for the result
mdataImap Mailbox data

Generates a seqseq of the UIDs in msn_index to persist in the header cache. Empty spots are stored as 0.

Definition at line 232 of file util.c.

233{
234 int first = 1, state = 0;
235 unsigned int cur_uid = 0, last_uid = 0;
236 unsigned int range_begin = 0, range_end = 0;
237 const size_t max_msn = imap_msn_highest(&mdata->msn);
238
239 for (unsigned int msn = 1; msn <= max_msn + 1; msn++)
240 {
241 bool match = false;
242 if (msn <= max_msn)
243 {
244 struct Email *e_cur = imap_msn_get(&mdata->msn, msn - 1);
245 cur_uid = e_cur ? imap_edata_get(e_cur)->uid : 0;
246 if (!state || (cur_uid && ((cur_uid - 1) == last_uid)))
247 match = true;
248 last_uid = cur_uid;
249 }
250
251 if (match)
252 {
253 switch (state)
254 {
255 case 1: /* single: convert to a range */
256 state = 2;
258
259 case 2: /* extend range ending */
260 range_end = cur_uid;
261 break;
262 default:
263 state = 1;
264 range_begin = cur_uid;
265 break;
266 }
267 }
268 else if (state)
269 {
270 if (first)
271 first = 0;
272 else
273 buf_addch(buf, ',');
274
275 if (state == 1)
276 buf_add_printf(buf, "%u", range_begin);
277 else if (state == 2)
278 buf_add_printf(buf, "%u:%u", range_begin, range_end);
279
280 state = 1;
281 range_begin = cur_uid;
282 }
283 }
284}
int buf_add_printf(struct Buffer *buf, const char *fmt,...)
Format a string appending a Buffer.
Definition: buffer.c:204
size_t buf_addch(struct Buffer *buf, char c)
Add a single character to a Buffer.
Definition: buffer.c:241
struct ImapEmailData * imap_edata_get(struct Email *e)
Get the private data for this Email.
Definition: edata.c:67
size_t imap_msn_highest(const struct MSNArray *msn)
Return the highest MSN in use.
Definition: msn.c:72
struct Email * imap_msn_get(const struct MSNArray *msn, size_t idx)
Return the Email associated with an msn.
Definition: msn.c:83
#define FALLTHROUGH
Definition: lib.h:111
The envelope/body of an email.
Definition: email.h:39
unsigned int uid
32-bit Message UID
Definition: edata.h:45
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_hcache_open()

void imap_hcache_open ( struct ImapAccountData adata,
struct ImapMboxData mdata,
bool  create 
)

Open a header cache.

Parameters
adataImap Account data
mdataImap Mailbox data
createCreate a new header cache if missing?

Definition at line 300 of file util.c.

301{
302 if (!adata || !mdata)
303 return;
304
305 if (mdata->hcache)
306 return;
307
308 struct HeaderCache *hc = NULL;
309 struct Buffer *mbox = buf_pool_get();
310 struct Buffer *cachepath = buf_pool_get();
311
312 imap_cachepath(adata->delim, mdata->name, mbox);
313
314 if (strstr(buf_string(mbox), "/../") || mutt_str_equal(buf_string(mbox), "..") ||
315 mutt_strn_equal(buf_string(mbox), "../", 3))
316 {
317 goto cleanup;
318 }
319 size_t len = buf_len(mbox);
320 if ((len > 3) && (mutt_str_equal(buf_string(mbox) + len - 3, "/..")))
321 goto cleanup;
322
323 struct Url url = { 0 };
324 mutt_account_tourl(&adata->conn->account, &url);
325 url.path = mbox->data;
326 url_tobuffer(&url, cachepath, U_PATH);
327
328 const char *const c_header_cache = cs_subset_path(NeoMutt->sub, "header_cache");
329 hc = hcache_open(c_header_cache, buf_string(cachepath), imap_hcache_namer, create);
330
331cleanup:
332 buf_pool_release(&mbox);
333 buf_pool_release(&cachepath);
334 mdata->hcache = hc;
335}
size_t buf_len(const struct Buffer *buf)
Calculate the length of a Buffer.
Definition: buffer.c:491
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
const char * cs_subset_path(const struct ConfigSubset *sub, const char *name)
Get a path config item by name.
Definition: helpers.c:168
static void imap_hcache_namer(const char *path, struct Buffer *dest)
Generate a filename for the header cache - Implements hcache_namer_t -.
Definition: util.c:289
struct HeaderCache * hcache_open(const char *path, const char *folder, hcache_namer_t namer, bool create)
Multiplexor for StoreOps::open.
Definition: hcache.c:471
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:660
bool mutt_strn_equal(const char *a, const char *b, size_t num)
Check for equality of two strings (to a maximum), safely.
Definition: string.c:425
void mutt_account_tourl(struct ConnAccount *cac, struct Url *url)
Fill URL with info from account.
Definition: mutt_account.c:80
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
String manipulation buffer.
Definition: buffer.h:36
char * data
Pointer to data.
Definition: buffer.h:37
Header Cache.
Definition: lib.h:86
struct HeaderCache * hcache
Email header cache.
Definition: mdata.h:63
char * name
Mailbox name.
Definition: mdata.h:41
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:46
A parsed URL proto://user:password@host:port/path?a=1&b=2
Definition: url.h:69
char * path
Path.
Definition: url.h:75
int url_tobuffer(const struct Url *url, struct Buffer *buf, uint8_t flags)
Output the URL string for a given Url object.
Definition: url.c:358
#define U_PATH
Definition: url.h:50
void imap_cachepath(char delim, const char *mailbox, struct Buffer *dest)
Generate a cache path for a mailbox.
Definition: util.c:711
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_hcache_close()

void imap_hcache_close ( struct ImapMboxData mdata)

Close the header cache.

Parameters
mdataImap Mailbox data

Definition at line 341 of file util.c.

342{
343 if (!mdata->hcache)
344 return;
345
346 hcache_close(&mdata->hcache);
347}
void hcache_close(struct HeaderCache **ptr)
Multiplexor for StoreOps::close.
Definition: hcache.c:544
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_hcache_get()

struct Email * imap_hcache_get ( struct ImapMboxData mdata,
unsigned int  uid 
)

Get a header cache entry by its UID.

Parameters
mdataImap Mailbox data
uidUID to find
Return values
ptrEmail
NULLFailure

Definition at line 356 of file util.c.

357{
358 if (!mdata->hcache)
359 return NULL;
360
361 char key[16] = { 0 };
362
363 snprintf(key, sizeof(key), "%u", uid);
364 struct HCacheEntry hce = hcache_fetch_email(mdata->hcache, key, mutt_str_len(key),
365 mdata->uidvalidity);
366 if (!hce.email && hce.uidvalidity)
367 {
368 mutt_debug(LL_DEBUG3, "hcache uidvalidity mismatch: %u\n", hce.uidvalidity);
369 }
370
371 return hce.email;
372}
struct HCacheEntry hcache_fetch_email(struct HeaderCache *hc, const char *key, size_t keylen, uint32_t uidvalidity)
Multiplexor for StoreOps::fetch.
Definition: hcache.c:564
Wrapper for Email retrieved from the header cache.
Definition: lib.h:99
uint32_t uidvalidity
IMAP-specific UIDVALIDITY.
Definition: lib.h:100
struct Email * email
Retrieved email.
Definition: lib.h:102
uint32_t uidvalidity
Definition: mdata.h:51
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_hcache_put()

int imap_hcache_put ( struct ImapMboxData mdata,
struct Email e 
)

Add an entry to the header cache.

Parameters
mdataImap Mailbox data
eEmail
Return values
0Success
-1Failure

Definition at line 381 of file util.c.

382{
383 if (!mdata->hcache)
384 return -1;
385
386 char key[16] = { 0 };
387
388 snprintf(key, sizeof(key), "%u", imap_edata_get(e)->uid);
389 return hcache_store_email(mdata->hcache, key, mutt_str_len(key), e, mdata->uidvalidity);
390}
int hcache_store_email(struct HeaderCache *hc, const char *key, size_t keylen, struct Email *e, uint32_t uidvalidity)
Multiplexor for StoreOps::store.
Definition: hcache.c:672
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_hcache_del()

int imap_hcache_del ( struct ImapMboxData mdata,
unsigned int  uid 
)

Delete an item from the header cache.

Parameters
mdataImap Mailbox data
uidUID of entry to delete
Return values
0Success
-1Failure

Definition at line 399 of file util.c.

400{
401 if (!mdata->hcache)
402 return -1;
403
404 char key[16] = { 0 };
405
406 snprintf(key, sizeof(key), "%u", uid);
407 return hcache_delete_email(mdata->hcache, key, mutt_str_len(key));
408}
int hcache_delete_email(struct HeaderCache *hc, const char *key, size_t keylen)
Multiplexor for StoreOps::delete_record.
Definition: hcache.c:741
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_hcache_store_uid_seqset()

int imap_hcache_store_uid_seqset ( struct ImapMboxData mdata)

Store a UID Sequence Set in the header cache.

Parameters
mdataImap Mailbox data
Return values
0Success
-1Error

Definition at line 416 of file util.c.

417{
418 if (!mdata->hcache)
419 return -1;
420
421 struct Buffer *buf = buf_pool_get();
422 buf_alloc(buf, 8192); // The seqset is likely large. Preallocate to reduce reallocs
424
425 int rc = hcache_store_raw(mdata->hcache, "UIDSEQSET", 9, buf->data, buf_len(buf) + 1);
426 mutt_debug(LL_DEBUG3, "Stored UIDSEQSET %s\n", buf_string(buf));
427 buf_pool_release(&buf);
428 return rc;
429}
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
int hcache_store_raw(struct HeaderCache *hc, const char *key, size_t keylen, void *data, size_t dlen)
Store a key / data pair.
Definition: hcache.c:726
static void imap_msn_index_to_uid_seqset(struct Buffer *buf, struct ImapMboxData *mdata)
Convert MSN index of UIDs to Seqset.
Definition: util.c:232
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_hcache_clear_uid_seqset()

int imap_hcache_clear_uid_seqset ( struct ImapMboxData mdata)

Delete a UID Sequence Set from the header cache.

Parameters
mdataImap Mailbox data
Return values
0Success
-1Error

Definition at line 437 of file util.c.

438{
439 if (!mdata->hcache)
440 return -1;
441
442 return hcache_delete_raw(mdata->hcache, "UIDSEQSET", 9);
443}
int hcache_delete_raw(struct HeaderCache *hc, const char *key, size_t keylen)
Multiplexor for StoreOps::delete_record.
Definition: hcache.c:754
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_hcache_get_uid_seqset()

char * imap_hcache_get_uid_seqset ( struct ImapMboxData mdata)

Get a UID Sequence Set from the header cache.

Parameters
mdataImap Mailbox data
Return values
ptrUID Sequence Set
NULLError

Definition at line 451 of file util.c.

452{
453 if (!mdata->hcache)
454 return NULL;
455
456 char *seqset = hcache_fetch_raw_str(mdata->hcache, "UIDSEQSET", 9);
457 mutt_debug(LL_DEBUG3, "Retrieved UIDSEQSET %s\n", NONULL(seqset));
458
459 return seqset;
460}
char * hcache_fetch_raw_str(struct HeaderCache *hc, const char *key, size_t keylen)
Fetch a string from the cache.
Definition: hcache.c:654
#define NONULL(x)
Definition: string2.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_parse_path()

int imap_parse_path ( const char *  path,
struct ConnAccount cac,
char *  mailbox,
size_t  mailboxlen 
)

Parse an IMAP mailbox name into ConnAccount, name.

Parameters
pathMailbox path to parse
cacAccount credentials
mailboxBuffer for mailbox name
mailboxlenLength of buffer
Return values
0Success
-1Failure

Given an IMAP mailbox name, return host, port and a path IMAP servers will recognize.

Definition at line 475 of file util.c.

476{
477 static unsigned short ImapPort = 0;
478 static unsigned short ImapsPort = 0;
479
480 if (ImapPort == 0)
481 {
482 struct servent *service = getservbyname("imap", "tcp");
483 if (service)
484 ImapPort = ntohs(service->s_port);
485 else
486 ImapPort = IMAP_PORT;
487 mutt_debug(LL_DEBUG3, "Using default IMAP port %d\n", ImapPort);
488 }
489
490 if (ImapsPort == 0)
491 {
492 struct servent *service = getservbyname("imaps", "tcp");
493 if (service)
494 ImapsPort = ntohs(service->s_port);
495 else
496 ImapsPort = IMAP_SSL_PORT;
497 mutt_debug(LL_DEBUG3, "Using default IMAPS port %d\n", ImapsPort);
498 }
499
500 /* Defaults */
501 cac->port = ImapPort;
503 cac->service = "imap";
505
506 struct Url *url = url_parse(path);
507 if (!url)
508 return -1;
509
510 if ((url->scheme != U_IMAP) && (url->scheme != U_IMAPS))
511 {
512 url_free(&url);
513 return -1;
514 }
515
516 if ((mutt_account_fromurl(cac, url) < 0) || (cac->host[0] == '\0'))
517 {
518 url_free(&url);
519 return -1;
520 }
521
522 if (url->scheme == U_IMAPS)
523 cac->flags |= MUTT_ACCT_SSL;
524
525 mutt_str_copy(mailbox, url->path, mailboxlen);
526
527 url_free(&url);
528
529 if ((cac->flags & MUTT_ACCT_SSL) && !(cac->flags & MUTT_ACCT_PORT))
530 cac->port = ImapsPort;
531
532 return 0;
533}
#define MUTT_ACCT_SSL
Account uses SSL/TLS.
Definition: connaccount.h:47
#define MUTT_ACCT_PORT
Port field has been set.
Definition: connaccount.h:43
static const char * imap_get_field(enum ConnAccountField field, void *gf_data)
Get connection login credentials - Implements ConnAccount::get_field() -.
Definition: util.c:205
#define IMAP_PORT
Default port for IMAP.
Definition: private.h:44
#define IMAP_SSL_PORT
Port for IMAP over SSL/TLS.
Definition: private.h:45
int mutt_account_fromurl(struct ConnAccount *cac, const struct Url *url)
Fill ConnAccount with information from url.
Definition: mutt_account.c:44
@ MUTT_ACCT_TYPE_IMAP
Imap Account.
Definition: mutt_account.h:38
const char * service
Name of the service, e.g. "imap".
Definition: connaccount.h:61
char host[128]
Server to login to.
Definition: connaccount.h:54
const char *(* get_field)(enum ConnAccountField field, void *gf_data)
Definition: connaccount.h:70
unsigned char type
Connection type, e.g. MUTT_ACCT_TYPE_IMAP.
Definition: connaccount.h:59
MuttAccountFlags flags
Which fields are initialised, e.g. MUTT_ACCT_USER.
Definition: connaccount.h:60
unsigned short port
Port to connect to.
Definition: connaccount.h:58
enum UrlScheme scheme
Scheme, e.g. U_SMTPS.
Definition: url.h:70
struct Url * url_parse(const char *src)
Fill in Url.
Definition: url.c:239
void url_free(struct Url **ptr)
Free the contents of a URL.
Definition: url.c:124
@ U_IMAP
Url is imap://.
Definition: url.h:39
@ U_IMAPS
Url is imaps://.
Definition: url.h:40
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_mxcmp()

int imap_mxcmp ( const char *  mx1,
const char *  mx2 
)

Compare mailbox names, giving priority to INBOX.

Parameters
mx1First mailbox name
mx2Second mailbox name
Return values
<0First mailbox precedes Second mailbox
0Mailboxes are the same
>0Second mailbox precedes First mailbox

Like a normal sort function except that "INBOX" will be sorted to the beginning of the list.

Definition at line 546 of file util.c.

547{
548 char *b1 = NULL;
549 char *b2 = NULL;
550 int rc;
551
552 if (!mx1 || (*mx1 == '\0'))
553 mx1 = "INBOX";
554 if (!mx2 || (*mx2 == '\0'))
555 mx2 = "INBOX";
556 if (mutt_istr_equal(mx1, "INBOX") && mutt_istr_equal(mx2, "INBOX"))
557 {
558 return 0;
559 }
560
561 b1 = mutt_mem_malloc(strlen(mx1) + 1);
562 b2 = mutt_mem_malloc(strlen(mx2) + 1);
563
564 imap_fix_path('\0', mx1, b1, strlen(mx1) + 1);
565 imap_fix_path('\0', mx2, b2, strlen(mx2) + 1);
566
567 rc = mutt_str_cmp(b1, b2);
568 FREE(&b1);
569 FREE(&b2);
570
571 return rc;
572}
void * mutt_mem_malloc(size_t size)
Allocate memory on the heap.
Definition: memory.c:91
#define FREE(x)
Definition: memory.h:45
int mutt_str_cmp(const char *a, const char *b)
Compare two strings, safely.
Definition: string.c:399
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition: string.c:672
char * imap_fix_path(char delim, const char *mailbox, char *path, size_t plen)
Fix up the imap path.
Definition: util.c:680
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_pretty_mailbox()

void imap_pretty_mailbox ( char *  path,
size_t  pathlen,
const char *  folder 
)

Prettify an IMAP mailbox name.

Parameters
pathMailbox name to be tidied
pathlenLength of path
folderPath to use for '+' abbreviations

Called by mutt_pretty_mailbox() to make IMAP paths look nice.

Definition at line 582 of file util.c.

583{
584 struct ConnAccount cac_target = { { 0 } };
585 struct ConnAccount cac_home = { { 0 } };
586 struct Url url = { 0 };
587 const char *delim = NULL;
588 int tlen;
589 int hlen = 0;
590 bool home_match = false;
591 char target_mailbox[1024] = { 0 };
592 char home_mailbox[1024] = { 0 };
593
594 if (imap_parse_path(path, &cac_target, target_mailbox, sizeof(target_mailbox)) < 0)
595 return;
596
597 if (imap_path_probe(folder, NULL) != MUTT_IMAP)
598 goto fallback;
599
600 if (imap_parse_path(folder, &cac_home, home_mailbox, sizeof(home_mailbox)) < 0)
601 goto fallback;
602
603 tlen = mutt_str_len(target_mailbox);
604 hlen = mutt_str_len(home_mailbox);
605
606 /* check whether we can do '+' substitution */
607 if (tlen && imap_account_match(&cac_home, &cac_target) &&
608 mutt_strn_equal(home_mailbox, target_mailbox, hlen))
609 {
610 const char *const c_imap_delim_chars = cs_subset_string(NeoMutt->sub, "imap_delim_chars");
611 if (hlen == 0)
612 {
613 home_match = true;
614 }
615 else if (c_imap_delim_chars)
616 {
617 for (delim = c_imap_delim_chars; *delim != '\0'; delim++)
618 if (target_mailbox[hlen] == *delim)
619 home_match = true;
620 }
621 }
622
623 /* do the '+' substitution */
624 if (home_match)
625 {
626 *path++ = '+';
627 /* copy remaining path, skipping delimiter */
628 if (hlen != 0)
629 hlen++;
630 memcpy(path, target_mailbox + hlen, tlen - hlen);
631 path[tlen - hlen] = '\0';
632 return;
633 }
634
635fallback:
636 mutt_account_tourl(&cac_target, &url);
637 url.path = target_mailbox;
638 url_tostring(&url, path, pathlen, U_NO_FLAGS);
639}
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:291
enum MailboxType imap_path_probe(const char *path, const struct stat *st)
Is this an IMAP Mailbox? - Implements MxOps::path_probe() -.
Definition: imap.c:2345
int url_tostring(const struct Url *url, char *dest, size_t len, uint8_t flags)
Output the URL string for a given Url object.
Definition: url.c:423
#define U_NO_FLAGS
Definition: url.h:49
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_continue()

enum QuadOption imap_continue ( const char *  msg,
const char *  resp 
)

Display a message and ask the user if they want to go on.

Parameters
msgLocation of the error
respMessage for user
Return values
QuadOptionResult, e.g. MUTT_NO

Definition at line 647 of file util.c.

648{
649 imap_error(msg, resp);
650 return query_yesorno(_("Continue?"), MUTT_NO);
651}
#define _(a)
Definition: message.h:28
@ MUTT_NO
User answered 'No', or assume 'No'.
Definition: quad.h:38
enum QuadOption query_yesorno(const char *prompt, enum QuadOption def)
Ask the user a Yes/No question.
Definition: question.c:326
void imap_error(const char *where, const char *msg)
Show an error and abort.
Definition: util.c:658
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_error()

void imap_error ( const char *  where,
const char *  msg 
)

Show an error and abort.

Parameters
whereLocation of the error
msgMessage for user

Definition at line 658 of file util.c.

659{
660 mutt_error("%s [%s]", where, msg);
661}
#define mutt_error(...)
Definition: logging2.h:92
+ Here is the caller graph for this function:

◆ imap_fix_path()

char * imap_fix_path ( char  delim,
const char *  mailbox,
char *  path,
size_t  plen 
)

Fix up the imap path.

Parameters
delimDelimiter specified by the server, '\0' for $imap_delim_chars
mailboxMailbox path
pathBuffer for the result
plenLength of buffer
Return values
ptrFixed-up path
Note
if delim is '\0', the first character in mailbox matching any of the characters in $imap_delim_chars is used as a delimiter.

This is necessary because the rest of neomutt assumes a hierarchy delimiter of '/', which is not necessarily true in IMAP. Additionally, the filesystem converts multiple hierarchy delimiters into a single one, ie "///" is equal to "/". IMAP servers are not required to do this. Moreover, IMAP servers may dislike the path ending with the delimiter.

Definition at line 680 of file util.c.

681{
682 int i = 0;
683 const char *const c_imap_delim_chars = cs_subset_string(NeoMutt->sub, "imap_delim_chars");
684 for (; mailbox && *mailbox && (i < (plen - 1)); i++)
685 {
686 if ((*mailbox == delim) || (!delim && strchr(NONULL(c_imap_delim_chars), *mailbox)))
687 {
688 delim = *mailbox;
689 /* Skip multiple occurrences of delim */
690 while (*mailbox && *(mailbox + 1) == delim)
691 mailbox++;
692 }
693 path[i] = *mailbox++;
694 }
695
696 /* Do not terminate with a delimiter */
697 if ((i != 0) && (path[i - 1] == delim))
698 i--;
699
700 /* Ensure null termination */
701 path[i] = '\0';
702 return path;
703}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_cachepath()

void imap_cachepath ( char  delim,
const char *  mailbox,
struct Buffer dest 
)

Generate a cache path for a mailbox.

Parameters
delimImap server delimiter
mailboxMailbox name
destBuffer to store cache path

Definition at line 711 of file util.c.

712{
713 const char *p = mailbox;
714 buf_reset(dest);
715 if (!p)
716 return;
717
718 while (*p)
719 {
720 if (p[0] == delim)
721 {
722 buf_addch(dest, '/');
723 /* simple way to avoid collisions with UIDs */
724 if ((p[1] >= '0') && (p[1] <= '9'))
725 buf_addch(dest, '_');
726 }
727 else
728 {
729 buf_addch(dest, *p);
730 }
731 p++;
732 }
733}
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:76
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_get_literal_count()

int imap_get_literal_count ( const char *  buf,
unsigned int *  bytes 
)

Write number of bytes in an IMAP literal into bytes.

Parameters
[in]bufNumber as a string
[out]bytesResulting number
Return values
0Success
-1Failure

Definition at line 742 of file util.c.

743{
744 char *pc = NULL;
745 char *pn = NULL;
746
747 if (!buf || !(pc = strchr(buf, '{')))
748 return -1;
749
750 pc++;
751 pn = pc;
752 while (isdigit((unsigned char) *pc))
753 pc++;
754 *pc = '\0';
755 if (!mutt_str_atoui(pn, bytes))
756 return -1;
757
758 return 0;
759}
const char * mutt_str_atoui(const char *str, unsigned int *dst)
Convert ASCII string to an unsigned integer.
Definition: atoi.c:214
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_get_qualifier()

char * imap_get_qualifier ( char *  buf)

Get the qualifier from a tagged response.

Parameters
bufCommand string to process
Return values
ptrStart of the qualifier

In a tagged response, skip tag and status for the qualifier message. Used by imap_copy_message for TRYCREATE

Definition at line 769 of file util.c.

770{
771 char *s = buf;
772
773 /* skip tag */
774 s = imap_next_word(s);
775 /* skip OK/NO/BAD response */
776 s = imap_next_word(s);
777
778 return s;
779}
char * imap_next_word(char *s)
Find where the next IMAP word begins.
Definition: util.c:786
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_next_word()

char * imap_next_word ( char *  s)

Find where the next IMAP word begins.

Parameters
sCommand string to process
Return values
ptrNext IMAP word

Definition at line 786 of file util.c.

787{
788 bool quoted = false;
789
790 while (*s)
791 {
792 if (*s == '\\')
793 {
794 s++;
795 if (*s)
796 s++;
797 continue;
798 }
799 if (*s == '\"')
800 quoted = !quoted;
801 if (!quoted && isspace(*s))
802 break;
803 s++;
804 }
805
806 SKIPWS(s);
807 return s;
808}
#define SKIPWS(ch)
Definition: string2.h:45
+ Here is the caller graph for this function:

◆ imap_qualify_path()

void imap_qualify_path ( char *  buf,
size_t  buflen,
struct ConnAccount cac,
char *  path 
)

Make an absolute IMAP folder target.

Parameters
bufBuffer for the result
buflenLength of buffer
cacConnAccount of the account
pathPath relative to the mailbox

Definition at line 817 of file util.c.

818{
819 struct Url url = { 0 };
820 mutt_account_tourl(cac, &url);
821 url.path = path;
822 url_tostring(&url, buf, buflen, U_NO_FLAGS);
823}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_buf_qualify_path()

void imap_buf_qualify_path ( struct Buffer buf,
struct ConnAccount cac,
char *  path 
)

Make an absolute IMAP folder target to a buffer.

Parameters
bufBuffer for the result
cacConnAccount of the account
pathPath relative to the mailbox

Definition at line 831 of file util.c.

832{
833 struct Url url = { 0 };
834 mutt_account_tourl(cac, &url);
835 url.path = path;
836 url_tobuffer(&url, buf, U_NO_FLAGS);
837}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_quote_string()

void imap_quote_string ( char *  dest,
size_t  dlen,
const char *  src,
bool  quote_backtick 
)

Quote string according to IMAP rules.

Parameters
destBuffer for the result
dlenLength of the buffer
srcString to be quoted
quote_backtickIf true, quote backticks too

Surround string with quotes, escape " and \ with backslash

Definition at line 848 of file util.c.

849{
850 const char *quote = "`\"\\";
851 if (!quote_backtick)
852 quote++;
853
854 char *pt = dest;
855 const char *s = src;
856
857 *pt++ = '"';
858 /* save room for quote-chars */
859 dlen -= 3;
860
861 for (; *s && dlen; s++)
862 {
863 if (strchr(quote, *s))
864 {
865 if (dlen < 2)
866 break;
867 dlen -= 2;
868 *pt++ = '\\';
869 *pt++ = *s;
870 }
871 else
872 {
873 *pt++ = *s;
874 dlen--;
875 }
876 }
877 *pt++ = '"';
878 *pt = '\0';
879}
+ Here is the caller graph for this function:

◆ imap_unquote_string()

void imap_unquote_string ( char *  s)

Equally stupid unquoting routine.

Parameters
sString to be unquoted

Definition at line 885 of file util.c.

886{
887 char *d = s;
888
889 if (*s == '\"')
890 s++;
891 else
892 return;
893
894 while (*s)
895 {
896 if (*s == '\"')
897 {
898 *d = '\0';
899 return;
900 }
901 if (*s == '\\')
902 {
903 s++;
904 }
905 if (*s)
906 {
907 *d = *s;
908 d++;
909 s++;
910 }
911 }
912 *d = '\0';
913}
+ Here is the caller graph for this function:

◆ imap_munge_mbox_name()

void imap_munge_mbox_name ( bool  unicode,
char *  dest,
size_t  dlen,
const char *  src 
)

Quote awkward characters in a mailbox name.

Parameters
unicodetrue if Unicode is allowed
destBuffer to store safe mailbox name
dlenLength of buffer
srcMailbox name

Definition at line 922 of file util.c.

923{
924 char *buf = mutt_str_dup(src);
925 imap_utf_encode(unicode, &buf);
926
927 imap_quote_string(dest, dlen, buf, false);
928
929 FREE(&buf);
930}
void imap_utf_encode(bool unicode, char **s)
Encode email from local charset to UTF-8.
Definition: utf7.c:397
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:253
void imap_quote_string(char *dest, size_t dlen, const char *src, bool quote_backtick)
Quote string according to IMAP rules.
Definition: util.c:848
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_unmunge_mbox_name()

void imap_unmunge_mbox_name ( bool  unicode,
char *  s 
)

Remove quoting from a mailbox name.

Parameters
unicodetrue if Unicode is allowed
sMailbox name

The string will be altered in-place.

Definition at line 939 of file util.c.

940{
942
943 char *buf = mutt_str_dup(s);
944 if (buf)
945 {
946 imap_utf_decode(unicode, &buf);
947 strncpy(s, buf, strlen(s));
948 }
949
950 FREE(&buf);
951}
void imap_utf_decode(bool unicode, char **s)
Decode email from UTF-8 to local charset.
Definition: utf7.c:430
void imap_unquote_string(char *s)
Equally stupid unquoting routine.
Definition: util.c:885
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_keep_alive()

void imap_keep_alive ( void  )

Poll the current folder to keep the connection alive.

Definition at line 956 of file util.c.

957{
958 time_t now = mutt_date_now();
959 struct Account *np = NULL;
960 const short c_imap_keep_alive = cs_subset_number(NeoMutt->sub, "imap_keep_alive");
961 TAILQ_FOREACH(np, &NeoMutt->accounts, entries)
962 {
963 if (np->type != MUTT_IMAP)
964 continue;
965
966 struct ImapAccountData *adata = np->adata;
967 if (!adata || !adata->mailbox)
968 continue;
969
970 if ((adata->state >= IMAP_AUTHENTICATED) && (now >= (adata->lastread + c_imap_keep_alive)))
971 imap_check_mailbox(adata->mailbox, true);
972 }
973}
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition: helpers.c:143
@ IMAP_AUTHENTICATED
Connection is authenticated.
Definition: private.h:107
enum MxStatus imap_check_mailbox(struct Mailbox *m, bool force)
Use the NOOP or IDLE command to poll for new mail.
Definition: imap.c:1032
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition: date.c:456
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_wait_keep_alive()

int imap_wait_keep_alive ( pid_t  pid)

Wait for a process to change state.

Parameters
pidProcess ID to listen to
Return values
num'wstatus' from waitpid()

Definition at line 980 of file util.c.

981{
982 struct sigaction oldalrm = { 0 };
983 struct sigaction act = { 0 };
984 sigset_t oldmask = { 0 };
985 int rc;
986
987 const bool c_imap_passive = cs_subset_bool(NeoMutt->sub, "imap_passive");
988 cs_subset_str_native_set(NeoMutt->sub, "imap_passive", true, NULL);
989 OptKeepQuiet = true;
990
991 sigprocmask(SIG_SETMASK, NULL, &oldmask);
992
993 sigemptyset(&act.sa_mask);
994 act.sa_handler = mutt_sig_empty_handler;
995#ifdef SA_INTERRUPT
996 act.sa_flags = SA_INTERRUPT;
997#else
998 act.sa_flags = 0;
999#endif
1000
1001 sigaction(SIGALRM, &act, &oldalrm);
1002
1003 const short c_imap_keep_alive = cs_subset_number(NeoMutt->sub, "imap_keep_alive");
1004 alarm(c_imap_keep_alive);
1005 while ((waitpid(pid, &rc, 0) < 0) && (errno == EINTR))
1006 {
1007 alarm(0); /* cancel a possibly pending alarm */
1009 alarm(c_imap_keep_alive);
1010 }
1011
1012 alarm(0); /* cancel a possibly pending alarm */
1013
1014 sigaction(SIGALRM, &oldalrm, NULL);
1015 sigprocmask(SIG_SETMASK, &oldmask, NULL);
1016
1017 OptKeepQuiet = false;
1018 cs_subset_str_native_set(NeoMutt->sub, "imap_passive", c_imap_passive, NULL);
1019
1020 return rc;
1021}
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:47
bool OptKeepQuiet
(pseudo) shut up the message and refresh functions while we are executing an external program
Definition: globals.c:66
void mutt_sig_empty_handler(int sig)
Dummy signal handler.
Definition: signal.c:117
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:297
void imap_keep_alive(void)
Poll the current folder to keep the connection alive.
Definition: util.c:956
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_allow_reopen()

void imap_allow_reopen ( struct Mailbox m)

Allow re-opening a folder upon expunge.

Parameters
mMailbox

Definition at line 1027 of file util.c.

1028{
1030 struct ImapMboxData *mdata = imap_mdata_get(m);
1031 if (!adata || !adata->mailbox || (adata->mailbox != m) || !mdata)
1032 return;
1033 mdata->reopen |= IMAP_REOPEN_ALLOW;
1034}
struct ImapAccountData * imap_adata_get(struct Mailbox *m)
Get the Account data for this mailbox.
Definition: adata.c:123
struct ImapMboxData * imap_mdata_get(struct Mailbox *m)
Get the Mailbox data for this mailbox.
Definition: mdata.c:60
#define IMAP_REOPEN_ALLOW
Allow re-opening a folder upon expunge.
Definition: private.h:64
struct Mailbox * mailbox
Current selected mailbox.
Definition: adata.h:76
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_disallow_reopen()

void imap_disallow_reopen ( struct Mailbox m)

Disallow re-opening a folder upon expunge.

Parameters
mMailbox

Definition at line 1040 of file util.c.

1041{
1043 struct ImapMboxData *mdata = imap_mdata_get(m);
1044 if (!adata || !adata->mailbox || (adata->mailbox != m) || !mdata)
1045 return;
1046 mdata->reopen &= ~IMAP_REOPEN_ALLOW;
1047}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_account_match()

bool imap_account_match ( const struct ConnAccount a1,
const struct ConnAccount a2 
)

Compare two Accounts.

Parameters
a1First ConnAccount
a2Second ConnAccount
Return values
trueAccounts match

Definition at line 1055 of file util.c.

1056{
1057 if (!a1 || !a2)
1058 return false;
1059 if (a1->type != a2->type)
1060 return false;
1061 if (!mutt_istr_equal(a1->host, a2->host))
1062 return false;
1063 if ((a1->port != 0) && (a2->port != 0) && (a1->port != a2->port))
1064 return false;
1065 if (a1->flags & a2->flags & MUTT_ACCT_USER)
1066 return mutt_str_equal(a1->user, a2->user);
1067
1068 const char *user = NONULL(Username);
1069
1070 const char *const c_imap_user = cs_subset_string(NeoMutt->sub, "imap_user");
1071 if ((a1->type == MUTT_ACCT_TYPE_IMAP) && c_imap_user)
1072 user = c_imap_user;
1073
1074 if (a1->flags & MUTT_ACCT_USER)
1075 return mutt_str_equal(a1->user, user);
1076 if (a2->flags & MUTT_ACCT_USER)
1077 return mutt_str_equal(a2->user, user);
1078
1079 return true;
1080}
#define MUTT_ACCT_USER
User field has been set.
Definition: connaccount.h:44
char * Username
User's login name.
Definition: globals.c:41
char user[128]
Username.
Definition: connaccount.h:56
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_seqset_iterator_new()

struct SeqsetIterator * mutt_seqset_iterator_new ( const char *  seqset)

Create a new Sequence Set Iterator.

Parameters
seqsetSource Sequence Set
Return values
ptrNewly allocated Sequence Set Iterator

Definition at line 1087 of file util.c.

1088{
1089 if (!seqset || (*seqset == '\0'))
1090 return NULL;
1091
1092 struct SeqsetIterator *iter = mutt_mem_calloc(1, sizeof(struct SeqsetIterator));
1093 iter->full_seqset = mutt_str_dup(seqset);
1094 iter->eostr = strchr(iter->full_seqset, '\0');
1095 iter->substr_cur = iter->substr_end = iter->full_seqset;
1096
1097 return iter;
1098}
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:51
UID Sequence Set Iterator.
Definition: private.h:169
char * eostr
Definition: private.h:171
char * substr_end
Definition: private.h:177
char * substr_cur
Definition: private.h:176
char * full_seqset
Definition: private.h:170
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_seqset_iterator_next()

int mutt_seqset_iterator_next ( struct SeqsetIterator iter,
unsigned int *  next 
)

Get the next UID from a Sequence Set.

Parameters
[in]iterSequence Set Iterator
[out]nextNext UID in set
Return values
0Next sequence is generated
1Iterator is finished
-1error

Definition at line 1108 of file util.c.

1109{
1110 if (!iter || !next)
1111 return -1;
1112
1113 if (iter->in_range)
1114 {
1115 if ((iter->down && (iter->range_cur == (iter->range_end - 1))) ||
1116 (!iter->down && (iter->range_cur == (iter->range_end + 1))))
1117 {
1118 iter->in_range = 0;
1119 }
1120 }
1121
1122 if (!iter->in_range)
1123 {
1124 iter->substr_cur = iter->substr_end;
1125 if (iter->substr_cur == iter->eostr)
1126 return 1;
1127
1128 iter->substr_end = strchr(iter->substr_cur, ',');
1129 if (!iter->substr_end)
1130 iter->substr_end = iter->eostr;
1131 else
1132 *(iter->substr_end++) = '\0';
1133
1134 char *range_sep = strchr(iter->substr_cur, ':');
1135 if (range_sep)
1136 *range_sep++ = '\0';
1137
1138 if (!mutt_str_atoui_full(iter->substr_cur, &iter->range_cur))
1139 return -1;
1140 if (range_sep)
1141 {
1142 if (!mutt_str_atoui_full(range_sep, &iter->range_end))
1143 return -1;
1144 }
1145 else
1146 {
1147 iter->range_end = iter->range_cur;
1148 }
1149
1150 iter->down = (iter->range_end < iter->range_cur);
1151 iter->in_range = 1;
1152 }
1153
1154 *next = iter->range_cur;
1155 if (iter->down)
1156 iter->range_cur--;
1157 else
1158 iter->range_cur++;
1159
1160 return 0;
1161}
unsigned int range_end
Definition: private.h:175
unsigned int range_cur
Definition: private.h:174
+ Here is the caller graph for this function:

◆ mutt_seqset_iterator_free()

void mutt_seqset_iterator_free ( struct SeqsetIterator **  ptr)

Free a Sequence Set Iterator.

Parameters
[out]ptrIterator to free

Definition at line 1167 of file util.c.

1168{
1169 if (!ptr || !*ptr)
1170 return;
1171
1172 struct SeqsetIterator *iter = *ptr;
1173 FREE(&iter->full_seqset);
1174 FREE(ptr);
1175}
+ Here is the caller graph for this function: