NeoMutt  2025-09-05-70-gcfdde0
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 <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 "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 (const char *mailbox, char *path, size_t plen)
 Fix up the imap path.
 
char * imap_fix_path_with_delim (const 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 71 of file util.c.

73{
74 struct ConnAccount cac = { { 0 } };
75 struct ImapAccountData *tmp_adata = NULL;
76 char tmp[1024] = { 0 };
77
78 if (imap_parse_path(path, &cac, tmp, sizeof(tmp)) < 0)
79 return -1;
80
81 struct Account **ap = NULL;
83 {
84 struct Account *a = *ap;
85 if (a->type != MUTT_IMAP)
86 continue;
87
88 tmp_adata = a->adata;
89 if (!tmp_adata)
90 continue;
91 if (imap_account_match(&tmp_adata->conn->account, &cac))
92 {
93 if (mdata)
94 {
95 *mdata = imap_mdata_new(tmp_adata, tmp);
96 }
97 *adata = tmp_adata;
98 return 0;
99 }
100 }
101 mutt_debug(LL_DEBUG3, "no ImapAccountData found\n");
102 return -1;
103}
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition array.h:214
@ MUTT_IMAP
'IMAP' Mailbox type
Definition mailbox.h:50
#define mutt_debug(LEVEL,...)
Definition logging2.h:90
struct ImapMboxData * imap_mdata_new(struct ImapAccountData *adata, const char *name)
Allocate and initialise a new ImapMboxData structure.
Definition mdata.c:74
@ LL_DEBUG3
Log at debug level 3.
Definition logging2.h:46
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 AccountArray accounts
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:477
bool imap_account_match(const struct ConnAccount *a1, const struct ConnAccount *a2)
Compare two Accounts.
Definition util.c:1095
+ 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 109 of file util.c.

110{
111 mutt_hash_free(&mdata->uid_hash);
112 imap_msn_free(&mdata->msn);
113 mutt_bcache_close(&mdata->bcache);
114}
void mutt_bcache_close(struct BodyCache **ptr)
Close an Email-Body Cache.
Definition bcache.c:167
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 123 of file util.c.

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

165{
166 struct ImapAccountData *adata = NULL;
167 struct ImapMboxData *mdata = NULL;
168 char mbox[1024] = { 0 };
169
170 if (imap_adata_find(path, &adata, &mdata) < 0)
171 {
172 mutt_str_copy(buf, path, buflen);
173 return;
174 }
175
176 /* Gets the parent mbox in mbox */
177 imap_get_parent(mdata->name, adata->delim, mbox, sizeof(mbox));
178
179 /* Returns a fully qualified IMAP url */
180 imap_qualify_path(buf, buflen, &adata->conn->account, mbox);
181 imap_mdata_free((void *) &mdata);
182}
void imap_mdata_free(void **ptr)
Free the private Mailbox data - Implements Mailbox::mdata_free() -.
Definition mdata.c:40
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:855
void imap_get_parent(const char *mbox, char delim, char *buf, size_t buflen)
Get an IMAP folder's parent.
Definition util.c:123
int imap_adata_find(const char *path, struct ImapAccountData **adata, struct ImapMboxData **mdata)
Find the Account data for this path.
Definition util.c:71
+ 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 191 of file util.c.

192{
193 struct ImapAccountData *adata = NULL;
194 struct ImapMboxData *mdata = NULL;
195
196 if (imap_adata_find(path, &adata, &mdata) < 0)
197 return;
198
199 /* Returns a fully qualified IMAP url */
200 imap_qualify_path(path, plen, &adata->conn->account, mdata->name);
201 imap_mdata_free((void *) &mdata);
202}
+ 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 234 of file util.c.

235{
236 int first = 1, state = 0;
237 unsigned int cur_uid = 0, last_uid = 0;
238 unsigned int range_begin = 0, range_end = 0;
239 const size_t max_msn = imap_msn_highest(&mdata->msn);
240
241 for (unsigned int msn = 1; msn <= max_msn + 1; msn++)
242 {
243 bool match = false;
244 if (msn <= max_msn)
245 {
246 struct Email *e_cur = imap_msn_get(&mdata->msn, msn - 1);
247 cur_uid = e_cur ? imap_edata_get(e_cur)->uid : 0;
248 if (!state || (cur_uid && ((cur_uid - 1) == last_uid)))
249 match = true;
250 last_uid = cur_uid;
251 }
252
253 if (match)
254 {
255 switch (state)
256 {
257 case 1: /* single: convert to a range */
258 state = 2;
260
261 case 2: /* extend range ending */
262 range_end = cur_uid;
263 break;
264 default:
265 state = 1;
266 range_begin = cur_uid;
267 break;
268 }
269 }
270 else if (state)
271 {
272 if (first)
273 first = 0;
274 else
275 buf_addch(buf, ',');
276
277 if (state == 1)
278 buf_add_printf(buf, "%u", range_begin);
279 else if (state == 2)
280 buf_add_printf(buf, "%u:%u", range_begin, range_end);
281
282 state = 1;
283 range_begin = cur_uid;
284 }
285 }
286}
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:66
struct Email * imap_msn_get(const struct MSNArray *msn, int idx)
Return the Email associated with an msn.
Definition msn.c:83
size_t imap_msn_highest(const struct MSNArray *msn)
Return the highest MSN in use.
Definition msn.c:72
#define FALLTHROUGH
Definition lib.h:113
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 302 of file util.c.

303{
304 if (!adata || !mdata)
305 return;
306
307 if (mdata->hcache)
308 return;
309
310 struct HeaderCache *hc = NULL;
311 struct Buffer *mbox = buf_pool_get();
312 struct Buffer *cachepath = buf_pool_get();
313
314 imap_cachepath(adata->delim, mdata->name, mbox);
315
316 if (strstr(buf_string(mbox), "/../") || mutt_str_equal(buf_string(mbox), "..") ||
317 mutt_strn_equal(buf_string(mbox), "../", 3))
318 {
319 goto cleanup;
320 }
321 size_t len = buf_len(mbox);
322 if ((len > 3) && (mutt_str_equal(buf_string(mbox) + len - 3, "/..")))
323 goto cleanup;
324
325 struct Url url = { 0 };
326 account_to_url(&adata->conn->account, &url);
327 url.path = mbox->data;
328 url_tobuffer(&url, cachepath, U_PATH);
329
330 const char *const c_header_cache = cs_subset_path(NeoMutt->sub, "header_cache");
331 hc = hcache_open(c_header_cache, buf_string(cachepath), imap_hcache_namer, create);
332
333cleanup:
334 buf_pool_release(&mbox);
335 buf_pool_release(&cachepath);
336 mdata->hcache = hc;
337}
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:291
struct HeaderCache * hcache_open(const char *path, const char *folder, hcache_namer_t namer, bool create)
Multiplexor for StoreOps::open.
Definition hcache.c:473
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:427
void account_to_url(struct ConnAccount *cac, struct Url *url)
Fill URL with info from account.
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
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:357
#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:749
+ 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 343 of file util.c.

344{
345 if (!mdata->hcache)
346 return;
347
348 hcache_close(&mdata->hcache);
349}
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 358 of file util.c.

359{
360 if (!mdata->hcache)
361 return NULL;
362
363 char key[16] = { 0 };
364
365 snprintf(key, sizeof(key), "%u", uid);
366 struct HCacheEntry hce = hcache_fetch_email(mdata->hcache, key, mutt_str_len(key),
367 mdata->uidvalidity);
368 if (!hce.email && hce.uidvalidity)
369 {
370 mutt_debug(LL_DEBUG3, "hcache uidvalidity mismatch: %u\n", hce.uidvalidity);
371 }
372
373 return hce.email;
374}
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 383 of file util.c.

384{
385 if (!mdata->hcache)
386 return -1;
387
388 char key[16] = { 0 };
389
390 snprintf(key, sizeof(key), "%u", imap_edata_get(e)->uid);
391 return hcache_store_email(mdata->hcache, key, mutt_str_len(key), e, mdata->uidvalidity);
392}
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 401 of file util.c.

402{
403 if (!mdata->hcache)
404 return -1;
405
406 char key[16] = { 0 };
407
408 snprintf(key, sizeof(key), "%u", uid);
409 return hcache_delete_email(mdata->hcache, key, mutt_str_len(key));
410}
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 418 of file util.c.

419{
420 if (!mdata->hcache)
421 return -1;
422
423 struct Buffer *buf = buf_pool_get();
424 buf_alloc(buf, 8192); // The seqset is likely large. Preallocate to reduce reallocs
426
427 int rc = hcache_store_raw(mdata->hcache, "UIDSEQSET", 9, buf->data, buf_len(buf) + 1);
428 mutt_debug(LL_DEBUG3, "Stored UIDSEQSET %s\n", buf_string(buf));
429 buf_pool_release(&buf);
430 return rc;
431}
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:234
+ 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 439 of file util.c.

440{
441 if (!mdata->hcache)
442 return -1;
443
444 return hcache_delete_raw(mdata->hcache, "UIDSEQSET", 9);
445}
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 453 of file util.c.

454{
455 if (!mdata->hcache)
456 return NULL;
457
458 char *seqset = hcache_fetch_raw_str(mdata->hcache, "UIDSEQSET", 9);
459 mutt_debug(LL_DEBUG3, "Retrieved UIDSEQSET %s\n", NONULL(seqset));
460
461 return seqset;
462}
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:43
+ 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 477 of file util.c.

478{
479 static unsigned short ImapPort = 0;
480 static unsigned short ImapsPort = 0;
481
482 if (ImapPort == 0)
483 {
484 struct servent *service = getservbyname("imap", "tcp");
485 if (service)
486 ImapPort = ntohs(service->s_port);
487 else
488 ImapPort = IMAP_PORT;
489 mutt_debug(LL_DEBUG3, "Using default IMAP port %d\n", ImapPort);
490 }
491
492 if (ImapsPort == 0)
493 {
494 struct servent *service = getservbyname("imaps", "tcp");
495 if (service)
496 ImapsPort = ntohs(service->s_port);
497 else
498 ImapsPort = IMAP_SSL_PORT;
499 mutt_debug(LL_DEBUG3, "Using default IMAPS port %d\n", ImapsPort);
500 }
501
502 /* Defaults */
503 cac->port = ImapPort;
505 cac->service = "imap";
507
508 struct Url *url = url_parse(path);
509 if (!url)
510 return -1;
511
512 if ((url->scheme != U_IMAP) && (url->scheme != U_IMAPS))
513 {
514 url_free(&url);
515 return -1;
516 }
517
518 if ((account_from_url(cac, url) < 0) || (cac->host[0] == '\0'))
519 {
520 url_free(&url);
521 return -1;
522 }
523
524 if (url->scheme == U_IMAPS)
525 cac->flags |= MUTT_ACCT_SSL;
526
527 mutt_str_copy(mailbox, url->path, mailboxlen);
528
529 url_free(&url);
530
531 if ((cac->flags & MUTT_ACCT_SSL) && !(cac->flags & MUTT_ACCT_PORT))
532 cac->port = ImapsPort;
533
534 return 0;
535}
#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:207
#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 account_from_url(struct ConnAccount *cac, const struct Url *url)
Fill ConnAccount with information from url.
@ MUTT_ACCT_TYPE_IMAP
Imap Account.
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:238
void url_free(struct Url **ptr)
Free the contents of a URL.
Definition url.c:123
@ 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 548 of file util.c.

549{
550 char *b1 = NULL;
551 char *b2 = NULL;
552 int rc;
553
554 if (!mx1 || (*mx1 == '\0'))
555 mx1 = "INBOX";
556 if (!mx2 || (*mx2 == '\0'))
557 mx2 = "INBOX";
558 if (mutt_istr_equal(mx1, "INBOX") && mutt_istr_equal(mx2, "INBOX"))
559 {
560 return 0;
561 }
562
563 b1 = MUTT_MEM_MALLOC(strlen(mx1) + 1, char);
564 b2 = MUTT_MEM_MALLOC(strlen(mx2) + 1, char);
565
566 imap_fix_path(mx1, b1, strlen(mx1) + 1);
567 imap_fix_path(mx2, b2, strlen(mx2) + 1);
568
569 rc = mutt_str_cmp(b1, b2);
570 FREE(&b1);
571 FREE(&b2);
572
573 return rc;
574}
#define FREE(x)
Definition memory.h:62
#define MUTT_MEM_MALLOC(n, type)
Definition memory.h:48
int mutt_str_cmp(const char *a, const char *b)
Compare two strings, safely.
Definition string.c:401
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition string.c:672
char * imap_fix_path(const char *mailbox, char *path, size_t plen)
Fix up the imap path.
Definition util.c:681
+ 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 584 of file util.c.

585{
586 struct ConnAccount cac_target = { { 0 } };
587 struct ConnAccount cac_home = { { 0 } };
588 struct Url url = { 0 };
589 const char *delim = NULL;
590 int tlen;
591 int hlen = 0;
592 bool home_match = false;
593 char target_mailbox[1024] = { 0 };
594 char home_mailbox[1024] = { 0 };
595
596 if (imap_parse_path(path, &cac_target, target_mailbox, sizeof(target_mailbox)) < 0)
597 return;
598
599 if (imap_path_probe(folder, NULL) != MUTT_IMAP)
600 goto fallback;
601
602 if (imap_parse_path(folder, &cac_home, home_mailbox, sizeof(home_mailbox)) < 0)
603 goto fallback;
604
605 tlen = mutt_str_len(target_mailbox);
606 hlen = mutt_str_len(home_mailbox);
607
608 /* check whether we can do '+' substitution */
609 if (tlen && imap_account_match(&cac_home, &cac_target) &&
610 mutt_strn_equal(home_mailbox, target_mailbox, hlen))
611 {
612 const char *const c_imap_delim_chars = cs_subset_string(NeoMutt->sub, "imap_delim_chars");
613 if (hlen == 0)
614 {
615 home_match = true;
616 }
617 else if (c_imap_delim_chars)
618 {
619 for (delim = c_imap_delim_chars; *delim != '\0'; delim++)
620 if (target_mailbox[hlen] == *delim)
621 home_match = true;
622 }
623 }
624
625 /* do the '+' substitution */
626 if (home_match)
627 {
628 *path++ = '+';
629 /* copy remaining path, skipping delimiter */
630 if (hlen != 0)
631 hlen++;
632 memcpy(path, target_mailbox + hlen, tlen - hlen);
633 path[tlen - hlen] = '\0';
634 return;
635 }
636
637fallback:
638 account_to_url(&cac_target, &url);
639 url.path = target_mailbox;
640 url_tostring(&url, path, pathlen, U_NO_FLAGS);
641}
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?
Definition imap.c:2351
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:422
#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 649 of file util.c.

650{
651 imap_error(msg, resp);
652 return query_yesorno(_("Continue?"), MUTT_NO);
653}
#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:325
void imap_error(const char *where, const char *msg)
Show an error and abort.
Definition util.c:660
+ 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 660 of file util.c.

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

◆ imap_fix_path()

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

Fix up the imap path.

Parameters
mailboxMailbox path
pathBuffer for the result
plenLength of buffer
Return values
ptrFixed-up path
Note
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 681 of file util.c.

682{
683 const char *const c_imap_delim_chars = cs_subset_string(NeoMutt->sub, "imap_delim_chars");
684
685 char *out = path;
686 size_t space_left = plen - 1;
687
688 if (mailbox)
689 {
690 for (const char *c = mailbox; *c && space_left; c++, space_left--)
691 {
692 if (strchr(NONULL(c_imap_delim_chars), *c))
693 {
694 return imap_fix_path_with_delim(*c, mailbox, path, plen);
695 }
696 *out++ = *c;
697 }
698 }
699
700 *out = '\0';
701 return path;
702}
char * imap_fix_path_with_delim(const char delim, const char *mailbox, char *path, size_t plen)
Fix up the imap path.
Definition util.c:713
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_fix_path_with_delim()

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

Fix up the imap path.

Parameters
delimDelimiter specified by the server
mailboxMailbox path
pathBuffer for the result
plenLength of buffer
Return values
ptrFixed-up path

Definition at line 713 of file util.c.

714{
715 char *out = path;
716 size_t space_left = plen - 1;
717
718 if (mailbox)
719 {
720 for (const char *c = mailbox; *c && space_left; c++, space_left--)
721 {
722 if (*c == delim || *c == '/')
723 {
724 while (*c && *(c + 1) == *c)
725 c++;
726 *out++ = delim;
727 }
728 else
729 {
730 *out++ = *c;
731 }
732 }
733 }
734
735 if (out != path && *(out - 1) == delim)
736 {
737 out--;
738 }
739 *out = '\0';
740 return path;
741}
+ 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 749 of file util.c.

750{
751 const char *p = mailbox;
752 buf_reset(dest);
753 if (!p)
754 return;
755
756 while (*p)
757 {
758 if (p[0] == delim)
759 {
760 buf_addch(dest, '/');
761 /* simple way to avoid collisions with UIDs */
762 if ((p[1] >= '0') && (p[1] <= '9'))
763 buf_addch(dest, '_');
764 }
765 else
766 {
767 buf_addch(dest, *p);
768 }
769 p++;
770 }
771}
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 780 of file util.c.

781{
782 char *pc = NULL;
783 char *pn = NULL;
784
785 if (!buf || !(pc = strchr(buf, '{')))
786 return -1;
787
788 pc++;
789 pn = pc;
790 while (mutt_isdigit(*pc))
791 pc++;
792 *pc = '\0';
793 if (!mutt_str_atoui(pn, bytes))
794 return -1;
795
796 return 0;
797}
const char * mutt_str_atoui(const char *str, unsigned int *dst)
Convert ASCII string to an unsigned integer.
Definition atoi.c:217
bool mutt_isdigit(int arg)
Wrapper for isdigit(3)
Definition ctype.c:65
+ 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 807 of file util.c.

808{
809 char *s = buf;
810
811 /* skip tag */
812 s = imap_next_word(s);
813 /* skip OK/NO/BAD response */
814 s = imap_next_word(s);
815
816 return s;
817}
char * imap_next_word(char *s)
Find where the next IMAP word begins.
Definition util.c:824
+ 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 824 of file util.c.

825{
826 bool quoted = false;
827
828 while (*s)
829 {
830 if (*s == '\\')
831 {
832 s++;
833 if (*s)
834 s++;
835 continue;
836 }
837 if (*s == '\"')
838 quoted = !quoted;
839 if (!quoted && mutt_isspace(*s))
840 break;
841 s++;
842 }
843
844 SKIPWS(s);
845 return s;
846}
bool mutt_isspace(int arg)
Wrapper for isspace(3)
Definition ctype.c:95
#define SKIPWS(ch)
Definition string2.h:51
+ Here is the call graph for this function:
+ 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 855 of file util.c.

856{
857 struct Url url = { 0 };
858 account_to_url(cac, &url);
859 url.path = path;
860 url_tostring(&url, buf, buflen, U_NO_FLAGS);
861}
+ 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 869 of file util.c.

870{
871 struct Url url = { 0 };
872 account_to_url(cac, &url);
873 url.path = path;
874 url_tobuffer(&url, buf, U_NO_FLAGS);
875}
+ 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 886 of file util.c.

887{
888 const char *quote = "`\"\\";
889 if (!quote_backtick)
890 quote++;
891
892 char *pt = dest;
893 const char *s = src;
894
895 *pt++ = '"';
896 /* save room for quote-chars */
897 dlen -= 3;
898
899 for (; *s && dlen; s++)
900 {
901 if (strchr(quote, *s))
902 {
903 if (dlen < 2)
904 break;
905 dlen -= 2;
906 *pt++ = '\\';
907 *pt++ = *s;
908 }
909 else
910 {
911 *pt++ = *s;
912 dlen--;
913 }
914 }
915 *pt++ = '"';
916 *pt = '\0';
917}
+ 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 923 of file util.c.

924{
925 char *d = s;
926
927 if (*s == '\"')
928 s++;
929 else
930 return;
931
932 while (*s)
933 {
934 if (*s == '\"')
935 {
936 *d = '\0';
937 return;
938 }
939 if (*s == '\\')
940 {
941 s++;
942 }
943 if (*s)
944 {
945 *d = *s;
946 d++;
947 s++;
948 }
949 }
950 *d = '\0';
951}
+ 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 960 of file util.c.

961{
962 char *buf = mutt_str_dup(src);
963 imap_utf_encode(unicode, &buf);
964
965 imap_quote_string(dest, dlen, buf, false);
966
967 FREE(&buf);
968}
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:255
void imap_quote_string(char *dest, size_t dlen, const char *src, bool quote_backtick)
Quote string according to IMAP rules.
Definition util.c:886
+ 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 977 of file util.c.

978{
980
981 char *buf = mutt_str_dup(s);
982 if (buf)
983 {
984 imap_utf_decode(unicode, &buf);
985 strncpy(s, buf, strlen(s));
986 }
987
988 FREE(&buf);
989}
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:923
+ 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 994 of file util.c.

995{
996 time_t now = mutt_date_now();
997 const short c_imap_keep_alive = cs_subset_number(NeoMutt->sub, "imap_keep_alive");
998
999 struct Account **ap = NULL;
1001 {
1002 struct Account *a = *ap;
1003 if (a->type != MUTT_IMAP)
1004 continue;
1005
1006 struct ImapAccountData *adata = a->adata;
1007 if (!adata || !adata->mailbox)
1008 continue;
1009
1010 if ((adata->state >= IMAP_AUTHENTICATED) && (now >= (adata->lastread + c_imap_keep_alive)))
1011 imap_check_mailbox(adata->mailbox, true);
1012 }
1013}
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:1036
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition date.c:455
+ 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 1020 of file util.c.

1021{
1022 struct sigaction oldalrm = { 0 };
1023 struct sigaction act = { 0 };
1024 sigset_t oldmask = { 0 };
1025 int rc;
1026
1027 const bool c_imap_passive = cs_subset_bool(NeoMutt->sub, "imap_passive");
1028 cs_subset_str_native_set(NeoMutt->sub, "imap_passive", true, NULL);
1029 OptKeepQuiet = true;
1030
1031 sigprocmask(SIG_SETMASK, NULL, &oldmask);
1032
1033 sigemptyset(&act.sa_mask);
1034 act.sa_handler = mutt_sig_empty_handler;
1035#ifdef SA_INTERRUPT
1036 act.sa_flags = SA_INTERRUPT;
1037#else
1038 act.sa_flags = 0;
1039#endif
1040
1041 sigaction(SIGALRM, &act, &oldalrm);
1042
1043 const short c_imap_keep_alive = cs_subset_number(NeoMutt->sub, "imap_keep_alive");
1044 alarm(c_imap_keep_alive);
1045 while ((waitpid(pid, &rc, 0) < 0) && (errno == EINTR))
1046 {
1047 alarm(0); /* cancel a possibly pending alarm */
1049 alarm(c_imap_keep_alive);
1050 }
1051
1052 alarm(0); /* cancel a possibly pending alarm */
1053
1054 sigaction(SIGALRM, &oldalrm, NULL);
1055 sigprocmask(SIG_SETMASK, &oldmask, NULL);
1056
1057 OptKeepQuiet = false;
1058 cs_subset_str_native_set(NeoMutt->sub, "imap_passive", c_imap_passive, NULL);
1059
1060 return rc;
1061}
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:60
void mutt_sig_empty_handler(int sig)
Dummy signal handler.
Definition signal.c:130
int cs_subset_str_native_set(const struct ConfigSubset *sub, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
Definition subset.c:303
void imap_keep_alive(void)
Poll the current folder to keep the connection alive.
Definition util.c:994
+ 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 1067 of file util.c.

1068{
1070 struct ImapMboxData *mdata = imap_mdata_get(m);
1071 if (!adata || !adata->mailbox || (adata->mailbox != m) || !mdata)
1072 return;
1073 mdata->reopen |= IMAP_REOPEN_ALLOW;
1074}
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:61
#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 1080 of file util.c.

1081{
1083 struct ImapMboxData *mdata = imap_mdata_get(m);
1084 if (!adata || !adata->mailbox || (adata->mailbox != m) || !mdata)
1085 return;
1086 mdata->reopen &= ~IMAP_REOPEN_ALLOW;
1087}
+ 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 1095 of file util.c.

1096{
1097 if (!a1 || !a2)
1098 return false;
1099 if (a1->type != a2->type)
1100 return false;
1101 if (!mutt_istr_equal(a1->host, a2->host))
1102 return false;
1103 if ((a1->port != 0) && (a2->port != 0) && (a1->port != a2->port))
1104 return false;
1105 if (a1->flags & a2->flags & MUTT_ACCT_USER)
1106 return mutt_str_equal(a1->user, a2->user);
1107
1108 const char *user = NONULL(NeoMutt->username);
1109
1110 const char *const c_imap_user = cs_subset_string(NeoMutt->sub, "imap_user");
1111 if ((a1->type == MUTT_ACCT_TYPE_IMAP) && c_imap_user)
1112 user = c_imap_user;
1113
1114 if (a1->flags & MUTT_ACCT_USER)
1115 return mutt_str_equal(a1->user, user);
1116 if (a2->flags & MUTT_ACCT_USER)
1117 return mutt_str_equal(a2->user, user);
1118
1119 return true;
1120}
#define MUTT_ACCT_USER
User field has been set.
Definition connaccount.h:44
char user[128]
Username.
Definition connaccount.h:56
char * username
User's login name.
Definition neomutt.h:53
+ 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 1127 of file util.c.

1128{
1129 if (!seqset || (*seqset == '\0'))
1130 return NULL;
1131
1132 struct SeqsetIterator *iter = MUTT_MEM_CALLOC(1, struct SeqsetIterator);
1133 iter->full_seqset = mutt_str_dup(seqset);
1134 iter->eostr = strchr(iter->full_seqset, '\0');
1135 iter->substr_cur = iter->substr_end = iter->full_seqset;
1136
1137 return iter;
1138}
#define MUTT_MEM_CALLOC(n, type)
Definition memory.h:47
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 1148 of file util.c.

1149{
1150 if (!iter || !next)
1151 return -1;
1152
1153 if (iter->in_range)
1154 {
1155 if ((iter->down && (iter->range_cur == (iter->range_end - 1))) ||
1156 (!iter->down && (iter->range_cur == (iter->range_end + 1))))
1157 {
1158 iter->in_range = 0;
1159 }
1160 }
1161
1162 if (!iter->in_range)
1163 {
1164 iter->substr_cur = iter->substr_end;
1165 if (iter->substr_cur == iter->eostr)
1166 return 1;
1167
1168 iter->substr_end = strchr(iter->substr_cur, ',');
1169 if (!iter->substr_end)
1170 iter->substr_end = iter->eostr;
1171 else
1172 *(iter->substr_end++) = '\0';
1173
1174 char *range_sep = strchr(iter->substr_cur, ':');
1175 if (range_sep)
1176 *range_sep++ = '\0';
1177
1178 if (!mutt_str_atoui_full(iter->substr_cur, &iter->range_cur))
1179 return -1;
1180 if (range_sep)
1181 {
1182 if (!mutt_str_atoui_full(range_sep, &iter->range_end))
1183 return -1;
1184 }
1185 else
1186 {
1187 iter->range_end = iter->range_cur;
1188 }
1189
1190 iter->down = (iter->range_end < iter->range_cur);
1191 iter->in_range = 1;
1192 }
1193
1194 *next = iter->range_cur;
1195 if (iter->down)
1196 iter->range_cur--;
1197 else
1198 iter->range_cur++;
1199
1200 return 0;
1201}
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 1207 of file util.c.

1208{
1209 if (!ptr || !*ptr)
1210 return;
1211
1212 struct SeqsetIterator *iter = *ptr;
1213 FREE(&iter->full_seqset);
1214 FREE(ptr);
1215}
+ Here is the caller graph for this function: