static int maildir_parse_dir(CONTEXT *ctx, struct maildir ***last, const char *subdir, int *count) { DIR *dirp; struct dirent *de; char buf[_POSIX_PATH_MAX]; int is_old = 0; if(subdir) { snprintf(buf, sizeof(buf), "%s/%s", ctx->path, subdir); is_old = (mutt_strcmp("cur", subdir) == 0) && option(OPTMARKOLD); } else strfcpy(buf, ctx->path, sizeof(buf)); if((dirp = opendir(buf)) == NULL) return -1; while ((de = readdir (dirp)) != NULL) { if ((ctx->magic == M_MH && !mh_valid_message(de->d_name)) || (ctx->magic == M_MAILDIR && *de->d_name == '.')) continue; /* FOO - really ignore the return value? */ dprint(2, (debugfile, "%s:%d: parsing %s\n", __FILE__, __LINE__, de->d_name)); maildir_parse_entry(ctx, last, subdir, de->d_name, count, is_old); } closedir(dirp); return 0; }
/** * mh_mbox_check_stats - Implements MxOps::check_stats */ static int mh_mbox_check_stats(struct Mailbox *m, int flags) { struct MhSequences mhs = { 0 }; bool check_new = true; bool rc = false; DIR *dirp = NULL; struct dirent *de = NULL; /* when $mail_check_recent is set and the .mh_sequences file hasn't changed * since the last m visit, there is no "new mail" */ if (C_MailCheckRecent && (mh_sequences_changed(m) <= 0)) { rc = false; check_new = false; } if (!check_new) return 0; if (mh_read_sequences(&mhs, m->path) < 0) return false; m->msg_count = 0; m->msg_unread = 0; m->msg_flagged = 0; for (int i = mhs.max; i > 0; i--) { if ((mhs_check(&mhs, i) & MH_SEQ_FLAGGED)) m->msg_flagged++; if (mhs_check(&mhs, i) & MH_SEQ_UNSEEN) { m->msg_unread++; if (check_new) { /* if the first unseen message we encounter was in the m during the * last visit, don't notify about it */ if (!C_MailCheckRecent || (mh_already_notified(m, i) == 0)) { m->has_new = true; rc = true; } /* Because we are traversing from high to low, we can stop * checking for new mail after the first unseen message. * Whether it resulted in "new mail" or not. */ check_new = false; } } } mhs_free_sequences(&mhs); dirp = opendir(m->path); if (dirp) { while ((de = readdir(dirp))) { if (*de->d_name == '.') continue; if (mh_valid_message(de->d_name)) m->msg_count++; } closedir(dirp); } return rc; }