NeoMutt  2025-12-11-980-ge38c27
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
mbox_open()

Open a Mailbox. More...

+ Collaboration diagram for mbox_open():

Functions

static enum MxOpenReturns comp_mbox_open (struct Mailbox *m)
 Open a Mailbox - Implements MxOps::mbox_open() -.
 
static enum MxOpenReturns imap_mbox_open (struct Mailbox *m)
 Open a mailbox - Implements MxOps::mbox_open() -.
 
enum MxOpenReturns maildir_mbox_open (struct Mailbox *m)
 Open a Mailbox - Implements MxOps::mbox_open() -.
 
static enum MxOpenReturns mbox_mbox_open (struct Mailbox *m)
 Open a Mailbox - Implements MxOps::mbox_open() -.
 
static enum MxOpenReturns mh_mbox_open (struct Mailbox *m)
 Open a Mailbox - Implements MxOps::mbox_open() -.
 
static enum MxOpenReturns nntp_mbox_open (struct Mailbox *m)
 Open a Mailbox - Implements MxOps::mbox_open() -.
 
static enum MxOpenReturns nm_mbox_open (struct Mailbox *m)
 Open a Mailbox - Implements MxOps::mbox_open() -.
 
static enum MxOpenReturns pop_mbox_open (struct Mailbox *m)
 Open a Mailbox - Implements MxOps::mbox_open() -.
 

Detailed Description

Open a Mailbox.

Parameters
mMailbox to open
Return values
enumMxOpenReturns
Precondition
m is not NULL

Function Documentation

◆ comp_mbox_open()

static enum MxOpenReturns comp_mbox_open ( struct Mailbox * m)
static

Open a Mailbox - Implements MxOps::mbox_open() -.

Set up a compressed mailbox to be read. Decompress the mailbox and set up the paths and hooks needed. Then determine the type of the mailbox so we can delegate the handling of messages.

Definition at line 418 of file compress.c.

419{
420 struct CompressInfo *ci = set_compress_info(m);
421 if (!ci)
422 return MX_OPEN_ERROR;
423
424 /* If there's no close-hook, or the file isn't writable */
425 if (!ci->cmd_close || (access(mailbox_path(m), W_OK) != 0))
426 m->readonly = true;
427
428 if (setup_paths(m) != 0)
429 goto cmo_fail;
430 store_size(m);
431
432 if (!lock_realpath(m, false))
433 {
434 mutt_error(_("Unable to lock mailbox"));
435 goto cmo_fail;
436 }
437
438 if (!execute_command(m, ci->cmd_open, _("Decompressing %s")))
439 goto cmo_fail;
440
442
444 if (m->type == MUTT_UNKNOWN)
445 {
446 mutt_error(_("Can't identify the contents of the compressed file"));
447 goto cmo_fail;
448 }
449
450 ci->child_ops = mx_get_ops(m->type);
451 if (!ci->child_ops)
452 {
453 mutt_error(_("Can't find mailbox ops for mailbox type %d"), m->type);
454 goto cmo_fail;
455 }
456
457 m->account->type = m->type;
458 return ci->child_ops->mbox_open(m);
459
460cmo_fail:
461 /* remove the partial uncompressed file */
462 (void) remove(mailbox_path(m));
464 return MX_OPEN_ERROR;
465}
static struct CompressInfo * set_compress_info(struct Mailbox *m)
Find the compress hooks for a mailbox.
Definition compress.c:239
static void compress_info_free(struct Mailbox *m)
Frees the compress info members and structure.
Definition compress.c:269
static int setup_paths(struct Mailbox *m)
Set the mailbox paths.
Definition compress.c:179
static void store_size(const struct Mailbox *m)
Save the size of the compressed file.
Definition compress.c:202
static bool lock_realpath(struct Mailbox *m, bool excl)
Try to lock the Mailbox.realpath.
Definition compress.c:108
static void unlock_realpath(struct Mailbox *m)
Unlock the mailbox->realpath.
Definition compress.c:153
static bool execute_command(struct Mailbox *m, const struct Expando *exp, const char *progress)
Run a system command.
Definition compress.c:295
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
Definition mailbox.h:216
@ MUTT_UNKNOWN
Mailbox wasn't recognised.
Definition mailbox.h:43
#define mutt_error(...)
Definition logging2.h:94
#define _(a)
Definition message.h:28
const struct MxOps * mx_get_ops(enum MailboxType type)
Get mailbox operations.
Definition mx.c:124
enum MailboxType mx_path_probe(const char *path)
Find a mailbox that understands a path.
Definition mx.c:1326
@ MX_OPEN_ERROR
Open failed with an error.
Definition mxapi.h:85
enum MailboxType type
Type of Mailboxes this Account contains.
Definition account.h:37
Private data for compress.
Definition lib.h:61
struct Expando * cmd_open
open-hook command
Definition lib.h:64
const struct MxOps * child_ops
callbacks of de-compressed file
Definition lib.h:66
struct Expando * cmd_close
close-hook command
Definition lib.h:63
enum MailboxType type
Mailbox type.
Definition mailbox.h:104
struct Account * account
Account that owns this Mailbox.
Definition mailbox.h:129
bool readonly
Don't allow changes to the mailbox.
Definition mailbox.h:118
enum MxOpenReturns(* mbox_open)(struct Mailbox *m)
Definition mxapi.h:143
+ Here is the call graph for this function:

◆ imap_mbox_open()

static enum MxOpenReturns imap_mbox_open ( struct Mailbox * m)
static

Open a mailbox - Implements MxOps::mbox_open() -.

Definition at line 2321 of file imap.c.

2322{
2323 if (!m->account || !m->mdata)
2324 return MX_OPEN_ERROR;
2325
2326 char buf[PATH_MAX] = { 0 };
2327 int count = 0;
2328
2330 struct ImapMboxData *mdata = imap_mdata_get(m);
2331 if (!adata || !mdata)
2332 return MX_OPEN_ERROR;
2333
2334 mutt_debug(LL_DEBUG3, "opening %s, stranding %p\n", m->pathbuf.data,
2335 (void *) adata->mailbox);
2336 adata->prev_mailbox = adata->mailbox;
2337 adata->mailbox = m;
2338
2339 /* clear mailbox status */
2340 adata->status = 0;
2341 m->rights = 0;
2342 mdata->new_mail_count = 0;
2343
2344 if (m->verbose)
2345 mutt_message(_("Selecting %s..."), mdata->name);
2346
2347 /* pipeline ACL test */
2348 if (adata->capabilities & IMAP_CAP_ACL)
2349 {
2350 snprintf(buf, sizeof(buf), "MYRIGHTS %s", mdata->munge_name);
2351 imap_exec(adata, buf, IMAP_CMD_QUEUE);
2352 }
2353 else
2354 {
2355 /* assume we have all rights if ACL is unavailable */
2358 }
2359
2360 /* pipeline the postponed count if possible */
2361 const char *const c_postponed = cs_subset_string(NeoMutt->sub, "postponed");
2362 struct Mailbox *m_postponed = mx_mbox_find2(c_postponed);
2363 struct ImapAccountData *postponed_adata = imap_adata_get(m_postponed);
2364 if (postponed_adata &&
2365 imap_account_match(&postponed_adata->conn->account, &adata->conn->account))
2366 {
2367 imap_mailbox_status(m_postponed, true);
2368 }
2369
2370 const bool c_imap_check_subscribed = cs_subset_bool(NeoMutt->sub, "imap_check_subscribed");
2371 if (c_imap_check_subscribed)
2372 imap_exec(adata, "LSUB \"\" \"*\"", IMAP_CMD_QUEUE);
2373
2374 if (imap_select_and_poll(m, &count) < 0)
2375 goto fail;
2376
2377 mx_alloc_memory(m, count);
2378
2379 m->msg_count = 0;
2380 m->msg_unread = 0;
2381 m->msg_flagged = 0;
2382 m->msg_new = 0;
2383 m->msg_deleted = 0;
2384 m->size = 0;
2385 m->vcount = 0;
2386
2387 if ((count > 0) && (imap_read_headers(m, 1, count, true) < 0))
2388 {
2389 mutt_error(_("Error opening mailbox"));
2390 goto fail;
2391 }
2392
2393 mutt_debug(LL_DEBUG2, "msg_count is %d\n", m->msg_count);
2394 return MX_OPEN_OK;
2395
2396fail:
2397 adata->mailbox = adata->prev_mailbox;
2398 adata->prev_mailbox = NULL;
2399 if (adata->state == IMAP_SELECTED)
2400 adata->state = IMAP_AUTHENTICATED;
2401 return MX_OPEN_ERROR;
2402}
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition helpers.c:291
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
@ MUTT_ACL_WRITE
Write to a message (for flagging or linking threads)
Definition mailbox.h:71
@ MUTT_ACL_INSERT
Add/copy into the mailbox (used when editing a message)
Definition mailbox.h:66
@ MUTT_ACL_READ
Read the mailbox.
Definition mailbox.h:69
@ MUTT_ACL_POST
Post (submit messages to the server)
Definition mailbox.h:68
@ MUTT_ACL_CREATE
Create a mailbox.
Definition mailbox.h:62
@ MUTT_ACL_DELETE
Delete a message.
Definition mailbox.h:63
@ MUTT_ACL_SEEN
Change the 'seen' status of a message.
Definition mailbox.h:70
@ MUTT_ACL_LOOKUP
Lookup mailbox (visible to 'list')
Definition mailbox.h:67
#define mutt_message(...)
Definition logging2.h:93
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
struct ImapAccountData * imap_adata_get(struct Mailbox *m)
Get the Account data for this mailbox.
Definition adata.c:162
int imap_exec(struct ImapAccountData *adata, const char *cmdstr, ImapCmdFlags flags)
Execute a command and wait for the response from the server.
Definition command.c:1420
struct ImapMboxData * imap_mdata_get(struct Mailbox *m)
Get the Mailbox data for this mailbox.
Definition mdata.c:61
int imap_read_headers(struct Mailbox *m, unsigned int msn_begin, unsigned int msn_end, bool initial_download)
Read headers from the server.
Definition message.c:1366
@ IMAP_AUTHENTICATED
Connection is authenticated.
Definition private.h:120
@ IMAP_SELECTED
Mailbox is selected.
Definition private.h:121
bool imap_account_match(const struct ConnAccount *a1, const struct ConnAccount *a2)
Compare two Accounts.
Definition util.c:1109
@ IMAP_CAP_ACL
RFC2086: IMAP4 ACL extension.
Definition private.h:138
@ IMAP_CMD_QUEUE
Queue a command, do not execute.
Definition private.h:84
int imap_mailbox_status(struct Mailbox *m, bool queue)
Refresh the number of total and new messages.
Definition imap.c:1397
static int imap_select_and_poll(struct Mailbox *m, int *countp)
Send SELECT and parse the untagged responses.
Definition imap.c:2112
@ LL_DEBUG3
Log at debug level 3.
Definition logging2.h:47
@ LL_DEBUG2
Log at debug level 2.
Definition logging2.h:46
#define PATH_MAX
Definition mutt.h:49
void mx_alloc_memory(struct Mailbox *m, int req_size)
Create storage for the emails.
Definition mx.c:1211
struct Mailbox * mx_mbox_find2(const char *path)
Find a Mailbox on an Account.
Definition mx.c:1618
@ MX_OPEN_OK
Open succeeded.
Definition mxapi.h:84
void * adata
Private data (for Mailbox backends)
Definition account.h:42
char * data
Pointer to data.
Definition buffer.h:37
struct ConnAccount account
Account details: username, password, etc.
Definition connection.h:49
IMAP-specific Account data -.
Definition adata.h:40
struct Mailbox * prev_mailbox
Previously selected mailbox.
Definition adata.h:81
ImapCapFlags capabilities
Capability flags.
Definition adata.h:56
struct Mailbox * mailbox
Current selected mailbox.
Definition adata.h:80
unsigned char status
ImapFlags, e.g. IMAP_FATAL.
Definition adata.h:46
struct Connection * conn
Connection to IMAP server.
Definition adata.h:41
IMAP-specific Mailbox data -.
Definition mdata.h:40
A mailbox.
Definition mailbox.h:81
int vcount
The number of virtual messages.
Definition mailbox.h:101
int msg_new
Number of new messages.
Definition mailbox.h:94
int msg_count
Total number of messages.
Definition mailbox.h:90
AclFlags rights
ACL bits, see AclFlags.
Definition mailbox.h:121
void * mdata
Driver specific data.
Definition mailbox.h:134
struct Buffer pathbuf
Path of the Mailbox.
Definition mailbox.h:82
int msg_deleted
Number of deleted messages.
Definition mailbox.h:95
off_t size
Size of the Mailbox.
Definition mailbox.h:86
int msg_flagged
Number of flagged messages.
Definition mailbox.h:92
bool verbose
Display status messages?
Definition mailbox.h:119
int msg_unread
Number of unread messages.
Definition mailbox.h:91
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
+ Here is the call graph for this function:

◆ maildir_mbox_open()

enum MxOpenReturns maildir_mbox_open ( struct Mailbox * m)

Open a Mailbox - Implements MxOps::mbox_open() -.

Definition at line 747 of file mailbox.c.

748{
749 if ((maildir_read_dir(m, "new") == -1) || (maildir_read_dir(m, "cur") == -1))
750 return MX_OPEN_ERROR;
751
752 return MX_OPEN_OK;
753}
static int maildir_read_dir(struct Mailbox *m, const char *subdir)
Read a Maildir style mailbox.
Definition mailbox.c:488
+ Here is the call graph for this function:

◆ mbox_mbox_open()

static enum MxOpenReturns mbox_mbox_open ( struct Mailbox * m)
static

Open a Mailbox - Implements MxOps::mbox_open() -.

Definition at line 857 of file mbox.c.

858{
859 if (init_mailbox(m) != 0)
860 return MX_OPEN_ERROR;
861
863 if (!adata)
864 return MX_OPEN_ERROR;
865
866 adata->fp = m->readonly ? NULL : mbox_open_readwrite(m);
867 if (!adata->fp)
868 {
869 adata->fp = mbox_open_readonly(m);
870 }
871 if (!adata->fp)
872 {
873 mutt_perror("%s", mailbox_path(m));
874 return MX_OPEN_ERROR;
875 }
876
878 if (mbox_lock_mailbox(m, false, true) == -1)
879 {
881 return MX_OPEN_ERROR;
882 }
883
884 m->has_new = true;
886 if (m->type == MUTT_MBOX)
887 rc = mbox_parse_mailbox(m);
888 else if (m->type == MUTT_MMDF)
889 rc = mmdf_parse_mailbox(m);
890 else
891 rc = MX_OPEN_ERROR;
892
893 if (!mbox_has_new(m))
894 m->has_new = false;
895 clearerr(adata->fp); // Clear the EOF flag
896 mutt_file_touch_atime(fileno(adata->fp));
897
900 return rc;
901}
@ MUTT_MMDF
'mmdf' Mailbox type
Definition mailbox.h:45
@ MUTT_MBOX
'mbox' Mailbox type
Definition mailbox.h:44
void mutt_file_touch_atime(int fd)
Set the access time to current time.
Definition file.c:961
#define mutt_perror(...)
Definition logging2.h:95
static enum MxOpenReturns mbox_parse_mailbox(struct Mailbox *m)
Read a mailbox from disk.
Definition mbox.c:356
static bool mbox_has_new(struct Mailbox *m)
Does the mailbox have new mail.
Definition mbox.c:755
static int mbox_lock_mailbox(struct Mailbox *m, bool excl, bool retry)
Lock a mailbox.
Definition mbox.c:136
static struct MboxAccountData * mbox_adata_get(struct Mailbox *m)
Get the private data associated with a Mailbox.
Definition mbox.c:121
static int init_mailbox(struct Mailbox *m)
Add Mbox data to the Mailbox.
Definition mbox.c:102
static FILE * mbox_open_readwrite(struct Mailbox *m)
Open an mbox read-write.
Definition mbox.c:831
static FILE * mbox_open_readonly(struct Mailbox *m)
Open an mbox read-only.
Definition mbox.c:846
static void mbox_unlock_mailbox(struct Mailbox *m)
Unlock a mailbox.
Definition mbox.c:160
static enum MxOpenReturns mmdf_parse_mailbox(struct Mailbox *m)
Read a mailbox in MMDF format.
Definition mbox.c:180
MxOpenReturns
Return values for mbox_open()
Definition mxapi.h:83
void mutt_sig_block(void)
Block signals during critical operations.
Definition signal.c:227
void mutt_sig_unblock(void)
Restore previously blocked signals.
Definition signal.c:245
bool has_new
Mailbox has new mail.
Definition mailbox.h:87
Mbox-specific Account data -.
Definition lib.h:50
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mh_mbox_open()

static enum MxOpenReturns mh_mbox_open ( struct Mailbox * m)
static

Open a Mailbox - Implements MxOps::mbox_open() -.

Definition at line 821 of file mh.c.

822{
824}
static bool mh_read_dir(struct Mailbox *m)
Read an MH mailbox.
Definition mh.c:667
+ Here is the call graph for this function:

◆ nntp_mbox_open()

static enum MxOpenReturns nntp_mbox_open ( struct Mailbox * m)
static

Open a Mailbox - Implements MxOps::mbox_open() -.

Definition at line 2391 of file nntp.c.

2392{
2394 if (!m->account)
2395 return MX_OPEN_ERROR;
2396
2397 char buf[8192] = { 0 };
2398 char server[1024] = { 0 };
2399 char *group = NULL;
2400 int rc;
2401 struct HeaderCache *hc = NULL;
2402 anum_t first = 0;
2403 anum_t last = 0;
2404 anum_t count = 0;
2405
2406 struct Url *url = url_parse(mailbox_path(m));
2407 if (!url || !url->host || !url->path ||
2408 !((url->scheme == U_NNTP) || (url->scheme == U_NNTPS)))
2409 {
2410 url_free(&url);
2411 mutt_error(_("%s is an invalid newsgroup specification"), mailbox_path(m));
2412 return MX_OPEN_ERROR;
2413 }
2414
2415 group = url->path;
2416 if (group[0] == '/') /* Skip a leading '/' */
2417 group++;
2418
2419 url->path = strchr(url->path, '\0');
2420 url_tostring(url, server, sizeof(server), U_NONE);
2421
2423 struct NntpAccountData *adata = m->account->adata;
2424 if (!adata)
2425 adata = mod_data->current_news_srv;
2426 if (!adata)
2427 {
2428 adata = nntp_select_server(m, server, true);
2429 m->account->adata = adata;
2431 }
2432
2433 if (!adata)
2434 {
2435 url_free(&url);
2436 return MX_OPEN_ERROR;
2437 }
2438 mod_data->current_news_srv = adata;
2439
2440 m->msg_count = 0;
2441 m->msg_unread = 0;
2442 m->vcount = 0;
2443
2444 if (group[0] == '/')
2445 group++;
2446
2447 /* find news group data structure */
2449 if (!mdata)
2450 {
2452 mutt_error(_("Newsgroup %s not found on the server"), group);
2453 url_free(&url);
2454 return MX_OPEN_ERROR;
2455 }
2456
2457 m->rights &= ~MUTT_ACL_INSERT; // Clear the flag
2458 const bool c_save_unsubscribed = cs_subset_bool(NeoMutt->sub, "save_unsubscribed");
2459 if (!mdata->newsrc_ent && !mdata->subscribed && !c_save_unsubscribed)
2460 m->readonly = true;
2461
2462 /* select newsgroup */
2463 mutt_message(_("Selecting %s..."), group);
2464 url_free(&url);
2465 buf[0] = '\0';
2466 if (nntp_query(mdata, buf, sizeof(buf)) < 0)
2467 {
2469 return MX_OPEN_ERROR;
2470 }
2471
2472 /* newsgroup not found, remove it */
2473 if (mutt_str_startswith(buf, "411"))
2474 {
2475 mutt_error(_("Newsgroup %s has been removed from the server"), mdata->group);
2476 if (!mdata->deleted)
2477 {
2478 mdata->deleted = true;
2480 }
2481 if (mdata->newsrc_ent && !mdata->subscribed && !c_save_unsubscribed)
2482 {
2483 FREE(&mdata->newsrc_ent);
2484 mdata->newsrc_len = 0;
2487 }
2488 }
2489 else
2490 {
2491 /* parse newsgroup info */
2492 if (sscanf(buf, "211 " ANUM_FMT " " ANUM_FMT " " ANUM_FMT, &count, &first, &last) != 3)
2493 {
2495 mutt_error("GROUP: %s", buf);
2496 return MX_OPEN_ERROR;
2497 }
2498 mdata->first_message = first;
2499 mdata->last_message = last;
2500 mdata->deleted = false;
2501
2502 /* get description if empty */
2503 const bool c_nntp_load_description = cs_subset_bool(NeoMutt->sub, "nntp_load_description");
2504 if (c_nntp_load_description && !mdata->desc)
2505 {
2506 if (get_description(mdata, NULL, NULL) < 0)
2507 {
2509 return MX_OPEN_ERROR;
2510 }
2511 if (mdata->desc)
2513 }
2514 }
2515
2517 m->mdata = mdata;
2518 // Every known newsgroup has an mdata which is stored in adata->groups_list.
2519 // Currently we don't let the Mailbox free the mdata.
2520 // m->mdata_free = nntp_mdata_free;
2521 if (!mdata->bcache && (mdata->newsrc_ent || mdata->subscribed || c_save_unsubscribed))
2522 mdata->bcache = mutt_bcache_open(&adata->conn->account, mdata->group);
2523
2524 /* strip off extra articles if adding context is greater than $nntp_context */
2525 first = mdata->first_message;
2526 const long c_nntp_context = cs_subset_long(NeoMutt->sub, "nntp_context");
2527 if (c_nntp_context && ((mdata->last_message - first + 1) > c_nntp_context))
2528 first = mdata->last_message - c_nntp_context + 1;
2529 mdata->last_loaded = first ? first - 1 : 0;
2530 count = mdata->first_message;
2531 mdata->first_message = first;
2533 mdata->first_message = count;
2534#ifdef USE_HCACHE
2535 hc = nntp_hcache_open(mdata);
2537#endif
2538 if (!hc)
2539 m->rights &= ~(MUTT_ACL_WRITE | MUTT_ACL_DELETE); // Clear the flags
2540
2542 rc = nntp_fetch_headers(m, hc, first, mdata->last_message, false);
2543#ifdef USE_HCACHE
2544 hcache_close(&hc);
2545#endif
2546 if (rc < 0)
2547 return MX_OPEN_ERROR;
2548 mdata->last_loaded = mdata->last_message;
2549 adata->newsrc_modified = false;
2550 return MX_OPEN_OK;
2551}
struct BodyCache * mutt_bcache_open(struct ConnAccount *account, const char *mailbox)
Open an Email-Body Cache.
Definition bcache.c:162
long cs_subset_long(const struct ConfigSubset *sub, const char *name)
Get a long config item by name.
Definition helpers.c:95
void nntp_adata_free(void **ptr)
Free the private Account data - Implements Account::adata_free() -.
Definition adata.c:42
void * mutt_hash_find(const struct HashTable *table, const char *strkey)
Find the HashElem data in a Hash Table element using a key.
Definition hash.c:365
void hcache_close(struct HeaderCache **ptr)
Multiplexor for StoreOps::close.
Definition hcache.c:564
void exec_account_hook(const char *url)
Perform an account hook.
Definition exec.c:328
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
@ MODULE_ID_NNTP
ModuleNntp, Nntp
Definition module_api.h:83
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition date.c:459
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
Definition string.c:234
void * neomutt_get_module_data(struct NeoMutt *n, enum ModuleId id)
Get the private data for a Module.
Definition neomutt.c:666
struct HeaderCache * nntp_hcache_open(struct NntpMboxData *mdata)
Open newsgroup hcache.
Definition newsrc.c:712
void nntp_delete_group_cache(struct NntpMboxData *mdata)
Remove hcache and bcache of newsgroup.
Definition newsrc.c:814
void nntp_hcache_update(struct NntpMboxData *mdata, struct HeaderCache *hc)
Remove stale cached headers.
Definition newsrc.c:736
int nntp_active_save_cache(struct NntpAccountData *adata)
Save list of all newsgroups to cache.
Definition newsrc.c:651
void nntp_bcache_update(struct NntpMboxData *mdata)
Remove stale cached messages.
Definition newsrc.c:805
void nntp_newsrc_close(struct NntpAccountData *adata)
Unlock and close .newsrc file.
Definition newsrc.c:121
int nntp_newsrc_update(struct NntpAccountData *adata)
Update .newsrc file.
Definition newsrc.c:446
#define ANUM_FMT
Definition lib.h:64
struct NntpAccountData * nntp_select_server(struct Mailbox *m, const char *server, bool leave_lock)
Open a connection to an NNTP server.
Definition newsrc.c:957
#define anum_t
Definition lib.h:63
static int nntp_query(struct NntpMboxData *mdata, char *line, size_t linelen)
Send data from buffer and receive answer to same buffer.
Definition nntp.c:733
static int get_description(struct NntpMboxData *mdata, const char *wildmat, const char *msg)
Fetch newsgroups descriptions.
Definition nntp.c:939
static int nntp_fetch_headers(struct Mailbox *m, void *hc, anum_t first, anum_t last, bool restore)
Fetch headers.
Definition nntp.c:1208
void(* adata_free)(void **ptr)
Definition account.h:53
Header Cache.
Definition lib.h:87
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
Definition mailbox.h:83
NNTP-specific Account data -.
Definition adata.h:36
bool newsrc_modified
Newsrc file was modified.
Definition adata.h:49
struct HashTable * groups_hash
Hash Table: "newsgroup" -> NntpMboxData.
Definition adata.h:62
struct Connection * conn
Connection to NNTP Server.
Definition adata.h:63
time_t check_time
Last check time.
Definition adata.h:57
NNTP-specific Mailbox data -.
Definition mdata.h:34
char * group
Name of newsgroup.
Definition mdata.h:35
struct NntpAccountData * adata
Account data.
Definition mdata.h:48
Nntp private Module data.
Definition module_data.h:30
struct NntpAccountData * current_news_srv
Current NNTP news server.
Definition module_data.h:32
A parsed URL proto://user:password@host:port/path?a=1&b=2
Definition url.h:69
char * host
Host.
Definition url.h:73
char * path
Path.
Definition url.h:75
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:242
void url_free(struct Url **ptr)
Free the contents of a URL.
Definition url.c:124
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:426
@ U_NNTPS
Url is nntps://.
Definition url.h:42
@ U_NNTP
Url is nntp://.
Definition url.h:41
#define U_NONE
No flags are set for URL parsing.
Definition url.h:49
+ Here is the call graph for this function:

◆ nm_mbox_open()

static enum MxOpenReturns nm_mbox_open ( struct Mailbox * m)
static

Open a Mailbox - Implements MxOps::mbox_open() -.

Definition at line 2055 of file notmuch.c.

2056{
2057 if (init_mailbox(m) != 0)
2058 return MX_OPEN_ERROR;
2059
2060 struct NmMboxData *mdata = nm_mdata_get(m);
2061 if (!mdata)
2062 return MX_OPEN_ERROR;
2063
2064 mutt_debug(LL_DEBUG1, "nm: reading messages...[current count=%d]\n", m->msg_count);
2065
2066 progress_setup(m);
2067 enum MxOpenReturns rc = MX_OPEN_ERROR;
2068
2069 notmuch_query_t *q = get_query(m, false);
2070 if (q)
2071 {
2072 rc = MX_OPEN_OK;
2073 switch (mdata->query_type)
2074 {
2075 case NM_QUERY_TYPE_UNKNOWN: // UNKNOWN should never occur, but MESGS is default
2077 if (!read_mesgs_query(m, q, false))
2078 rc = MX_OPEN_ABORT;
2079 break;
2081 if (!read_threads_query(m, q, false, get_limit(mdata)))
2082 rc = MX_OPEN_ABORT;
2083 break;
2084 }
2085 notmuch_query_destroy(q);
2086 }
2087
2088 nm_db_release(m);
2089
2090 mdata->mtime.tv_sec = mutt_date_now();
2091 mdata->mtime.tv_nsec = 0;
2092
2093 mdata->oldmsgcount = 0;
2094
2095 mutt_debug(LL_DEBUG1, "nm: reading messages... done [rc=%d, count=%d]\n", rc, m->msg_count);
2096 progress_free(&mdata->progress);
2097 return rc;
2098}
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
@ MX_OPEN_ABORT
Open was aborted.
Definition mxapi.h:86
int nm_db_release(struct Mailbox *m)
Close the Notmuch database.
Definition db.c:245
struct NmMboxData * nm_mdata_get(struct Mailbox *m)
Get the Notmuch Mailbox data.
Definition mdata.c:96
static int init_mailbox(struct Mailbox *m)
Add Notmuch data to the Mailbox.
Definition notmuch.c:192
static int get_limit(struct NmMboxData *mdata)
Get the database limit.
Definition notmuch.c:414
static bool read_threads_query(struct Mailbox *m, notmuch_query_t *q, bool dedup, int limit)
Perform a query with threads.
Definition notmuch.c:1044
static notmuch_query_t * get_query(struct Mailbox *m, bool writable)
Create a new query.
Definition notmuch.c:449
static bool read_mesgs_query(struct Mailbox *m, notmuch_query_t *q, bool dedup)
Search for matching messages.
Definition notmuch.c:974
static void progress_setup(struct Mailbox *m)
Set up the Progress Bar.
Definition notmuch.c:704
void progress_free(struct Progress **ptr)
Free a Progress Bar.
Definition progress.c:110
@ NM_QUERY_TYPE_UNKNOWN
Unknown query type. Error in notmuch query.
Definition query.h:36
@ NM_QUERY_TYPE_THREADS
Whole threads.
Definition query.h:38
@ NM_QUERY_TYPE_MESSAGES
Default: Messages only.
Definition query.h:37
Notmuch-specific Mailbox data -.
Definition mdata.h:35
+ Here is the call graph for this function:

◆ pop_mbox_open()

static enum MxOpenReturns pop_mbox_open ( struct Mailbox * m)
static

Open a Mailbox - Implements MxOps::mbox_open() -.

Fetch only headers

Definition at line 759 of file pop.c.

760{
761 if (!m->account)
762 return MX_OPEN_ERROR;
763
764 char buf[PATH_MAX] = { 0 };
765 struct ConnAccount cac = { { 0 } };
766 struct Url url = { 0 };
767
768 if (pop_parse_path(mailbox_path(m), &cac) != 0)
769 {
770 mutt_error(_("%s is an invalid POP path"), mailbox_path(m));
771 return MX_OPEN_ERROR;
772 }
773
774 account_to_url(&cac, &url);
775 url.path = NULL;
776 url_tostring(&url, buf, sizeof(buf), U_NONE);
777
778 buf_strcpy(&m->pathbuf, buf);
780
781 struct PopAccountData *adata = m->account->adata;
782 if (!adata)
783 {
785 m->account->adata = adata;
787 }
788
789 struct Connection *conn = adata->conn;
790 if (!conn)
791 {
792 adata->conn = mutt_conn_new(&cac);
793 conn = adata->conn;
794 if (!conn)
795 return MX_OPEN_ERROR;
796 }
797
798 if (conn->fd < 0)
800
801 if (pop_open_connection(adata) < 0)
802 return MX_OPEN_ERROR;
803
804 adata->bcache = mutt_bcache_open(&cac, NULL);
805
806 /* init (hard-coded) ACL rights */
808#ifdef USE_HCACHE
809 /* flags are managed using header cache, so it only makes sense to
810 * enable them in that case */
812#endif
813
814 while (true)
815 {
816 if (pop_reconnect(m) < 0)
817 return MX_OPEN_ERROR;
818
819 m->size = adata->size;
820
821 mutt_message(_("Fetching list of messages..."));
822
823 const int rc = pop_fetch_headers(m);
824
825 if (rc >= 0)
826 return MX_OPEN_OK;
827
828 if (rc < -1)
829 return MX_OPEN_ERROR;
830 }
831}
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition buffer.c:401
void pop_adata_free(void **ptr)
Free the private Account data - Implements Account::adata_free() -.
Definition adata.c:41
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition string.c:284
void account_to_url(struct ConnAccount *cac, struct Url *url)
Fill URL with info from account.
struct Connection * mutt_conn_new(const struct ConnAccount *cac)
Create a new Connection.
Definition mutt_socket.c:47
struct PopAccountData * pop_adata_new(void)
Create a new PopAccountData object.
Definition adata.c:63
int pop_open_connection(struct PopAccountData *adata)
Open connection and authenticate.
Definition lib.c:316
int pop_parse_path(const char *path, struct ConnAccount *cac)
Parse a POP mailbox name.
Definition lib.c:82
int pop_reconnect(struct Mailbox *m)
Reconnect and verify indexes if connection was lost.
Definition lib.c:609
static int pop_fetch_headers(struct Mailbox *m)
Read headers.
Definition pop.c:340
Login details for a remote server.
Definition connaccount.h:59
int fd
Socket file descriptor.
Definition connection.h:53
POP-specific Account data -.
Definition adata.h:37
size_t size
Mailbox size.
Definition adata.h:50
struct Connection * conn
Connection to POP server.
Definition adata.h:38
struct BodyCache * bcache
body cache
Definition adata.h:56
+ Here is the call graph for this function: