/** * lock_realpath - Try to lock the ctx->realpath * @param m Mailbox to lock * @param excl Lock exclusively? * @retval true Success (locked or readonly) * @retval false Error (can't lock the file) * * Try to (exclusively) lock the mailbox. If we succeed, then we mark the * mailbox as locked. If we fail, but we didn't want exclusive rights, then * the mailbox will be marked readonly. */ static bool lock_realpath(struct Mailbox *m, bool excl) { if (!m || !m->compress_info) return false; struct CompressInfo *ci = m->compress_info; if (ci->locked) return true; if (excl) ci->fp_lock = fopen(m->realpath, "a"); else ci->fp_lock = fopen(m->realpath, "r"); if (!ci->fp_lock) { mutt_perror(m->realpath); return false; } int r = mutt_file_lock(fileno(ci->fp_lock), excl, true); if (r == 0) ci->locked = true; else if (excl) { mutt_file_fclose(&ci->fp_lock); m->readonly = true; return true; } return r == 0; }
/** * mbox_lock_mailbox - Lock a mailbox * @param m Mailbox to lock * @param excl Exclusive lock? * @param retry Should retry if unable to lock? * @retval 0 Success * @retval -1 Failure */ static int mbox_lock_mailbox(struct Mailbox *m, bool excl, bool retry) { struct MboxAccountData *adata = mbox_adata_get(m); if (!adata) return -1; int rc = mutt_file_lock(fileno(adata->fp), excl, retry); if (rc == 0) adata->locked = true; else if (retry && !excl) { m->readonly = true; return 0; } return rc; }